ssize_t CwxSocket::recv_n (CWX_HANDLE handle, void *buf, size_t len, CwxTimeouter *timeout, size_t* accepted) { size_t recv_byte = 0; ssize_t ret = 0; while(recv_byte < len) { if (timeout && timeout->isTimer()) { ret = handleReady(handle, timeout, true, false, false); if (ret <= 0) { ret = -1; break; } } ret = ::read(handle, ((char*)buf) + recv_byte, len - recv_byte); if ( (-1 == ret) && (EINTR == errno) ) continue; if (0 >= ret) break; recv_byte += ret; } if (accepted) *accepted = recv_byte; return ret>0?recv_byte:ret; }
ssize_t CwxSocket::send_n (CWX_HANDLE handle, void const*buf, size_t len, int flags, CwxTimeouter *timeout, size_t* sent) { size_t send_byte = 0; ssize_t ret = 0; while(send_byte < len) { if (timeout && timeout->isTimer()) { ret = handleReady(handle, timeout, false, true, false); if (ret <= 0) { ret = -1; break; } } ret = ::send(handle, ((char*)buf) + send_byte, len - send_byte, flags); if ( (-1 == ret) && (EINTR == errno) ) continue; if (0 >= ret) break; send_byte += ret; } if (sent) *sent = send_byte; return ret>0?send_byte:ret; }
ssize_t SocketStream::recv_n (void *buf, size_t len, const TimeValue *timeout , size_t *bytesTransferred ) { size_t temp; size_t &bt = bytesTransferred == 0 ? temp : *bytesTransferred; ssize_t n; ssize_t result = 0; int error = 0; enable(ACE_NONBLOCK); for (bt = 0; bt < len; bt += n) { // Try to transfer as much of the remaining data as possible. // Since the socket is in non-blocking mode, this call will not // block. n = OS::recv (m_handle, static_cast <char *> (buf) + bt, len - bt); // ICC_ERROR("recv_n, n = %d, errno = %d, toRecv = %d", n, errno, len - bt); // Check for errors. if (n == 0 || n == -1) { // Check for possible blocking. if (n == -1 && (errno == EWOULDBLOCK || errno == 0)) { // Wait upto <timeout> for the blocking to subside. int rtn = handleReady(m_handle, timeout, 1, 0, 0); // Did select() succeed? if (rtn != -1) { // Blocking subsided in <timeout> period. Continue // data transfer. n = 0; continue; } } // Wait in select() timed out or other data transfer or // select() failures. error = 1; result = n; // ICC_ERROR("recv_n error, result = %d, errno = %d", result, errno); break; } } if (error) return result; else return static_cast<ssize_t> (bt); }
bool HandleExecutionQueue::enqueue(QPndman::Handle* handle) { connect(handle, SIGNAL(done()), this, SLOT(handleReady())); connect(handle, SIGNAL(cancelled()), this, SLOT(handleReady())); connect(handle, SIGNAL(error(QString)), this, SLOT(handleReady())); if(currentlyExecuting < maxExecuting) { execute(handle); return false; } else { handles.enqueue(handle); return true; } }