/* * getdns_extension_set_libevent_base * */ getdns_return_t getdns_extension_set_libevent_base(struct getdns_context *context, struct event_base * this_event_base) { RETURN_IF_NULL(context, GETDNS_RETURN_BAD_CONTEXT); RETURN_IF_NULL(this_event_base, GETDNS_RETURN_INVALID_PARAMETER); /* TODO: cleanup current extension base */ getdns_return_t r = getdns_extension_detach_eventloop(context); if (r != GETDNS_RETURN_GOOD) { return r; } int fd = getdns_context_fd(context); struct event* getdns_event = event_new(this_event_base, fd, EV_READ | EV_PERSIST, getdns_libevent_cb, context); if (!getdns_event) { return GETDNS_RETURN_GENERIC_ERROR; } /* TODO: use context functs? */ struct event_data* ev_data = (struct event_data*) malloc(sizeof(struct event_data)); if (!ev_data) { /* cleanup */ event_del(getdns_event); event_free(getdns_event); return GETDNS_RETURN_GENERIC_ERROR; } ev_data->event = getdns_event; ev_data->event_base = this_event_base; return getdns_extension_set_eventloop(context, &LIBEVENT_EXT, ev_data); } /* getdns_extension_set_libevent_base */
/* * getdns_extension_set_libev_loop * */ getdns_return_t getdns_extension_set_libev_loop(struct getdns_context *context, struct ev_loop *loop) { RETURN_IF_NULL(context, GETDNS_RETURN_INVALID_PARAMETER); RETURN_IF_NULL(loop, GETDNS_RETURN_INVALID_PARAMETER); /* TODO: cleanup current extension base */ getdns_return_t r = getdns_extension_detach_eventloop(context); if (r != GETDNS_RETURN_GOOD) { return r; } struct getdns_libev_data* ev_data = (struct getdns_libev_data*) malloc(sizeof(struct getdns_libev_data)); if (!ev_data) { return GETDNS_RETURN_MEMORY_ERROR; } int fd = getdns_context_fd(context); ev_data->poll_handle = (struct ev_io*) malloc(sizeof(struct ev_io)); ev_io_init(ev_data->poll_handle, getdns_libev_cb, fd, EV_READ); ev_data->loop = loop; ev_data->poll_handle->data = context; return getdns_extension_set_eventloop(context, &LIBEV_EXT, ev_data); } /* getdns_extension_set_libev_loop */
/* * getdns_extension_set_libuv_loop * */ getdns_return_t getdns_extension_set_libuv_loop(struct getdns_context *context, struct uv_loop_s *uv_loop) { RETURN_IF_NULL(context, GETDNS_RETURN_INVALID_PARAMETER); RETURN_IF_NULL(uv_loop, GETDNS_RETURN_INVALID_PARAMETER); /* TODO: cleanup current extension base */ getdns_return_t r = getdns_extension_detach_eventloop(context); if (r != GETDNS_RETURN_GOOD) { return r; } struct getdns_libuv_data* uv_data = (struct getdns_libuv_data*) malloc(sizeof(struct getdns_libuv_data)); if (!uv_data) { return GETDNS_RETURN_MEMORY_ERROR; } int fd = getdns_context_fd(context); uv_data->poll_handle = (uv_poll_t*) malloc(sizeof(uv_poll_t)); uv_poll_init(uv_loop, uv_data->poll_handle, fd); uv_data->poll_handle->data = context; uv_data->loop = uv_loop; uv_data->polling = 0; return getdns_extension_set_eventloop(context, &LIBUV_EXT, uv_data); } /* getdns_extension_set_libuv_loop */