| PLearn 0.1 | 
A class for polled IO with PStreams. More...
#include <Poll.h>

| Public Member Functions | |
| void | setStreamsToWatch (const vector< PStream > &streams) | 
| int | waitForEvents (uint32_t timeout=0, bool shuffle_events_=false) | 
| PStream | getNextPendingEvent () | 
| Protected Attributes | |
| vector< PStream > | m_streams_to_watch | 
| The PStream's to watch for IO. | |
| vector< PRPollDesc > | m_poll_descriptors | 
| The underlying structure used by NSPR's PR_Poll to notify us of pending IO. | |
| unsigned int | m_next_unexamined_event | 
| Counter used to iterate through the m_poll_descriptors in getNextPendingEvent. | |
| int | last_n_poll_events | 
| bool | shuffle_events | 
| TVec< int > | shuffled_index | 
A class for polled IO with PStreams.
Currently supports only PrPStreamBufs.
| PStream PLearn::Poll::getNextPendingEvent | ( | ) | 
Definition at line 113 of file Poll.cc.
Referenced by PLearn::PLearnService::watchServers().
                                  {
    while (m_next_unexamined_event < m_poll_descriptors.size()) 
    {
        int i = m_next_unexamined_event++;
        if(shuffle_events)
            i= shuffled_index[i];
        if ((last_n_poll_events > 0 
             && m_poll_descriptors[i].out_flags & PR_POLL_READ)
            || !m_streams_to_watch[i]->inbufEmpty())
            return m_streams_to_watch[i];
    }
    PLERROR("Poll::getNextPendingEvent: called with no more pending events!");
    // We never reach this because of the PLERROR. Used to silence
    // a gcc warning.
    return PStream();
}

| void PLearn::Poll::setStreamsToWatch | ( | const vector< PStream > & | streams | ) | 
Definition at line 54 of file Poll.cc.
References i, PLearn::PrPStreamBuf::in, and PLERROR.
Referenced by PLearn::PLearnService::watchServers().
                                                           {
    m_streams_to_watch.clear();
    m_poll_descriptors.resize(streams.size());
    int i = 0;
    for (vector<PStream>::const_iterator it = streams.begin();
         it != streams.end(); ++it, ++i) 
    {
        PStreamBuf* st = *it;
        PrPStreamBuf* pr_st = dynamic_cast<PrPStreamBuf*>(st);
        if (!pr_st)
            PLERROR("Poll::setStreamsToWatch: only PrPStreamBuf streams supported!");
        m_streams_to_watch.push_back(*it);
        m_poll_descriptors[i].fd = pr_st->in;
        m_poll_descriptors[i].in_flags = PR_POLL_READ;
    }
}

Definition at line 74 of file Poll.cc.
References PLearn::getPrErrorString(), i, PLERROR, and PLearn::shuffleElements().
Referenced by PLearn::PLearnService::watchServers().
{
    if (m_poll_descriptors.size() == 0)
        PLERROR("Poll::waitforEvents: called with no streams to watch.");
    shuffle_events= shuffle_events_;
    if(shuffle_events)//shuffle index vec if necessary
    {
        shuffled_index= TVec<int>(0, m_poll_descriptors.size()-1, 1);
        shuffleElements(shuffled_index);
    }
    m_next_unexamined_event = 0;
    //first, check for non-empty buffers (ready to read)
    int nevents= 0;
    for(unsigned int i= 0; i < m_poll_descriptors.size(); ++i)
        if(!m_streams_to_watch[i]->inbufEmpty())
            ++nevents;
    if(nevents > 0)//if we already have some events, poll w/ no wait
        timeout= PR_INTERVAL_NO_WAIT;
    //poll underlying streams
    last_n_poll_events= PR_Poll(&m_poll_descriptors[0], PRIntn(m_poll_descriptors.size()), timeout);
    if(last_n_poll_events < 0)
        PLERROR((string("Poll::waitForEvents: poll error: ") + getPrErrorString()).c_str());
    nevents= 0;// now count _all_ events (non-empty buffers + stream polling)
    for(unsigned int i= 0; i < m_poll_descriptors.size(); ++i)
        if ((last_n_poll_events > 0 
             && m_poll_descriptors[i].out_flags & PR_POLL_READ)
            || !m_streams_to_watch[i]->inbufEmpty())
            ++nevents;
    return nevents;
}


| int PLearn::Poll::last_n_poll_events  [protected] | 
| unsigned int PLearn::Poll::m_next_unexamined_event  [protected] | 
| vector<PRPollDesc> PLearn::Poll::m_poll_descriptors  [protected] | 
| vector<PStream> PLearn::Poll::m_streams_to_watch  [protected] | 
| bool PLearn::Poll::shuffle_events  [protected] | 
| TVec<int> PLearn::Poll::shuffled_index  [protected] | 
 1.7.4
 1.7.4