Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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);
}
Example #4
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;
}
Example #5
0
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;
    
}