int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { struct pollfd *fds; int ret; fds = fds_alloc(nfds); if (!fds) return ERR(ENOMEM); select_to_rpoll(fds, &nfds, readfds, writefds, exceptfds); ret = rpoll(fds, nfds, rs_convert_timeout(timeout)); if (readfds) FD_ZERO(readfds); if (writefds) FD_ZERO(writefds); if (exceptfds) FD_ZERO(exceptfds); if (ret > 0) ret = rpoll_to_select(fds, nfds, readfds, writefds, exceptfds); return ret; }
void RsocketsTransmitter::operator()() { try { // send the messages cout << "Thread " << index << ": Sending messages..." << endl; int flags{0}; int sent; struct pollfd fds; fds.events = POLLOUT; fds.fd = sock; while(true) { int rc = rpoll(&fds, 1, -1); assert(rc != 1); MessageItem rawMsg; parentPool.msgQueue.wait_dequeue(rawMsg); if (rawMsg.first != nullptr && rawMsg.second != 0) { sent = rsend(sock, rawMsg.first, rawMsg.second, flags); assert(sent != -1); } else { break; } } cout << "Finished." << endl; } catch (const std::system_error &e) { std::cerr << e.what() << std::endl; return; } }
int poll(struct pollfd *fds, nfds_t nfds, int timeout) { struct pollfd *rfds; int i, ret; init_preload(); for (i = 0; i < nfds; i++) { if (fd_gett(fds[i].fd) == fd_rsocket) goto use_rpoll; } return real.poll(fds, nfds, timeout); use_rpoll: rfds = fds_alloc(nfds); if (!rfds) return ERR(ENOMEM); for (i = 0; i < nfds; i++) { rfds[i].fd = fd_getd(fds[i].fd); rfds[i].events = fds[i].events; rfds[i].revents = 0; } ret = rpoll(rfds, nfds, timeout); for (i = 0; i < nfds; i++) fds[i].revents = rfds[i].revents; return ret; }
void RsocketsReceiver::operator()() { parentPool.register_stats(&stats); try { int received; int new_sock; struct sockaddr_in client_addr; unsigned int client_addr_len; new_sock = accept(sock, (struct sockaddr *) &client_addr, &client_addr_len); assert(new_sock); // receive the message cout << "Thread " << index << ": Receiving messages..." << endl; struct pollfd fds; fds.events = POLLIN; fds.fd = new_sock; while(true) { int rc = rpoll(&fds, 1, -1); assert(rc != 1); received = rrecv(fds.fd, buffer, BUFFER_SIZE, flags); if (received) { cout << "received " << received << " bytes" << endl; hexdump(buffer, received); } } cout << "Finished." << endl; } catch (const std::system_error &e) { std::cerr << e.what() << std::endl; return; } std::this_thread::sleep_for(std::chrono::milliseconds(1000)); }