ProtocolEvent ProtocolUDPGeneric::waitForEvent( DataObjectRef &dObj, Timeval *timeout, bool writeevent) { QueueElement *qe = NULL; Queue *q = getQueue(); if (!q) { return PROT_EVENT_ERROR; } SocketWrapper *sock = getReadEndOfReceiveSocket(); if (NULL == sock) { HAGGLE_ERR("%s Null receive socket\n", getName()); return PROT_EVENT_ERROR_FATAL; } HAGGLE_DBG("%s Waiting for queue element or timeout... %s\n", getName(), timeout->getAsString().c_str()); QueueEvent_t qev = q->retrieve(&qe, sock->getSOCKET(), timeout, writeevent); if (QUEUE_ELEMENT == qev) { dObj = qe->getDataObject(); delete qe; return PROT_EVENT_TXQ_NEW_DATAOBJECT; } if (QUEUE_EMPTY == qev) { return PROT_EVENT_TXQ_EMPTY; } if (QUEUE_WATCH_WRITE == qev) { return PROT_EVENT_WRITEABLE; } if (QUEUE_WATCH_ABANDONED == qev) { // SW: this occurs when the protocol has been shutdown via some other // mechanism, such as interface down HAGGLE_DBG("%s Waiting for event abandoned\n", getName()); return PROT_EVENT_SHOULD_EXIT; } if (QUEUE_TIMEOUT == qev) { HAGGLE_DBG("%s Waiting for event timeout\n", getName()); return PROT_EVENT_TIMEOUT; } if (QUEUE_WATCH_READ == qev) { return PROT_EVENT_INCOMING_DATA; } HAGGLE_ERR("%s Waiting for event unknown error\n", getName()); return PROT_EVENT_ERROR; }