MODULE = ZMQ::Raw               PACKAGE = ZMQ::Raw::Poller

SV *
new (class)
	SV *class

	PREINIT:
		zmq_raw_poller *poller = NULL;

	CODE:
		Newxz (poller, 1, zmq_raw_poller);
		Newxz (poller->items, 1, zmq_pollitem_t);
		ZMQ_NEW_OBJ (RETVAL, "ZMQ::Raw::Poller", poller);
		poller->sockets = newAV();

	OUTPUT: RETVAL

void
add (self, socket, events)
	SV *self
	SV *socket
	short events

	PREINIT:
		zmq_raw_poller *poller = NULL;
		zmq_raw_socket *sock;
		zmq_pollitem_t i;
		SSize_t size;

	CODE:
		poller = ZMQ_SV_TO_PTR (Poller, self);
		sock = ZMQ_SV_TO_PTR (Socket, socket);

		i.socket = sock->socket;
		i.events = events;
		i.revents = 0;

		size = av_len (poller->sockets)+1;
		Renew (poller->items, size+1, zmq_pollitem_t);
		Copy (&i, &poller->items[size], 1, zmq_pollitem_t);

		SvREFCNT_inc (SvRV (socket));
		av_push (poller->sockets, SvRV (socket));

void
wait (self, timeout)
	SV *self
	long timeout

	PREINIT:
		int rc, i, count = 0;
		zmq_raw_poller *poller = NULL;
		SSize_t size;

	CODE:
		poller = ZMQ_SV_TO_PTR (Poller, self);

		size = av_len (poller->sockets)+1;
		rc = zmq_poll (poller->items, size, timeout);
		zmq_raw_check_error (rc);

		for (i = 0; i < size; ++i)
		{
			if (poller->items[i].revents)
				++count;
		}

		XSRETURN_IV (count);



void
events(self, socket)
	SV *self
	SV *socket

	PREINIT:
		zmq_raw_poller *poller = NULL;
		void *s = NULL;

		SSize_t i, size;

	CODE:
		poller = ZMQ_SV_TO_PTR (Poller, self);
		size = av_len (poller->sockets)+1;

		for (i = 0; i < size; ++i)
		{
			SV **item = av_fetch (poller->sockets, i, 0);
			if (item && *item && SvRV (socket) == *item)
			{
				XSRETURN_IV (poller->items[i].revents);
			}
		}

		XSRETURN_UNDEF;

void
DESTROY (self)
	SV *self

	PREINIT:
		zmq_raw_poller *poller;
		SV *item;

	CODE:
		poller = ZMQ_SV_TO_PTR (Poller, self);

		av_undef (poller->sockets);
		Safefree (poller);