#ifndef __HEV_TASK_CIO_H__
#define __HEV_TASK_CIO_H__
#include <sys/uio.h>
#include <hev-object.h>
#ifdef __cplusplus
extern "C" {
#endif
#define HEV_TASK_CIO(p) ((HevTaskCIO *)p)
#define HEV_TASK_CIO_CLASS(p) ((HevTaskCIOClass *)p)
#define HEV_TASK_CIO_TYPE (hev_task_cio_class ())
typedef struct _HevTaskCIO HevTaskCIO;
typedef struct _HevTaskCIOClass HevTaskCIOClass;
typedef enum _HevTaskCIOCtrl HevTaskCIOCtrl;
struct _HevTaskCIO
{
HevObject base;
int err;
HevTaskCIO *next;
};
struct _HevTaskCIOClass
{
HevObjectClass base;
ssize_t (*read) (HevTaskCIO *, void *, size_t);
ssize_t (*write) (HevTaskCIO *, const void *, size_t);
ssize_t (*readv) (HevTaskCIO *, const struct iovec *, int);
ssize_t (*writev) (HevTaskCIO *, const struct iovec *, int);
ssize_t (*read_dgram) (HevTaskCIO *, void *, size_t, void *);
ssize_t (*write_dgram) (HevTaskCIO *, const void *, size_t, const void *);
ssize_t (*readv_dgram) (HevTaskCIO *, const struct iovec *, int, void *);
ssize_t (*writev_dgram) (HevTaskCIO *, const struct iovec *, int,
const void *);
long (*ctrl) (HevTaskCIO *, int, long, void *);
};
enum _HevTaskCIOCtrl
{
HEV_TASK_CIO_CTRL_FLUSH,
HEV_TASK_CIO_CTRL_GET_FD,
HEV_TASK_CIO_CTRL_SHUTDOWN,
};
HevObjectClass *hev_task_cio_class (void);
int hev_task_cio_construct (HevTaskCIO *self);
HevTaskCIO *hev_task_cio_push (HevTaskCIO *self, HevTaskCIO *next);
HevTaskCIO *hev_task_cio_pop (HevTaskCIO *self);
int hev_task_cio_get_fd (HevTaskCIO *self, int dir);
ssize_t hev_task_cio_read (HevTaskCIO *self, void *buf, size_t count,
HevTaskIOYielder yielder, void *yielder_data);
ssize_t hev_task_cio_read_exact (HevTaskCIO *self, void *buf, size_t count,
HevTaskIOYielder yielder, void *yielder_data);
ssize_t hev_task_cio_readv (HevTaskCIO *self, const struct iovec *iov,
int iovcnt, HevTaskIOYielder yielder,
void *yielder_data);
ssize_t hev_task_cio_readv_exact (HevTaskCIO *self, const struct iovec *iov,
int iovcnt, HevTaskIOYielder yielder,
void *yielder_data);
ssize_t hev_task_cio_write (HevTaskCIO *self, const void *buf, size_t count,
HevTaskIOYielder yielder, void *yielder_data);
ssize_t hev_task_cio_write_exact (HevTaskCIO *self, const void *buf,
size_t count, HevTaskIOYielder yielder,
void *yielder_data);
ssize_t hev_task_cio_writev (HevTaskCIO *self, const struct iovec *iov,
int iovcnt, HevTaskIOYielder yielder,
void *yielder_data);
ssize_t hev_task_cio_writev_exact (HevTaskCIO *self, const struct iovec *iov,
int iovcnt, HevTaskIOYielder yielder,
void *yielder_data);
ssize_t hev_task_cio_read_dgram (HevTaskCIO *self, void *buf, size_t count,
void *addr, HevTaskIOYielder yielder,
void *yielder_data);
ssize_t hev_task_cio_readv_dgram (HevTaskCIO *self, const struct iovec *iov,
int iovcnt, void *addr,
HevTaskIOYielder yielder, void *yielder_data);
ssize_t hev_task_cio_write_dgram (HevTaskCIO *self, const void *buf,
size_t count, const void *addr,
HevTaskIOYielder yielder, void *yielder_data);
ssize_t hev_task_cio_writev_dgram (HevTaskCIO *self, const struct iovec *iov,
int iovcnt, const void *addr,
HevTaskIOYielder yielder,
void *yielder_data);
int hev_task_cio_flush (HevTaskCIO *self, HevTaskIOYielder yielder,
void *yielder_data);
void hev_task_cio_splice (HevTaskCIO *a, HevTaskCIO *b, size_t buf_size,
HevTaskIOYielder yielder, void *yielder_data);
static inline ssize_t
hev_task_cio_next_read (HevTaskCIO *self, void *buf, size_t count)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
ssize_t res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->read (next, buf, count);
self->err = next->err;
return res;
}
static inline ssize_t
hev_task_cio_next_readv (HevTaskCIO *self, const struct iovec *iov, int iovcnt)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
ssize_t res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->readv (next, iov, iovcnt);
self->err = next->err;
return res;
}
static inline ssize_t
hev_task_cio_next_write (HevTaskCIO *self, const void *buf, size_t count)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
ssize_t res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->write (next, buf, count);
self->err = next->err;
return res;
}
static inline ssize_t
hev_task_cio_next_writev (HevTaskCIO *self, const struct iovec *iov, int iovcnt)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
ssize_t res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->writev (next, iov, iovcnt);
self->err = next->err;
return res;
}
static inline ssize_t
hev_task_cio_next_read_dgram (HevTaskCIO *self, void *buf, size_t count,
void *addr)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
ssize_t res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->read_dgram (next, buf, count, addr);
self->err = next->err;
return res;
}
static inline ssize_t
hev_task_cio_next_readv_dgram (HevTaskCIO *self, const struct iovec *iov,
int iovcnt, void *addr)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
ssize_t res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->readv_dgram (next, iov, iovcnt, addr);
self->err = next->err;
return res;
}
static inline ssize_t
hev_task_cio_next_write_dgram (HevTaskCIO *self, const void *buf, size_t count,
const void *addr)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
ssize_t res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->write_dgram (next, buf, count, addr);
self->err = next->err;
return res;
}
static inline ssize_t
hev_task_cio_next_writev_dgram (HevTaskCIO *self, const struct iovec *iov,
int iovcnt, const void *addr)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
ssize_t res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->writev_dgram (next, iov, iovcnt, addr);
self->err = next->err;
return res;
}
static inline long
hev_task_cio_next_ctrl (HevTaskCIO *self, int ctrl, long larg, void *parg)
{
HevTaskCIO *next = self->next;
HevTaskCIOClass *nkptr;
long res;
if (!next) {
self->err = 0;
return -1;
}
nkptr = HEV_OBJECT_GET_CLASS (next);
res = nkptr->ctrl (next, ctrl, larg, parg);
self->err = next->err;
return res;
}
static inline void
hev_task_cio_next_destruct (HevTaskCIO *self)
{
HevTaskCIO *next = self->next;
HevObjectClass *nkptr;
if (!next)
return;
nkptr = HEV_OBJECT_GET_CLASS (next);
nkptr->destruct (HEV_OBJECT (next));
}
#ifdef __cplusplus
}
#endif
#endif