void zloop_test (bool verbose) { printf (" * zloop: "); int rc = 0; // @selftest // Create two PAIR sockets and connect over inproc zsock_t *output = zsock_new (ZMQ_PAIR); assert (output); zsock_bind (output, "inproc://zloop.test"); zsock_t *input = zsock_new (ZMQ_PAIR); assert (input); zsock_connect (input, "inproc://zloop.test"); zloop_t *loop = zloop_new (); assert (loop); zloop_set_verbose (loop, verbose); // Create a timer that will be cancelled int timer_id = zloop_timer (loop, 1000, 1, s_timer_event, NULL); zloop_timer (loop, 5, 1, s_cancel_timer_event, &timer_id); // After 20 msecs, send a ping message to output3 zloop_timer (loop, 20, 1, s_timer_event, output); // Set up some tickets that will never expire zloop_set_ticket_delay (loop, 10000); void *ticket1 = zloop_ticket (loop, s_timer_event, NULL); void *ticket2 = zloop_ticket (loop, s_timer_event, NULL); void *ticket3 = zloop_ticket (loop, s_timer_event, NULL); // When we get the ping message, end the reactor rc = zloop_reader (loop, input, s_socket_event, NULL); assert (rc == 0); zloop_reader_set_tolerant (loop, input); zloop_start (loop); zloop_ticket_delete (loop, ticket1); zloop_ticket_delete (loop, ticket2); zloop_ticket_delete (loop, ticket3); zloop_destroy (&loop); assert (loop == NULL); zsock_destroy (&input); zsock_destroy (&output); // @end printf ("OK\n"); }
int main (void) { clonesrv_t *self = (clonesrv_t *) zmalloc (sizeof (clonesrv_t)); self->port = 5556; self->ctx = zctx_new (); self->kvmap = zhash_new (); self->loop = zloop_new (); zloop_set_verbose (self->loop, FALSE); // Set up our clone server sockets self->snapshot = zsocket_new (self->ctx, ZMQ_ROUTER); self->publisher = zsocket_new (self->ctx, ZMQ_PUB); self->collector = zsocket_new (self->ctx, ZMQ_PULL); zsocket_bind (self->snapshot, "tcp://*:%d", self->port); zsocket_bind (self->publisher, "tcp://*:%d", self->port + 1); zsocket_bind (self->collector, "tcp://*:%d", self->port + 2); // Register our handlers with reactor zmq_pollitem_t poller = { self->snapshot, 0, ZMQ_POLLIN }; zloop_poller (self->loop, &poller, s_snapshots, self); poller.socket = self->collector; zloop_poller (self->loop, &poller, s_collector, self); zloop_timer (self->loop, 1000, 0, s_flush_ttl, self); // Run reactor until process interrupted zloop_start (self->loop); zloop_destroy (&self->loop); zhash_destroy (&self->kvmap); zctx_destroy (&self->ctx); free (self); return 0; }
bstar_t * bstar_new (int primary, char *local, char *remote) { bstar_t *self; self = (bstar_t *) zmalloc (sizeof (bstar_t)); // Initialize the Binary Star self->ctx = zctx_new (); self->loop = zloop_new (); self->state = primary? STATE_PRIMARY: STATE_BACKUP; // Create publisher for state going to peer self->statepub = zsocket_new (self->ctx, ZMQ_PUB); zsocket_bind (self->statepub, local); // Create subscriber for state coming from peer self->statesub = zsocket_new (self->ctx, ZMQ_SUB); zsocket_set_subscribe (self->statesub, ""); zsocket_connect (self->statesub, remote); // Set-up basic reactor events zloop_timer (self->loop, BSTAR_HEARTBEAT, 0, s_send_state, self); zmq_pollitem_t poller = { self->statesub, 0, ZMQ_POLLIN }; zloop_poller (self->loop, &poller, s_recv_state, self); return self; }
static int s_peering_activity (zloop_t *loop, zmq_pollitem_t *item, void *arg) { peering_t *peering = (peering_t *) arg; vocket_t *vocket = peering->vocket; driver_t *driver = peering->driver; if (peering->alive) { if (item->revents & ZMQ_POLLERR) { if (driver->verbose) zclock_log ("I: (tcp) peering alive/error %s", peering->address); peering->exception = TRUE; } else if (item->revents & ZMQ_POLLIN) { if (driver->verbose) zclock_log ("I: (tcp) peering alive/input %s", peering->address); s_recv_wire (peering); } else if (item->revents & ZMQ_POLLOUT) { if (driver->verbose) zclock_log ("I: (tcp) peering alive/output %s", peering->address); s_send_wire (peering); } } else if (peering->outgoing) { if (item->revents & ZMQ_POLLERR) { if (driver->verbose) zclock_log ("I: (tcp) peering dead/error %s", peering->address); peering->exception = TRUE; } else if (item->revents & ZMQ_POLLIN || item->revents & ZMQ_POLLOUT) { if (driver->verbose) zclock_log ("I: (tcp) peering dead/inout %s", peering->address); peering_poller (peering, ZMQ_POLLIN); peering_raise (peering); } } // Handle exception peering by switching to monitoring, or killing it if (peering->exception) { peering_lower (peering); if (peering->outgoing) { close (peering->handle); peering_poller (peering, 0); peering->handle = 0; zloop_timer (loop, peering->interval, 1, s_peering_monitor, peering); } else peering_destroy (&peering); } return 0; }
void start_loop(int count) { zloop_t *loop = zloop_new(); assert(loop); zmq_pollitem_t poll_socket = { dealer, 0, ZMQ_POLLIN, 0 }; zloop_poller ( loop, &poll_socket, event, NULL); zloop_timer(loop, 1000, 0, sleep_loop, &count); zloop_timer(loop, 1000, 0, info_loop, &count); struct timeval tv; gettimeofday(&tv,NULL); start = (uint64_t)tv.tv_sec; zloop_start (loop); return; }
static int s_timer_event5 (zloop_t *loop, int timer_id, void *arg) { // remove reader from loop zloop_reader_end(loop, (zsock_t *) arg); // end reactor on next run zloop_timer(loop, 1, 1, s_timer_event4, NULL); return 0; }
int main(int argc, char const * const *argv) { int rc; zsys_set_sndhwm(1); zsys_set_linger(100); void *pusher = zsock_new(ZMQ_PUSH); assert(pusher); zsock_set_sndhwm(pusher, 1000); zsock_set_linger(pusher, 500); rc = zsock_connect(pusher, "tcp://localhost:12345"); assert(rc==0); void *puller = zsock_new(ZMQ_PULL); assert(puller); zsock_set_rcvhwm(puller, 1000); zsock_set_linger(puller, 500); rc = zsock_bind(puller, "tcp://*:12345"); if (rc != 12345){ printf("bind failed: %s\n", zmq_strerror(errno)); } assert(rc == 12345); void *publisher = zsock_new(ZMQ_PUB); assert(publisher); zsock_set_sndhwm(publisher, 1000); zsock_set_linger(publisher, 500); rc = zsock_bind(publisher, "tcp://*:12346"); assert(rc==12346); // set up event loop zloop_t *loop = zloop_new(); assert(loop); zloop_set_verbose(loop, 0); // push data every 10 ms rc = zloop_timer(loop, 1, 0, timer_event, pusher); assert(rc != -1); zmq_pollitem_t item; item.socket = puller; item.events = ZMQ_POLLIN; rc = zloop_poller(loop, &item, forward, publisher); assert(rc == 0); rc = zloop_start(loop); printf("zloop return: %d", rc); zloop_destroy(&loop); assert(loop == NULL); return 0; }
void zloop_test (bool verbose) { printf (" * zloop: "); int rc = 0; // @selftest zctx_t *ctx = zctx_new (); assert (ctx); void *output = zsocket_new (ctx, ZMQ_PAIR); assert (output); zsocket_bind (output, "inproc://zloop.test"); void *input = zsocket_new (ctx, ZMQ_PAIR); assert (input); zsocket_connect (input, "inproc://zloop.test"); zloop_t *loop = zloop_new (); assert (loop); zloop_set_verbose (loop, verbose); // Create a timer that will be canceled int timer_id = zloop_timer (loop, 1000, 1, s_timer_event, NULL); zloop_timer (loop, 5, 1, s_cancel_timer_event, &timer_id); // After 20 msecs, send a ping message to output zloop_timer (loop, 20, 1, s_timer_event, output); // When we get the ping message, end the reactor zmq_pollitem_t poll_input = { input, 0, ZMQ_POLLIN }; rc = zloop_poller (loop, &poll_input, s_socket_event, NULL); assert (rc == 0); zloop_set_tolerant (loop, &poll_input); zloop_start (loop); zloop_destroy (&loop); assert (loop == NULL); zctx_destroy (&ctx); // @end printf ("OK\n"); }
void ticket_hid_printer(zsock_t *pipe, void *arg) { char *device_path = (char *) arg; ticket_printer_t *self = s_new(pipe, device_path); zsock_signal(self->pipe, 0); int main_timer_id = zloop_timer(self->loop, 300, 0, timer_main_loop, self); zloop_reader(self->loop, self->pipe, reader_pipe_event, self); zloop_start(self->loop); zloop_timer_end(self->loop, main_timer_id); zloop_reader_end(self->loop, self->pipe); s_destroy(&self); }
void ticket_serial_printer(zsock_t *pipe, void *arg) { char *port = (char *) arg; ticket_printer_t *self = s_new_serial(pipe, port); zsock_signal(self->pipe, 0); int main_serial_id = zloop_timer(self->loop, 300, 0, timer_main_serial_loop, self); zloop_reader(self->loop, self->pipe, reader_pipe_event, self); zloop_start(self->loop); zloop_reader_end(self->loop, self->pipe); zloop_timer_end(self->loop, main_serial_id); s_destroy(&self); }
int main (int argc, char** argv) { int port = 5556; #ifdef FF_USE_LIBGC GC_INIT(); set_program_name (argv[0]); #endif if( argc >= 2 ) port = atoi( argv[1] ); clonesrv_t *self = (clonesrv_t *) zmalloc (sizeof (clonesrv_t)); self->port = port; self->ctx = zctx_new (); self->kvmap = zhash_new (); self->loop = zloop_new (); zloop_set_verbose (self->loop, false); // Set up our clone server sockets self->snapshot = zsocket_new (self->ctx, ZMQ_ROUTER); zsocket_bind (self->snapshot, "tcp://*:%d", self->port + socket_srv_offset_snapshot ); self->publisher = zsocket_new (self->ctx, ZMQ_PUB); zsocket_bind (self->publisher, "tcp://*:%d", self->port + socket_srv_offset_publisher ); self->collector = zsocket_new (self->ctx, ZMQ_PULL); zsocket_bind (self->collector, "tcp://*:%d", self->port + socket_srv_offset_collector ); self->ping = zsocket_new (self->ctx, ZMQ_REP); zsocket_bind (self->ping, "tcp://*:%d", self->port + socket_srv_offset_ping ); // Register our handlers with reactor zmq_pollitem_t poller = { 0, 0, ZMQ_POLLIN }; poller.socket = self->snapshot; zloop_poller (self->loop, &poller, s_snapshots, self); poller.socket = self->collector; zloop_poller (self->loop, &poller, s_collector, self); zloop_timer (self->loop, 1000, 0, s_flush_ttl, self); poller.socket = self->ping; zloop_poller (self->loop, &poller, s_ping, self); DEBUG ("I: server up and running on port:%d...", port ); // Run reactor until process interrupted zloop_start (self->loop); zloop_destroy (&self->loop); zhash_destroy (&self->kvmap); zctx_destroy (&self->ctx); free (self); return 0; }
static int send_tick_commands(zloop_t *loop, int timer_id, void *arg) { controller_state_t *state = arg; // send tick commands to actors to let them print out their stats zstr_send(state->subscriber, "tick"); zstr_send(state->writer, "tick"); int rc = zloop_timer(loop, 1000, 1, send_tick_commands, state); assert(rc != -1); return 0; }
int graylog_forwarder_run_controller_loop(zconfig_t* config, zlist_t* devices, zlist_t *subscriptions, int rcv_hwm, int send_hwm) { set_thread_name("controller"); zsys_init(); controller_state_t state = {.config = config}; bool start_up_complete = controller_create_actors(&state, devices, subscriptions, rcv_hwm, send_hwm); if (!start_up_complete) goto exit; // set up event loop zloop_t *loop = zloop_new(); assert(loop); zloop_set_verbose(loop, 0); // send tick commands every second int rc = zloop_timer(loop, 1000, 1, send_tick_commands, &state); assert(rc != -1); // run the loop // when running under the google profiler, zmq_poll terminates with EINTR // so we keep the loop running in this case if (!zsys_interrupted) { bool should_continue_to_run = getenv("CPUPROFILE") != NULL; do { rc = zloop_start(loop); should_continue_to_run &= errno == EINTR && !zsys_interrupted; log_zmq_error(rc, __FILE__, __LINE__); } while (should_continue_to_run); } printf("[I] controller: shutting down\n"); // shutdown zloop_destroy(&loop); assert(loop == NULL); exit: printf("[I] controller: destroying actor threads\n"); controller_destroy_actors(&state); printf("[I] controller: calling zsys_shutdown\n"); zsys_shutdown(); printf("[I] controller: terminated\n"); return 0; }
static int s_zdir_watch_timeout (zdir_watch_t *watch, int timeout) { if (watch->verbose) zsys_info ("zdir_watch: Setting directory poll timeout to %d", timeout); if (watch->read_timer_id != -1) { zloop_timer_end (watch->loop, watch->read_timer_id); watch->read_timer_id = -1; } watch->read_timer_id = zloop_timer (watch->loop, timeout, 0, s_on_read_timer, watch); if (watch->verbose) zsys_info ("zdir_watch: Successfully set directory poll timeout to %d", timeout); return 0; }
static int s_peering_monitor (zloop_t *loop, zmq_pollitem_t *item, void *arg) { peering_t *peering = (peering_t *) arg; vocket_t *vocket = peering->vocket; driver_t *driver = peering->driver; // The peering monitor handles just outgoing peering reconnect // attempts. It'll keep trying until successful. assert (peering->outgoing); peering->exception = FALSE; if (peering->alive) return 0; // Stop monitor if peering came alive if (driver->verbose) zclock_log ("I: (tcp) connecting to '%s'...", peering->address); peering->handle = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); if (peering->handle == -1) { zclock_log ("E: connect failed: no sockets - %s", strerror (errno)); goto error; } s_set_nonblock (peering->handle); if (s_str_to_sin_addr (&peering->addr, peering->address)) { zclock_log ("E: connect failed: bad address '%s'", peering->address); goto error; } int rc = connect (peering->handle, (const struct sockaddr *) &peering->addr, IN_ADDR_SIZE); if (rc == -1 && errno != EINPROGRESS) { zclock_log ("E: connect failed: '%s'", strerror (errno)); goto error; } peering_poller (peering, ZMQ_POLLIN + ZMQ_POLLOUT); return 0; error: if (peering->handle > 0) { close (peering->handle); peering->handle = 0; } // Try again later zloop_timer (loop, peering->interval, 1, s_peering_monitor, peering); return 0; }
void watchdog(zsock_t *pipe, void *args) { set_thread_name("watchdog[0]"); int rc; watchdog_state_t state = { .credit = CREDIT, .received_term_cmd = false }; // signal readyiness zsock_signal(pipe, 0); // set up event loop zloop_t *loop = zloop_new(); assert(loop); zloop_set_verbose(loop, 0); // we rely on the controller shutting us down zloop_ignore_interrupts(loop); // decrease credit every second rc = zloop_timer(loop, 1000, 0, timer_event, &state); assert(rc != -1); // setup handler for actor messages rc = zloop_reader(loop, pipe, actor_command, &state); assert(rc == 0); // run the loop bool should_continue_to_run = getenv("CPUPROFILE") != NULL; do { rc = zloop_start(loop); should_continue_to_run &= errno == EINTR; if (!state.received_term_cmd) log_zmq_error(rc, __FILE__, __LINE__); } while (should_continue_to_run); if (!quiet) printf("[I] watchdog[0]: shutting down\n"); // shutdown zloop_destroy(&loop); assert(loop == NULL); if (!quiet) printf("[I] watchdog[0]: terminated\n"); }
/* PUB tcp://*:9003 << [ "(?stock:[A-Z][A-Z0-9]+)" ] [ timestamp :f64 ] [ price :f64 ] */ int main(int argc, const char* argv[]) { SetConsoleTitle(L"tickz.server"); // initialize random number generator srand( (unsigned int)time(NULL) ); // initialize stock data tick_t msft = tick_new("MSFT", 41.78); tick_t aapl = tick_new("AAPL", 95.35); tick_t goog = tick_new("GOOG",571.09); tick_t yhoo = tick_new("YHOO", 34.53); tick_t bbry = tick_new("BBRY", 10.90); zlist_t *stocks = zlist_new(); zlist_append(stocks,&msft); zlist_append(stocks,&aapl); zlist_append(stocks,&goog); zlist_append(stocks,&yhoo); zlist_append(stocks,&bbry); // set up publisher zctx_t *ctx = zctx_new(); void *pub = zsocket_new(ctx,ZMQ_PUB); zsocket_bind(pub,"tcp://*:9003"); // set up main loop zloop_t *loop = zloop_new(); zloop_data_t loopdata; loopdata.stocks = stocks; loopdata.socket = pub; // every 500 ms, update the stocks and publish the new data int timer = zloop_timer(loop,500,0,onloop,&loopdata); //TOOD: take delay as input zloop_start(loop); //NOTE: CTRL+C will cleanly interrupt the infinite loop // clean up zctx_destroy(&ctx); zlist_destroy(&stocks); return 0; }
bstar_t * bstar_new(int primary, char *local, char *remote) { bstar_t *self; self = (bstar_t *)zmalloc(sizeof(bstar_t)); self->ctx = zctx_new(); self->loop = zloop_new(); self->state = primary ? STATE_PRIMARY : STATE_BACKUP; self->statepub = zsocket_new(self->ctx, ZMQ_PUB); zsocket_bind(self->statepub, local); self->statesub = zsocket_new(self->ctx, ZMQ_SUB); zsocket_set_subscribe(self->statesub, ""); zsocket_connect(self->statesub, remote); zloop_timer(self->loop, BSTAR_HEARTBEAT, 0, s_send_state, self); zmq_pollitem_t poller = {self->statesub, 0, ZMQ_POLLIN}; zloop_poller(self->loop, &poller, s_recv_state, self); return self; }
int main(int argc, char * const *argv) { int rc = 0; process_arguments(argc, argv); setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stderr, NULL, _IOLBF, 0); if (!quiet) printf("[I] started %s\n" "[I] sub-port: %d\n" "[I] push-port: %d\n" "[I] io-threads: %lu\n" "[I] rcv-hwm: %d\n" "[I] snd-hwm: %d\n" , argv[0], pull_port, pub_port, io_threads, rcv_hwm, snd_hwm); // load config config_file_exists = zsys_file_exists(config_file_name); if (config_file_exists) { config_file_init(); config = zconfig_load((char*)config_file_name); } // set global config zsys_init(); zsys_set_rcvhwm(10000); zsys_set_sndhwm(10000); zsys_set_pipehwm(1000); zsys_set_linger(100); zsys_set_io_threads(io_threads); // create socket to receive messages on zsock_t *receiver = zsock_new(ZMQ_SUB); assert_x(receiver != NULL, "sub socket creation failed", __FILE__, __LINE__); zsock_set_rcvhwm(receiver, rcv_hwm); // bind externally char* host = zlist_first(hosts); while (host) { if (!quiet) printf("[I] connecting to: %s\n", host); rc = zsock_connect(receiver, "%s", host); assert_x(rc == 0, "sub socket connect failed", __FILE__, __LINE__); host = zlist_next(hosts); } tracker = device_tracker_new(hosts, receiver); // create socket for publishing zsock_t *publisher = zsock_new(ZMQ_PUSH); assert_x(publisher != NULL, "pub socket creation failed", __FILE__, __LINE__); zsock_set_sndhwm(publisher, snd_hwm); rc = zsock_bind(publisher, "tcp://%s:%d", "*", pub_port); assert_x(rc == pub_port, "pub socket bind failed", __FILE__, __LINE__); // create compressor sockets zsock_t *compressor_input = zsock_new(ZMQ_PUSH); assert_x(compressor_input != NULL, "compressor input socket creation failed", __FILE__, __LINE__); rc = zsock_bind(compressor_input, "inproc://compressor-input"); assert_x(rc==0, "compressor input socket bind failed", __FILE__, __LINE__); zsock_t *compressor_output = zsock_new(ZMQ_PULL); assert_x(compressor_output != NULL, "compressor output socket creation failed", __FILE__, __LINE__); rc = zsock_bind(compressor_output, "inproc://compressor-output"); assert_x(rc==0, "compressor output socket bind failed", __FILE__, __LINE__); // create compressor agents zactor_t *compressors[MAX_COMPRESSORS]; for (size_t i = 0; i < num_compressors; i++) compressors[i] = message_decompressor_new(i); // set up event loop zloop_t *loop = zloop_new(); assert(loop); zloop_set_verbose(loop, 0); // calculate statistics every 1000 ms int timer_id = zloop_timer(loop, 1000, 0, timer_event, NULL); assert(timer_id != -1); // setup handler for the receiver socket publisher_state_t publisher_state = { .receiver = zsock_resolve(receiver), .publisher = zsock_resolve(publisher), .compressor_input = zsock_resolve(compressor_input), .compressor_output = zsock_resolve(compressor_output), }; // setup handler for compression results rc = zloop_reader(loop, compressor_output, read_zmq_message_and_forward, &publisher_state); assert(rc == 0); zloop_reader_set_tolerant(loop, compressor_output); // setup handdler for messages incoming from the outside or rabbit_listener rc = zloop_reader(loop, receiver, read_zmq_message_and_forward, &publisher_state); assert(rc == 0); zloop_reader_set_tolerant(loop, receiver); // initialize clock global_time = zclock_time(); // setup subscriptions if (subscriptions == NULL || zlist_size(subscriptions) == 0) { if (!quiet) printf("[I] subscribing to all log messages\n"); zsock_set_subscribe(receiver, ""); } else { char *subscription = zlist_first(subscriptions); while (subscription) { if (!quiet) printf("[I] subscribing to %s\n", subscription); zsock_set_subscribe(receiver, subscription); subscription = zlist_next(subscriptions); } zsock_set_subscribe(receiver, "heartbeat"); } // run the loop if (!zsys_interrupted) { if (verbose) printf("[I] starting main event loop\n"); bool should_continue_to_run = getenv("CPUPROFILE") != NULL; do { rc = zloop_start(loop); should_continue_to_run &= errno == EINTR && !zsys_interrupted; log_zmq_error(rc, __FILE__, __LINE__); } while (should_continue_to_run); if (verbose) printf("[I] main event zloop terminated with return code %d\n", rc); } zloop_destroy(&loop); assert(loop == NULL); if (!quiet) { printf("[I] received %zu messages\n", received_messages_count); printf("[I] shutting down\n"); } zlist_destroy(&hosts); zlist_destroy(&subscriptions); zsock_destroy(&receiver); zsock_destroy(&publisher); zsock_destroy(&compressor_input); zsock_destroy(&compressor_output); device_tracker_destroy(&tracker); for (size_t i = 0; i < num_compressors; i++) zactor_destroy(&compressors[i]); zsys_shutdown(); if (!quiet) printf("[I] terminated\n"); return rc; }
int main (int argc, char *argv []) { clonesrv_t *self = (clonesrv_t *) zmalloc (sizeof (clonesrv_t)); if (argc == 2 && streq (argv [1], "-p")) { zclock_log ("I: primary master, waiting for backup (slave)"); self->bstar = bstar_new (BSTAR_PRIMARY, "tcp://*:5003", "tcp://localhost:5004"); bstar_voter (self->bstar, "tcp://*:5556", ZMQ_ROUTER, s_snapshots, self); self->port = 5556; self->peer = 5566; self->primary = TRUE; } else if (argc == 2 && streq (argv [1], "-b")) { zclock_log ("I: backup slave, waiting for primary (master)"); self->bstar = bstar_new (BSTAR_BACKUP, "tcp://*:5004", "tcp://localhost:5003"); bstar_voter (self->bstar, "tcp://*:5566", ZMQ_ROUTER, s_snapshots, self); self->port = 5566; self->peer = 5556; self->primary = FALSE; } else { printf ("Usage: clonesrv4 { -p | -b }\n"); free (self); exit (0); } // Primary server will become first master if (self->primary) self->kvmap = zhash_new (); self->ctx = zctx_new (); self->pending = zlist_new (); bstar_set_verbose (self->bstar, TRUE); // Set up our clone server sockets self->publisher = zsocket_new (self->ctx, ZMQ_PUB); self->collector = zsocket_new (self->ctx, ZMQ_SUB); zsockopt_set_subscribe (self->collector, ""); zsocket_bind (self->publisher, "tcp://*:%d", self->port + 1); zsocket_bind (self->collector, "tcp://*:%d", self->port + 2); // Set up our own clone client interface to peer self->subscriber = zsocket_new (self->ctx, ZMQ_SUB); zsockopt_set_subscribe (self->subscriber, ""); zsocket_connect (self->subscriber, "tcp://localhost:%d", self->peer + 1); // Register state change handlers bstar_new_master (self->bstar, s_new_master, self); bstar_new_slave (self->bstar, s_new_slave, self); // Register our other handlers with the bstar reactor zmq_pollitem_t poller = { self->collector, 0, ZMQ_POLLIN }; zloop_poller (bstar_zloop (self->bstar), &poller, s_collector, self); zloop_timer (bstar_zloop (self->bstar), 1000, 0, s_flush_ttl, self); zloop_timer (bstar_zloop (self->bstar), 1000, 0, s_send_hugz, self); // Start the Bstar reactor bstar_start (self->bstar); // Interrupted, so shut down while (zlist_size (self->pending)) { kvmsg_t *kvmsg = (kvmsg_t *) zlist_pop (self->pending); kvmsg_destroy (&kvmsg); } zlist_destroy (&self->pending); bstar_destroy (&self->bstar); zhash_destroy (&self->kvmap); zctx_destroy (&self->ctx); free (self); return 0; }
/// // Register a timer that expires after some delay and repeats some number of // times. At each expiry, will call the handler, passing the arg. To run a // timer forever, use 0 times. Returns a timer_id that is used to cancel the // timer in the future. Returns -1 if there was an error. int QmlZloop::timer (size_t delay, size_t times, zloop_timer_fn handler, void *arg) { return zloop_timer (self, delay, times, handler, arg); };
/// // Register a timer that expires after some delay and repeats some number of // times. At each expiry, will call the handler, passing the arg. To run a // timer forever, use 0 times. Returns a timer_id that is used to cancel the // timer in the future. Returns -1 if there was an error. int QZloop::timer (size_t delay, size_t times, zloop_timer_fn handler, void *arg) { int rv = zloop_timer (self, delay, times, handler, arg); return rv; }
void zloop_test (bool verbose) { printf (" * zloop: "); int rc = 0; // @selftest // Create two PAIR sockets and connect over inproc zsock_t *output = zsock_new (ZMQ_PAIR); assert (output); zsock_bind (output, "inproc://zloop.test"); zsock_t *input = zsock_new (ZMQ_PAIR); assert (input); zsock_connect (input, "inproc://zloop.test"); zloop_t *loop = zloop_new (); assert (loop); zloop_set_verbose (loop, verbose); // Create a timer that will be cancelled int timer_id = zloop_timer (loop, 1000, 1, s_timer_event, NULL); zloop_timer (loop, 5, 1, s_cancel_timer_event, &timer_id); // After 20 msecs, send a ping message to output3 zloop_timer (loop, 20, 1, s_timer_event, output); // Set up some tickets that will never expire zloop_set_ticket_delay (loop, 10000); void *ticket1 = zloop_ticket (loop, s_timer_event, NULL); void *ticket2 = zloop_ticket (loop, s_timer_event, NULL); void *ticket3 = zloop_ticket (loop, s_timer_event, NULL); // When we get the ping message, end the reactor rc = zloop_reader (loop, input, s_socket_event, NULL); assert (rc == 0); zloop_reader_set_tolerant (loop, input); zloop_start (loop); zloop_ticket_delete (loop, ticket1); zloop_ticket_delete (loop, ticket2); zloop_ticket_delete (loop, ticket3); // Check whether loop properly ignores zsys_interrupted flag // when asked to zloop_destroy (&loop); loop = zloop_new (); bool timer_event_called = false; zloop_timer (loop, 1, 1, s_timer_event3, &timer_event_called); zsys_interrupted = 1; zloop_start (loop); // zloop returns immediately without giving any handler a chance to run assert (!timer_event_called); zloop_set_nonstop (loop, true); zloop_start (loop); // zloop runs the handler which will terminate the loop assert (timer_event_called); zsys_interrupted = 0; // Check if reader removed in timer is not called zloop_destroy (&loop); loop = zloop_new (); bool socket_event_called = false; zloop_reader (loop, output, s_socket_event1, &socket_event_called); zloop_timer (loop, 0, 1, s_timer_event5, output); zstr_send (input, "PING"); zloop_start (loop); assert (!socket_event_called); // cleanup zloop_destroy (&loop); assert (loop == NULL); zsock_destroy (&input); zsock_destroy (&output); #if defined (__WINDOWS__) zsys_shutdown(); #endif // @end printf ("OK\n"); }
maltcp_ctx_t *maltcp_ctx_new(mal_ctx_t *mal_ctx, char *hostname, char *port, maltcp_header_t *maltcp_header, // TODO: no longer used bool verbose) { maltcp_ctx_t *self = (maltcp_ctx_t *) malloc(sizeof(maltcp_ctx_t)); if (!self) return NULL; self->mal_ctx = mal_ctx; self->hostname = hostname; self->port = port; self->maltcp_header = maltcp_header; self->encoder = malbinary_encoder_new(true); self->decoder = malbinary_decoder_new(true); self->root_uri = (char *) malloc(strlen(hostname) + strlen(port) + 10 + 1); sprintf((char*) self->root_uri, "%s%s:%s", MALTCP_URI, hostname, port); clog_debug(maltcp_logger, "maltcp_ctx_new: root_uri=%s\n", self->root_uri); zctx_t *zmq_ctx = zctx_new(); self->zmq_ctx = zmq_ctx; self->cnx_table = zhash_new(); // Creates the TCP listening socket int listen = maltcp_ctx_server_socket_create(atoi(port), BACKLOG); //assert(listen >= 0); if (listen < 0) { clog_error(maltcp_logger, "EXCEPTION:: maltcp_ctx_new: listen = %d\n", listen); return NULL; } self->mal_socket = listen; clog_debug(maltcp_logger, "maltcp_ctx: ptp listening to: %s\n", port); //inproc void *endpoints_socket = zsocket_new(zmq_ctx, ZMQ_ROUTER); self->endpoints_socket = endpoints_socket; zsocket_bind(endpoints_socket, ZLOOP_ENDPOINTS_SOCKET_URI); zloop_t *zloop = zloop_new(); // TODO (AF): It seems that adding poller from outside of handler is not correctly // supported by ZMQ. We should provide an inproc socket allowing to add the needed // poller. However it seems that a timer regularly awaking the zloop corrects this // issue. zloop_timer(zloop, 100, 0, zloop_timer_handle, self); // zloop_set_verbose(zloop, true); self->zloop = zloop; zmq_pollitem_t poller = { NULL, listen, ZMQ_POLLIN }; int rc = zloop_poller(zloop, &poller, maltcp_ctx_socket_accept, self); assert(rc == 0); mal_ctx_set_binding( mal_ctx, self, maltcp_ctx_create_uri, maltcp_ctx_create_endpoint, maltcp_ctx_destroy_endpoint, maltcp_ctx_create_poller, maltcp_ctx_destroy_poller, maltcp_ctx_poller_add_endpoint, maltcp_ctx_poller_del_endpoint, maltcp_ctx_send_message, maltcp_ctx_recv_message, maltcp_ctx_poller_wait, maltcp_ctx_destroy_message, maltcp_ctx_start, maltcp_ctx_stop, maltcp_ctx_destroy); return self; }
int main(void) { gBlock.set_height(0); gClientName = sysinfo::GetClientName(); gClientID = sysinfo::GetClientID(); gInstanceID = gClientID * (unsigned)time(0); srand(gInstanceID); std::string frontHost; unsigned frontPort; Configuration* cfg = Configuration::create(); try{ cfg->parse("config.txt"); frontHost = cfg->lookupString("", "server", "localhost"); frontPort = cfg->lookupInt("", "port", 6666); gAddr = cfg->lookupString("", "address", ""); gClientName = cfg->lookupString("", "name", gClientName.c_str()); }catch(const ConfigurationException& ex){ printf("ERROR: %s\n", ex.c_str()); printf("hit return to exit...\n"); std::string line; std::getline(std::cin, line); exit(EXIT_FAILURE); } if(!gClientName.size()) gClientName = sysinfo::GetClientName(); printf("madPrimeMiner-v%d.%d\n", gClientVersion/10, gClientVersion%10); printf("ClientName = '%s' ClientID = %u InstanceID = %u\n", gClientName.c_str(), gClientID, gInstanceID); printf("Address = '%s'\n", gAddr.c_str()); if(!gAddr.size()){ printf("ERROR: address not specified in config.txt\n"); printf("hit return to exit...\n"); std::string line; std::getline(std::cin, line); exit(EXIT_FAILURE); } gCtx = zctx_new(); gWorkers = zsocket_new(gCtx, ZMQ_PULL); zsocket_bind(gWorkers, "inproc://shares"); gClient = new XPMClient(gCtx); gExit = !gClient->Initialize(cfg); while(!gExit){ printf("Connecting to frontend: %s:%d ...\n", frontHost.c_str(), frontPort); gBlock.Clear(); proto::Reply rep; gExit = true; while(gExit){ zsocket_destroy(gCtx, gFrontend); gFrontend = zsocket_new(gCtx, ZMQ_DEALER); int err = zsocket_connect(gFrontend, "tcp://%s:%d", frontHost.c_str(), frontPort); if(err){ printf("ERROR: invalid hostname and/or port.\n"); exit(EXIT_FAILURE); } proto::Request req; req.set_type(proto::Request::CONNECT); req.set_reqid(++gNextReqID); req.set_version(gClientVersion); req.set_height(0); GetNewReqNonce(req); Send(req, gFrontend); bool ready = zsocket_poll(gFrontend, 3*1000); if(zctx_interrupted) break; if(!ready) continue; Receive(rep, gFrontend); if(rep.error() != proto::Reply::NONE){ printf("ERROR: %s\n", proto::Reply::ErrType_Name(rep.error()).c_str()); if(rep.has_errstr()) printf("Message from server: %s\n", rep.errstr().c_str()); } if(!rep.has_sinfo()) break; gServerInfo = rep.sinfo(); bool ret = false; ret |= !ConnectBitcoin(); ret |= !ConnectSignals(); if(ret) break; gExit = false; } zsocket_disconnect(gFrontend, "tcp://%s:%d", frontHost.c_str(), frontPort); if(gExit) break; zloop_t* wloop = zloop_new(); zmq_pollitem_t item_server = {gServer, 0, ZMQ_POLLIN, 0}; int err = zloop_poller(wloop, &item_server, &HandleReply, 0); assert(!err); zmq_pollitem_t item_signals = {gSignals, 0, ZMQ_POLLIN, 0}; err = zloop_poller(wloop, &item_signals, &HandleSignal, 0); assert(!err); zmq_pollitem_t item_workers = {gWorkers, 0, ZMQ_POLLIN, 0}; err = zloop_poller(wloop, &item_workers, &HandleWorkers, 0); assert(!err); err = zloop_timer(wloop, 60*1000, 0, &HandleTimer, 0); assert(err >= 0); gHeartBeat = true; gExit = true; if(rep.has_block()) HandleNewBlock(rep.block()); else RequestWork(); gClient->Toggle(); zloop_start(wloop); gClient->Toggle(); zloop_destroy(&wloop); zsocket_destroy(gCtx, gServer); zsocket_destroy(gCtx, gSignals); gServer = 0; gSignals = 0; } delete gClient; zsocket_destroy(gCtx, gWorkers); zsocket_destroy(gCtx, gFrontend); zctx_destroy(&gCtx); return EXIT_SUCCESS; }
void PrimeWorker::Work(zctx_t *ctx, void *pipe) { printf("PrimeWorker started.\n"); mBackend = zsocket_new(ctx, ZMQ_DEALER); void* frontend = zsocket_new(ctx, ZMQ_DEALER); void* input = zsocket_new(ctx, ZMQ_SUB); mServer = zsocket_new(ctx, ZMQ_ROUTER); mSignals = zsocket_new(ctx, ZMQ_PUB); zsocket_set_sndhwm(mBackend, 1*1000*1000); int err = 0; err = zsocket_bind(mServer, "tcp://*:%d", mServerPort); if(!err) printf("zsocket_bind(mServer, tcp://*:*) failed.\n"); err = zsocket_bind(mSignals, "tcp://*:%d", mSignalPort); if(!err) printf("zsocket_bind(mSignals, tcp://*:*) failed.\n"); printf("PrimeWorker: mServerPort=%d mSignalPort=%d\n", mServerPort, mSignalPort); err = zsocket_connect(mBackend, "tcp://localhost:8888"); assert(!err); err = zsocket_connect(frontend, "tcp://localhost:7777"); assert(!err); err = zsocket_connect(input, "inproc://bitcoin"); assert(!err); const char one[2] = {1, 0}; zsocket_set_subscribe(input, one); zloop_t* wloop = zloop_new(); zmq_pollitem_t item_input = {input, 0, ZMQ_POLLIN, 0}; err = zloop_poller(wloop, &item_input, &PrimeWorker::InvokeInput, this); assert(!err); zmq_pollitem_t item_server = {mServer, 0, ZMQ_POLLIN, 0}; err = zloop_poller(wloop, &item_server, &PrimeWorker::InvokeRequest, this); assert(!err); zmq_pollitem_t item_frontend = {frontend, 0, ZMQ_POLLIN, 0}; err = zloop_poller(wloop, &item_frontend, &PrimeWorker::InvokeRequest, this); assert(!err); err = zloop_timer(wloop, 60000, 0, &PrimeWorker::InvokeTimerFunc, this); assert(err >= 0); zsocket_signal(pipe); zloop_start(wloop); zloop_destroy(&wloop); zsocket_destroy(ctx, mServer); zsocket_destroy(ctx, mSignals); zsocket_destroy(ctx, mBackend); zsocket_destroy(ctx, frontend); zsocket_destroy(ctx, input); zsocket_signal(pipe); printf("PrimeWorker exited.\n"); }
int main (int argc, char *argv []) { clonesrv_t *self = (clonesrv_t *) zmalloc (sizeof (clonesrv_t)); if (argc == 2 && streq (argv [1], "-p")) { zclock_log ("I: primary active, waiting for backup (passive)"); self->bstar = bstar_new (BSTAR_PRIMARY, "tcp://*:5003", "tcp://localhost:5004"); bstar_voter (self->bstar, "tcp://*:5556", ZMQ_ROUTER, s_snapshots, self); self->port = 5556; self->peer = 5566; self->primary = true; } else if (argc == 2 && streq (argv [1], "-b")) { zclock_log ("I: backup passive, waiting for primary (active)"); self->bstar = bstar_new (BSTAR_BACKUP, "tcp://*:5004", "tcp://localhost:5003"); bstar_voter (self->bstar, "tcp://*:5566", ZMQ_ROUTER, s_snapshots, self); self->port = 5566; self->peer = 5556; self->primary = false; } else { printf ("Usage: clonesrv4 { -p | -b }\n"); free (self); exit (0); } // Primary server will become first active if (self->primary) self->kvmap = zhash_new (); self->ctx = zctx_new (); self->pending = zlist_new (); bstar_set_verbose (self->bstar, true); // Set up our clone server sockets self->publisher = zsocket_new (self->ctx, ZMQ_PUB); self->collector = zsocket_new (self->ctx, ZMQ_SUB); zsocket_set_subscribe (self->collector, ""); zsocket_bind (self->publisher, "tcp://*:%d", self->port + 1); zsocket_bind (self->collector, "tcp://*:%d", self->port + 2); // Set up our own clone client interface to peer self->subscriber = zsocket_new (self->ctx, ZMQ_SUB); zsocket_set_subscribe (self->subscriber, ""); zsocket_connect (self->subscriber, "tcp://localhost:%d", self->peer + 1); // .split main task body // After we've setup our sockets, we register our binary star // event handlers, and then start the bstar reactor. This finishes // when the user presses Ctrl-C or when the process receives a SIGINT // interrupt: // Register state change handlers bstar_new_active (self->bstar, s_new_active, self); bstar_new_passive (self->bstar, s_new_passive, self); // Register our other handlers with the bstar reactor zmq_pollitem_t poller = { self->collector, 0, ZMQ_POLLIN }; zloop_poller (bstar_zloop (self->bstar), &poller, s_collector, self); zloop_timer (bstar_zloop (self->bstar), 1000, 0, s_flush_ttl, self); zloop_timer (bstar_zloop (self->bstar), 1000, 0, s_send_hugz, self); // Start the bstar reactor bstar_start (self->bstar); // Interrupted, so shut down while (zlist_size (self->pending)) { kvmsg_t *kvmsg = (kvmsg_t *) zlist_pop (self->pending); kvmsg_destroy (&kvmsg); } zlist_destroy (&self->pending); bstar_destroy (&self->bstar); zhash_destroy (&self->kvmap); zctx_destroy (&self->ctx); free (self); return 0; }