You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							216 lines
						
					
					
						
							7.5 KiB
						
					
					
				
			
		
		
	
	
							216 lines
						
					
					
						
							7.5 KiB
						
					
					
				'\" t
 | 
						|
.\"     Title: zpoller
 | 
						|
.\"    Author: [see the "AUTHORS" section]
 | 
						|
.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
 | 
						|
.\"      Date: 12/31/2016
 | 
						|
.\"    Manual: CZMQ Manual
 | 
						|
.\"    Source: CZMQ 4.0.2
 | 
						|
.\"  Language: English
 | 
						|
.\"
 | 
						|
.TH "ZPOLLER" "3" "12/31/2016" "CZMQ 4\&.0\&.2" "CZMQ Manual"
 | 
						|
.\" -----------------------------------------------------------------
 | 
						|
.\" * Define some portability stuff
 | 
						|
.\" -----------------------------------------------------------------
 | 
						|
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
.\" http://bugs.debian.org/507673
 | 
						|
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
 | 
						|
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
.ie \n(.g .ds Aq \(aq
 | 
						|
.el       .ds Aq '
 | 
						|
.\" -----------------------------------------------------------------
 | 
						|
.\" * set default formatting
 | 
						|
.\" -----------------------------------------------------------------
 | 
						|
.\" disable hyphenation
 | 
						|
.nh
 | 
						|
.\" disable justification (adjust text to left margin only)
 | 
						|
.ad l
 | 
						|
.\" -----------------------------------------------------------------
 | 
						|
.\" * MAIN CONTENT STARTS HERE *
 | 
						|
.\" -----------------------------------------------------------------
 | 
						|
.SH "NAME"
 | 
						|
zpoller \- trivial socket poller class
 | 
						|
.SH "SYNOPSIS"
 | 
						|
.sp
 | 
						|
.nf
 | 
						|
//  This is a stable class, and may not change except for emergencies\&. It
 | 
						|
//  is provided in stable builds\&.
 | 
						|
//  Create new poller, specifying zero or more readers\&. The list of
 | 
						|
//  readers ends in a NULL\&. Each reader can be a zsock_t instance, a
 | 
						|
//  zactor_t instance, a libzmq socket (void *), or a file handle\&.
 | 
						|
CZMQ_EXPORT zpoller_t *
 | 
						|
    zpoller_new (void *reader, \&.\&.\&.);
 | 
						|
 | 
						|
//  Destroy a poller
 | 
						|
CZMQ_EXPORT void
 | 
						|
    zpoller_destroy (zpoller_t **self_p);
 | 
						|
 | 
						|
//  Add a reader to be polled\&. Returns 0 if OK, \-1 on failure\&. The reader may
 | 
						|
//  be a libzmq void * socket, a zsock_t instance, or a zactor_t instance\&.
 | 
						|
CZMQ_EXPORT int
 | 
						|
    zpoller_add (zpoller_t *self, void *reader);
 | 
						|
 | 
						|
//  Remove a reader from the poller; returns 0 if OK, \-1 on failure\&. The reader
 | 
						|
//  must have been passed during construction, or in an zpoller_add () call\&.
 | 
						|
CZMQ_EXPORT int
 | 
						|
    zpoller_remove (zpoller_t *self, void *reader);
 | 
						|
 | 
						|
//  By default the poller stops if the process receives a SIGINT or SIGTERM
 | 
						|
//  signal\&. This makes it impossible to shut\-down message based architectures
 | 
						|
//  like zactors\&. This method lets you switch off break handling\&. The default
 | 
						|
//  nonstop setting is off (false)\&.
 | 
						|
CZMQ_EXPORT void
 | 
						|
    zpoller_set_nonstop (zpoller_t *self, bool nonstop);
 | 
						|
 | 
						|
//  Poll the registered readers for I/O, return first reader that has input\&.
 | 
						|
//  The reader will be a libzmq void * socket, or a zsock_t or zactor_t
 | 
						|
//  instance as specified in zpoller_new/zpoller_add\&. The timeout should be
 | 
						|
//  zero or greater, or \-1 to wait indefinitely\&. Socket priority is defined
 | 
						|
//  by their order in the poll list\&. If you need a balanced poll, use the low
 | 
						|
//  level zmq_poll method directly\&. If the poll call was interrupted (SIGINT),
 | 
						|
//  or the ZMQ context was destroyed, or the timeout expired, returns NULL\&.
 | 
						|
//  You can test the actual exit condition by calling zpoller_expired () and
 | 
						|
//  zpoller_terminated ()\&. The timeout is in msec\&.
 | 
						|
CZMQ_EXPORT void *
 | 
						|
    zpoller_wait (zpoller_t *self, int timeout);
 | 
						|
 | 
						|
//  Return true if the last zpoller_wait () call ended because the timeout
 | 
						|
//  expired, without any error\&.
 | 
						|
CZMQ_EXPORT bool
 | 
						|
    zpoller_expired (zpoller_t *self);
 | 
						|
 | 
						|
//  Return true if the last zpoller_wait () call ended because the process
 | 
						|
//  was interrupted, or the parent context was destroyed\&.
 | 
						|
CZMQ_EXPORT bool
 | 
						|
    zpoller_terminated (zpoller_t *self);
 | 
						|
 | 
						|
//  Self test of this class\&.
 | 
						|
CZMQ_EXPORT void
 | 
						|
    zpoller_test (bool verbose);
 | 
						|
 | 
						|
Please add \*(Aq@interface\*(Aq section in \*(Aq\&./\&.\&./src/zpoller\&.c\*(Aq\&.
 | 
						|
.fi
 | 
						|
.SH "DESCRIPTION"
 | 
						|
.sp
 | 
						|
The zpoller class provides a minimalist interface to ZeroMQ\(cqs zmq_poll API, for the very common case of reading from a number of sockets\&. It does not provide polling for output, nor polling on file handles\&. If you need either of these, use the zmq_poll API directly\&.
 | 
						|
.sp
 | 
						|
The class implements the poller using the zmq_poller API if that exists, else does the work itself\&.
 | 
						|
.SH "EXAMPLE"
 | 
						|
.PP
 | 
						|
\fBFrom zpoller_test method\fR. 
 | 
						|
.sp
 | 
						|
.if n \{\
 | 
						|
.RS 4
 | 
						|
.\}
 | 
						|
.nf
 | 
						|
//  Create a few sockets
 | 
						|
zsock_t *vent = zsock_new (ZMQ_PUSH);
 | 
						|
assert (vent);
 | 
						|
int port_nbr = zsock_bind (vent, "tcp://127\&.0\&.0\&.1:*");
 | 
						|
assert (port_nbr != \-1);
 | 
						|
zsock_t *sink = zsock_new (ZMQ_PULL);
 | 
						|
assert (sink);
 | 
						|
int rc = zsock_connect (sink, "tcp://127\&.0\&.0\&.1:%d", port_nbr);
 | 
						|
assert (rc != \-1);
 | 
						|
zsock_t *bowl = zsock_new (ZMQ_PULL);
 | 
						|
assert (bowl);
 | 
						|
zsock_t *dish = zsock_new (ZMQ_PULL);
 | 
						|
assert (dish);
 | 
						|
 | 
						|
//  Set up poller
 | 
						|
zpoller_t *poller = zpoller_new (bowl, dish, NULL);
 | 
						|
assert (poller);
 | 
						|
 | 
						|
// Add a reader to the existing poller
 | 
						|
rc = zpoller_add (poller, sink);
 | 
						|
assert (rc == 0);
 | 
						|
 | 
						|
zstr_send (vent, "Hello, World");
 | 
						|
 | 
						|
//  We expect a message only on the sink
 | 
						|
zsock_t *which = (zsock_t *) zpoller_wait (poller, \-1);
 | 
						|
assert (which == sink);
 | 
						|
assert (zpoller_expired (poller) == false);
 | 
						|
assert (zpoller_terminated (poller) == false);
 | 
						|
char *message = zstr_recv (which);
 | 
						|
assert (streq (message, "Hello, World"));
 | 
						|
zstr_free (&message);
 | 
						|
 | 
						|
//  Stop polling reader
 | 
						|
rc = zpoller_remove (poller, sink);
 | 
						|
assert (rc == 0);
 | 
						|
 | 
						|
//  Check we can poll an FD
 | 
						|
rc = zsock_connect (bowl, "tcp://127\&.0\&.0\&.1:%d", port_nbr);
 | 
						|
assert (rc != \-1);
 | 
						|
SOCKET fd = zsock_fd (bowl);
 | 
						|
rc = zpoller_add (poller, (void *) &fd);
 | 
						|
assert (rc != \-1);
 | 
						|
zstr_send (vent, "Hello again, world");
 | 
						|
assert (zpoller_wait (poller, 500) == &fd);
 | 
						|
 | 
						|
// Check zpoller_set_nonstop ()
 | 
						|
zsys_interrupted = 1;
 | 
						|
zpoller_wait (poller, 0);
 | 
						|
assert (zpoller_terminated (poller));
 | 
						|
zpoller_set_nonstop (poller, true);
 | 
						|
zpoller_wait (poller, 0);
 | 
						|
assert (!zpoller_terminated (poller));
 | 
						|
zsys_interrupted = 0;
 | 
						|
 | 
						|
zpoller_destroy (&poller);
 | 
						|
zsock_destroy (&vent);
 | 
						|
zsock_destroy (&sink);
 | 
						|
zsock_destroy (&bowl);
 | 
						|
zsock_destroy (&dish);
 | 
						|
 | 
						|
#ifdef ZMQ_SERVER
 | 
						|
//  Check thread safe sockets
 | 
						|
zpoller_destroy (&poller);
 | 
						|
zsock_t *client = zsock_new (ZMQ_CLIENT);
 | 
						|
assert (client);
 | 
						|
zsock_t *server = zsock_new (ZMQ_SERVER);
 | 
						|
assert (server);
 | 
						|
poller = zpoller_new (client, server, NULL);
 | 
						|
assert (poller);
 | 
						|
port_nbr = zsock_bind (server, "tcp://127\&.0\&.0\&.1:*");
 | 
						|
assert (port_nbr != \-1);
 | 
						|
rc = zsock_connect (client, "tcp://127\&.0\&.0\&.1:%d", port_nbr);
 | 
						|
assert (rc != \-1);
 | 
						|
 | 
						|
zstr_send (client, "Hello, World");
 | 
						|
 | 
						|
//  We expect a message only on the server
 | 
						|
which = (zsock_t *) zpoller_wait (poller, \-1);
 | 
						|
assert (which == server);
 | 
						|
assert (zpoller_expired (poller) == false);
 | 
						|
assert (zpoller_terminated (poller) == false);
 | 
						|
message = zstr_recv (which);
 | 
						|
assert (streq (message, "Hello, World"));
 | 
						|
zstr_free (&message);
 | 
						|
 | 
						|
zpoller_destroy (&poller);
 | 
						|
zsock_destroy (&client);
 | 
						|
zsock_destroy (&server);
 | 
						|
#endif
 | 
						|
.fi
 | 
						|
.if n \{\
 | 
						|
.RE
 | 
						|
.\}
 | 
						|
.sp
 | 
						|
.SH "AUTHORS"
 | 
						|
.sp
 | 
						|
The czmq manual was written by the authors in the AUTHORS file\&.
 | 
						|
.SH "RESOURCES"
 | 
						|
.sp
 | 
						|
Main web site: \m[blue]\fB\%\fR\m[]
 | 
						|
.sp
 | 
						|
Report bugs to the email <\m[blue]\fBzeromq\-dev@lists\&.zeromq\&.org\fR\m[]\&\s-2\u[1]\d\s+2>
 | 
						|
.SH "COPYRIGHT"
 | 
						|
.sp
 | 
						|
Copyright (c) the Contributors as noted in the AUTHORS file\&. This file is part of CZMQ, the high\-level C binding for 0MQ: http://czmq\&.zeromq\&.org\&. This Source Code Form is subject to the terms of the Mozilla Public License, v\&. 2\&.0\&. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla\&.org/MPL/2\&.0/\&. LICENSE included with the czmq distribution\&.
 | 
						|
.SH "NOTES"
 | 
						|
.IP " 1." 4
 | 
						|
zeromq-dev@lists.zeromq.org
 | 
						|
.RS 4
 | 
						|
\%mailto:zeromq-dev@lists.zeromq.org
 | 
						|
.RE
 | 
						|
 |