Пример #1
0
/*
 *  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;
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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);
}
Пример #6
0
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);
}