/* * Write json string to this zio object, buffering unwritten data. */ int zio_write_json (zio_t *zio, const char *json_str) { char *s = NULL; int len, rc = 0; bool eof; if ((zio == NULL) || (zio->magic != ZIO_MAGIC) || !zio_writer (zio)) { errno = EINVAL; return (-1); } len = zio_json_decode (json_str, (void **)&s, &eof); if (len < 0) { errno = EINVAL; return (-1); } if (eof) zio_set_eof (zio); if (len > 0) rc = zio_write_internal (zio, s, len); else if (zio_write_pending (zio)) zio_writer_schedule (zio); free (s); return rc; }
static int zio_flux_writer_cb (flux_t f, int fd, short revents, zio_t *zio) { int rc; zio_handler_start (zio); rc = zio_writer_cb (zio); if (!zio_write_pending (zio)) flux_fdhandler_remove (f, fd, ZMQ_POLLOUT | ZMQ_POLLERR); zio_handler_end (zio); return (rc); }
static int zio_zloop_writer_cb (zloop_t *zl, zmq_pollitem_t *zp, zio_t *zio) { int rc; zio_handler_start (zio); rc = zio_writer_cb (zio); if (!zio_write_pending (zio)) zloop_poller_end (zl, zp); zio_handler_end (zio); return (rc); }
static int zio_write_internal (zio_t *zio, void *data, size_t len) { int rc; rc = zio_write_data (zio, data, len); zio_debug (zio, "zio_write: %d bytes, eof=%d\n", len, zio_eof (zio)); if (zio_write_pending (zio)) zio_writer_schedule (zio); return (rc); }
static void zio_flux_writer_cb (flux_reactor_t *r, flux_watcher_t *w, int revents, void *arg) { zio_t *zio = arg; int rc; zio_handler_start (zio); rc = zio_writer_cb (zio); if (!zio_write_pending (zio)) flux_watcher_stop (w); zio_handler_end (zio); if (rc < 0) flux_reactor_stop_error (r); }
static int zio_bootstrap (zio_t *zio) { if (zio_reader (zio)) zio_reader_poll (zio); else if (zio_writer (zio)) { /* * Add writer to poll loop only if there is data pending to * be written */ if (zio_write_pending (zio)) zio_writer_schedule (zio); } return (0); }