25 #include <citrusleaf/cf_ll.h>
31 #if defined(AS_USE_LIBEV)
33 #elif defined(AS_USE_LIBUV)
35 #elif defined(AS_USE_LIBEVENT)
36 #include <event2/event.h>
48 #define AS_ASYNC_STATE_UNREGISTERED 0
49 #define AS_ASYNC_STATE_REGISTERED 1
50 #define AS_ASYNC_STATE_TLS_CONNECT 2
51 #define AS_ASYNC_STATE_AUTH_WRITE 3
52 #define AS_ASYNC_STATE_AUTH_READ_HEADER 4
53 #define AS_ASYNC_STATE_AUTH_READ_BODY 5
54 #define AS_ASYNC_STATE_COMMAND_WRITE 6
55 #define AS_ASYNC_STATE_COMMAND_READ_HEADER 7
56 #define AS_ASYNC_STATE_COMMAND_READ_BODY 8
57 #define AS_ASYNC_STATE_COMPLETE 9
59 #define AS_ASYNC_FLAGS_MASTER 1
60 #define AS_ASYNC_FLAGS_READ 2
61 #define AS_ASYNC_FLAGS_HAS_TIMER 4
62 #define AS_ASYNC_FLAGS_USING_SOCKET_TIMER 8
63 #define AS_ASYNC_FLAGS_EVENT_RECEIVED 16
64 #define AS_ASYNC_FLAGS_FREE_BUF 32
65 #define AS_ASYNC_FLAGS_CP_MODE 64
67 #define AS_ASYNC_AUTH_RETURN_CODE 1
69 #define AS_EVENT_CONNECTION_COMPLETE 0
70 #define AS_EVENT_CONNECTION_PENDING 1
71 #define AS_EVENT_CONNECTION_ERROR 2
73 #define AS_EVENT_QUEUE_INITIAL_CAPACITY 256
79 #if defined(AS_USE_LIBEV)
82 #elif defined(AS_USE_LIBUV)
89 #elif defined(AS_USE_LIBEVENT)
114 #if defined(AS_USE_LIBEV)
115 struct ev_timer timer;
116 #elif defined(AS_USE_LIBUV)
118 #elif defined(AS_USE_LIBEVENT)
251 #if defined(AS_USE_LIBEV)
253 void as_ev_socket_timeout(
struct ev_loop* loop, ev_timer* timer,
int revents);
254 void as_ev_total_timeout(
struct ev_loop* loop, ev_timer* timer,
int revents);
266 if (max_socket_idle == 0 && conn->socket.ctx) {
267 max_socket_idle = 55;
270 if (max_socket_idle > 0) {
271 conn->socket.idle_check.max_socket_idle = max_socket_idle;
272 conn->socket.idle_check.last_used = (uint32_t)cf_get_seconds();
275 conn->socket.idle_check.max_socket_idle = conn->socket.idle_check.last_used = 0;
282 ev_timer_init(&cmd->timer, as_ev_total_timeout, (
double)timeout / 1000.0, 0.0);
283 cmd->timer.data = cmd;
296 ev_init(&cmd->timer, as_ev_socket_timeout);
298 cmd->timer.data = cmd;
331 #elif defined(AS_USE_LIBUV)
333 void as_uv_total_timeout(uv_timer_t* timer);
334 void as_uv_socket_timeout(uv_timer_t* timer);
342 if (uv_fileno((uv_handle_t*)&conn->socket, &fd) == 0) {
357 cmd->timer.data = cmd;
358 uv_timer_start(&cmd->timer, as_uv_total_timeout, timeout, 0);
364 uv_timer_start(&cmd->timer, as_uv_total_timeout, timeout, 0);
371 cmd->timer.data = cmd;
378 uv_timer_again(&cmd->timer);
384 uv_timer_stop(&cmd->timer);
394 as_uv_timer_closed(uv_handle_t* handle);
401 uv_close((uv_handle_t*)&cmd->timer, as_uv_timer_closed);
412 #elif defined(AS_USE_LIBEVENT)
414 void as_libevent_socket_timeout(evutil_socket_t sock,
short events,
void*
udata);
415 void as_libevent_total_timeout(evutil_socket_t sock,
short events,
void*
udata);
427 if (max_socket_idle == 0 && conn->socket.ctx) {
428 max_socket_idle = 55;
431 if (max_socket_idle > 0) {
432 conn->socket.idle_check.max_socket_idle = max_socket_idle;
433 conn->socket.idle_check.last_used = (uint32_t)cf_get_seconds();
436 conn->socket.idle_check.max_socket_idle = conn->socket.idle_check.last_used = 0;
443 evtimer_assign(&cmd->timer, cmd->
event_loop->
loop, as_libevent_total_timeout, cmd);
446 tv.tv_sec = timeout / 1000;
447 tv.tv_usec = (timeout % 1000) * 1000;
449 evtimer_add(&cmd->timer, &tv);
456 tv.tv_sec = timeout / 1000;
457 tv.tv_usec = (timeout % 1000) * 1000;
459 evtimer_add(&cmd->timer, &tv);
465 event_assign(&cmd->timer, cmd->
event_loop->
loop, -1, EV_PERSIST, as_libevent_socket_timeout, cmd);
471 evtimer_add(&cmd->timer, &tv);
483 evtimer_del(&cmd->timer);
489 event_del(&conn->watcher);
577 cmd->
len =
sizeof(as_proto);
586 as_proto*
proto = (as_proto*)cmd->
buf;
588 cmd->
len = (uint32_t)proto->sz;
as_event_loop * event_loop
as_event_parse_results_fn parse_results
bool as_event_command_parse_success_failure(as_event_command *cmd)
as_event_executor_complete_fn complete_fn
bool(* as_event_parse_results_fn)(struct as_event_command *cmd)
#define AS_ASYNC_STATE_AUTH_READ_HEADER
as_pipe_listener listener
void as_event_command_write_start(as_event_command *cmd)
static bool as_event_socket_retry(as_event_command *cmd)
void as_event_command_free(as_event_command *cmd)
static void as_event_set_auth_parse_header(as_event_command *cmd)
void as_proto_swap_from_be(as_proto *m)
static void as_event_set_auth_read_header(as_event_command *cmd)
bool as_event_command_parse_header(as_event_command *cmd)
void as_event_executor_cancel(as_event_executor *executor, int queued_count)
static void as_event_command_release(as_event_command *cmd)
void as_event_node_destroy(as_node *node)
void(* as_event_executor_complete_fn)(struct as_event_executor *executor)
static void as_event_release_async_connection(as_event_command *cmd)
void as_event_socket_error(as_event_command *cmd, as_error *err)
static void as_event_repeat_socket_timer(as_event_command *cmd)
void as_event_executor_complete(as_event_command *cmd)
void(* as_event_executable)(void *udata)
static void as_event_set_conn_last_used(as_event_connection *conn, uint32_t max_socket_idle)
struct as_event_command ** commands
bool as_event_create_loop(as_event_loop *event_loop)
as_event_loop * event_loop
as_status as_event_command_execute(as_event_command *cmd, as_error *err)
as_event_executable executable
int as_socket_validate(as_socket *sock)
as_conn_pool * pipe_conn_pools
int as_socket_validate_fd(int fd)
bool as_event_command_retry(as_event_command *cmd, bool alternate)
void as_event_close_cluster(as_cluster *cluster)
static int as_event_validate_connection(as_event_connection *conn)
#define AS_ASYNC_STATE_AUTH_READ_BODY
static void as_event_stop_watcher(as_event_command *cmd, as_event_connection *conn)
void(* as_pipe_listener)(void *udata, as_event_loop *event_loop)
static void as_event_set_write(as_event_command *cmd)
void as_event_response_error(as_event_command *cmd, as_error *err)
static void as_event_decr_conn(as_event_command *cmd)
void as_event_total_timeout(as_event_command *cmd)
static void as_event_connection_timeout(as_event_command *cmd, as_conn_pool *pool)
bool as_event_execute(as_event_loop *event_loop, as_event_executable executable, void *udata)
void as_event_register_external_loop(as_event_loop *event_loop)
uint32_t as_authenticate_set(const char *user, const char *credential, uint8_t *buffer)
static void as_event_set_total_timer(as_event_command *cmd, uint64_t timeout)
static void as_conn_pool_dec(as_conn_pool *pool)
as_conn_pool * async_conn_pools
void as_event_socket_timeout(as_event_command *cmd)
void as_event_connect(as_event_command *cmd)
static as_event_loop * as_event_loop_get()
as_event_connection * conn
static void as_event_set_auth_write(as_event_command *cmd)
static void as_event_stop_timer(as_event_command *cmd)
void as_event_close_connection(as_event_connection *conn)
static void as_event_init_socket_timer(as_event_command *cmd)
as_pipe_listener pipe_listener
as_policy_replica replica
void(* as_event_executor_destroy_fn)(struct as_event_executor *executor)
bool as_event_command_parse_result(as_event_command *cmd)
struct as_event_command * cmd
static as_event_loop * as_event_assign(as_event_loop *event_loop)
static void as_event_release_connection(as_event_connection *conn, as_conn_pool *pool)
void as_event_error_callback(as_event_command *cmd, as_error *err)
static void as_event_init_total_timer(as_event_command *cmd, uint64_t timeout)
void as_event_parse_error(as_event_command *cmd, as_error *err)
#define AS_ASYNC_FLAGS_HAS_TIMER