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