int BufferedOS::writevEx(IOVec &vec, int avoidCache) { assert(m_pOS != NULL); int ret; if (!m_buf.empty()) { int oldLen = vec.len(); m_buf.iovInsert(vec); //TEST: DEBUG Code //ret = 0; ret = m_pOS->writev(vec.get(), vec.len()); vec.pop_front(vec.len() - oldLen); if (ret > 0) { int pop = ret; if (pop > m_buf.size()) pop = m_buf.size(); m_buf.pop_front(pop); ret -= pop; } } else //TEST: DEBUG Code //ret = 0; ret = m_pOS->writev(vec.get(), vec.len()); if (ret >= avoidCache) ret = m_buf.cache(vec.get(), vec.len(), ret); //LS_DBG_H( "bufferedOS::writev() return %d, %d bytes in cache\n", ret, m_buf.size()); return ret; }
int BufferedOS::writevEx( IOVec &vec, int avoidCache ) { assert( m_pOS != NULL ); int ret; if ( !m_buf.empty() ) { int oldLen = vec.len(); m_buf.iov_insert( vec ); //FIXME: DEBUG Code //ret = 0; ret = m_pOS->writev( vec.get(), vec.len() ); vec.pop_front( vec.len() - oldLen ); if ( ret > 0 ) { int pop = ret; if ( pop > m_buf.size() ) pop = m_buf.size(); m_buf.pop_front( pop ); ret -= pop; } } else //FIXME: DEBUG Code //ret = 0; ret = m_pOS->writev( vec.get(), vec.len() ); if ( ret >= avoidCache ) { ret = m_buf.cache( vec.get(), vec.len(), ret ); } //if ( D_ENABLED( DL_MORE ) ) // LOG_D(( "bufferedOS::writev() return %d, %d bytes in cache\n", ret, m_buf.size() )); return ret; }
int BufferedOS::cacheWritev(IOVec &vector, int total) { if (m_buf.size() + total < 40960) { m_buf.cache(vector.get(), vector.len(), 0); return total; } else return writevEx(vector, 0); }
int BufferedOS::flush() { assert(m_pOS != NULL); int ret = 0; if (!m_buf.empty()) { IOVec iov; m_buf.getIOvec(iov); ret = m_pOS->writev(iov.get(), iov.len()); if (ret >= 0) { if (m_buf.size() <= ret) m_buf.clear(); else m_buf.pop_front(ret); // LS_DBG_H( "bufferedOS::flush() writen %d, %d bytes in cache\n", // ret, m_buf.size()); ret = m_buf.size(); } } return ret; }
int CacheOS::cacheWritev( IOVec &vec, int total, int * pRet) { int ret = 0; int bufSize; int written = 0; int count = vec.len(); const struct iovec * vector = vec.get(); for( ; count > 0; --count, ++vector ) { const char * pBuf =( const char *) vector->iov_base; bufSize = vector->iov_len; if (( pBuf != NULL )&&( bufSize > 0 )) written = cacheWrite( pBuf, bufSize, pRet ); if ( written > 0 ) ret += written; if ( ret < 0 ) break; if ( written < bufSize ) break; } return ret; }