#ifndef LCBUV_PLUGIN_INTERNAL_H
#define LCBUV_PLUGIN_INTERNAL_H
#include <libcouchbase/couchbase.h>
#include <uv.h>
#include <errno.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include "libuv_compat.h"
#ifdef LCBUV_EMBEDDED_SOURCE
#include <libcouchbase/libuv_io_opts.h>
#else
#include "libuv_io_opts.h"
#endif
typedef void (*v0_callback_t)(lcb_socket_t, short, void *);
typedef void (*generic_callback_t)(void);
#define CbREQ(mr) (mr)->callback
typedef struct {
uv_tcp_t t;
lcb_ioC_read2_callback callback;
} my_tcp_t;
typedef struct {
lcb_sockdata_t base;
my_tcp_t tcp;
unsigned int refcount;
unsigned char uv_close_called;
lcb_IOV iov;
void *rdarg;
struct {
int read;
int write;
} pending;
} my_sockdata_t;
typedef struct {
uv_write_t w;
lcb_ioC_write2_callback callback;
my_sockdata_t *sock;
} my_write_t;
typedef struct {
struct lcb_io_opt_st base;
uv_loop_t *loop;
unsigned int iops_refcount;
int external_loop;
int startstop_noop;
int do_stop;
} my_iops_t;
typedef struct {
uv_timer_t uvt;
v0_callback_t callback;
void *cb_arg;
my_iops_t *parent;
} my_timer_t;
typedef struct {
union {
uv_connect_t conn;
uv_idle_t idle;
} uvreq;
union {
lcb_io_connect_cb conn;
generic_callback_t cb_;
} cb;
my_sockdata_t *socket;
} my_uvreq_t;
#define PTR_FROM_FIELD(t, p, fld) ((t*)(void*)((char*)p-(offsetof(t, fld))))
#define incref_iops(io) (io)->iops_refcount++
#ifdef _WIN32
typedef ULONG lcb_uvbuf_len_t;
#else
typedef size_t lcb_uvbuf_len_t;
#endif
#endif