mirror of https://github.com/getdnsapi/getdns.git
Event loop extension functions documentation
This commit is contained in:
parent
708e520989
commit
68a87e4cee
|
@ -48,7 +48,21 @@ struct ev_loop;
|
||||||
/**
|
/**
|
||||||
* \ingroup eventloops
|
* \ingroup eventloops
|
||||||
*/
|
*/
|
||||||
/* For libevent, which we are using for these examples */
|
/**
|
||||||
|
* Associate the libev ev_loop with the context, so that all
|
||||||
|
* asynchronous requests will schedule Input/Output with it.
|
||||||
|
* Synchronous requests will still use a default eventloop based on `poll()`.
|
||||||
|
* Applications need to @code #include <getdns/getdns_ext_libev.h> @endcode
|
||||||
|
* and link with libgetdns_ext_ev to use this function.
|
||||||
|
* getdns needs to have been configured with --with-libev for this
|
||||||
|
* extension to be available.
|
||||||
|
* @param context The context to configure
|
||||||
|
* @param ev_loop The libev event loop to associate with this context.
|
||||||
|
* @return GETDNS_RETURN_GOOD when successful
|
||||||
|
* @return GETDNS_RETURN_BAD_CONTEXT when context is NULL
|
||||||
|
* @return GETDNS_RETURN_INVALID_PARAMETER when ev_loop is NULL
|
||||||
|
* @return GETDNS_RETURN_MEMORY_ERROR when memory could not be allocated
|
||||||
|
*/
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_extension_set_libev_loop(struct getdns_context *context,
|
getdns_extension_set_libev_loop(struct getdns_context *context,
|
||||||
struct ev_loop *ev_loop);
|
struct ev_loop *ev_loop);
|
||||||
|
|
|
@ -47,7 +47,21 @@ struct event_base;
|
||||||
/**
|
/**
|
||||||
* \ingroup eventloops
|
* \ingroup eventloops
|
||||||
*/
|
*/
|
||||||
/* For libevent, which we are using for these examples */
|
/**
|
||||||
|
* Associate the libevent event_base with the context, so that all
|
||||||
|
* asynchronous requests will schedule Input/Output with it.
|
||||||
|
* Synchronous requests will still use a default eventloop based on `poll()`.
|
||||||
|
* Applications need to @code #include <getdns/getdns_ext_libevent.h> @endcode
|
||||||
|
* and link with libgetdns_ext_event to use this function.
|
||||||
|
* getdns needs to have been configured with --with-libevent for this
|
||||||
|
* extension to be available.
|
||||||
|
* @param context The context to configure
|
||||||
|
* @param this_event_base The libevent event base to associate with this context.
|
||||||
|
* @return GETDNS_RETURN_GOOD when successful
|
||||||
|
* @return GETDNS_RETURN_BAD_CONTEXT when context is NULL
|
||||||
|
* @return GETDNS_RETURN_INVALID_PARAMETER when this_event_base is NULL
|
||||||
|
* @return GETDNS_RETURN_MEMORY_ERROR when memory could not be allocated
|
||||||
|
*/
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_extension_set_libevent_base(struct getdns_context *context,
|
getdns_extension_set_libevent_base(struct getdns_context *context,
|
||||||
struct event_base *this_event_base);
|
struct event_base *this_event_base);
|
||||||
|
|
|
@ -47,7 +47,21 @@ struct uv_loop_s;
|
||||||
/**
|
/**
|
||||||
* \ingroup eventloops
|
* \ingroup eventloops
|
||||||
*/
|
*/
|
||||||
/* For libevent, which we are using for these examples */
|
/**
|
||||||
|
* Associate the libuv uv_loop with the context, so that all
|
||||||
|
* asynchronous requests will schedule Input/Output with it.
|
||||||
|
* Synchronous requests will still use a default eventloop based on `poll()`.
|
||||||
|
* Applications need to @code #include <getdns/getdns_ext_libuv.h> @endcode
|
||||||
|
* and link with libgetdns_ext_uv to use this function.
|
||||||
|
* getdns needs to have been configured with --with-libuv for this
|
||||||
|
* extension to be available.
|
||||||
|
* @param context The context to configure
|
||||||
|
* @param uv_loop The libuv event loop to associate with this context.
|
||||||
|
* @return GETDNS_RETURN_GOOD when successful
|
||||||
|
* @return GETDNS_RETURN_BAD_CONTEXT when context is NULL
|
||||||
|
* @return GETDNS_RETURN_INVALID_PARAMETER when uv_loop is NULL
|
||||||
|
* @return GETDNS_RETURN_MEMORY_ERROR when memory could not be allocated
|
||||||
|
*/
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_extension_set_libuv_loop(struct getdns_context *context,
|
getdns_extension_set_libuv_loop(struct getdns_context *context,
|
||||||
struct uv_loop_s *uv_loop);
|
struct uv_loop_s *uv_loop);
|
||||||
|
|
|
@ -157,69 +157,215 @@ typedef enum getdns_tls_authentication_t {
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of callback function that is used by the callbacks in an
|
||||||
|
* getdns_eventloop_event.
|
||||||
|
* @param userarg This will have the value of the userarg attribute of the
|
||||||
|
* getdns_eventloop_event struct in which this callback was
|
||||||
|
* present.
|
||||||
|
*/
|
||||||
typedef void (*getdns_eventloop_callback)(void *userarg);
|
typedef void (*getdns_eventloop_callback)(void *userarg);
|
||||||
|
|
||||||
/* context extension event data */
|
|
||||||
typedef struct getdns_eventloop_event {
|
typedef struct getdns_eventloop_event getdns_eventloop_event;
|
||||||
|
/**
|
||||||
|
* getdns uses an event loop abstraction layer to interface with event loop
|
||||||
|
* extensions. The extension accepts registration of getdns_eventloop_events
|
||||||
|
* and translates them to the underlying event loop API for which it is an
|
||||||
|
* extension. Also applications using getdns can use the abstraction layer
|
||||||
|
* themselves and in doing so inherit the flexibility being immediately
|
||||||
|
* compatible with all the event loop systems for which there is an extension
|
||||||
|
* already (i.e. libevent, libev and libuv).
|
||||||
|
*/
|
||||||
|
struct getdns_eventloop_event {
|
||||||
|
/**
|
||||||
|
* The userarg argument that will be passed to the
|
||||||
|
* getdns_eventloop_callbacks when they are fired.
|
||||||
|
*/
|
||||||
void *userarg;
|
void *userarg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When not NULL, it will be fired when the associated file descriptor
|
||||||
|
* is readable.
|
||||||
|
*/
|
||||||
getdns_eventloop_callback read_cb;
|
getdns_eventloop_callback read_cb;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When not NULL, it will be fired when the associated file descriptor
|
||||||
|
* is writable.
|
||||||
|
*/
|
||||||
getdns_eventloop_callback write_cb;
|
getdns_eventloop_callback write_cb;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When not NULL, it will be fired when the during scheduling specified
|
||||||
|
* timeout time has passed.
|
||||||
|
*/
|
||||||
getdns_eventloop_callback timeout_cb;
|
getdns_eventloop_callback timeout_cb;
|
||||||
|
|
||||||
/* Pointer to the underlying event
|
/**
|
||||||
* that the eventloop extension will create and free.
|
* Pointer to the underlying event
|
||||||
|
* that an eventloop extension must manage (i.e. create and free.)
|
||||||
*/
|
*/
|
||||||
void *ev;
|
void *ev;
|
||||||
} getdns_eventloop_event;
|
};
|
||||||
|
|
||||||
typedef struct getdns_eventloop_vmt getdns_eventloop_vmt;
|
typedef struct getdns_eventloop_vmt getdns_eventloop_vmt;
|
||||||
|
/**
|
||||||
|
* The manifestation of the event loop abstraction layer. Event loop
|
||||||
|
* extension implementers should extend this with attributed needed for the
|
||||||
|
* underlying event loop.
|
||||||
|
* The current event loop extension can be obtained with the
|
||||||
|
* getdns_context_get_eventloop() function.
|
||||||
|
*/
|
||||||
typedef struct getdns_eventloop {
|
typedef struct getdns_eventloop {
|
||||||
|
/**
|
||||||
|
* The Virtual Method Table providing the interface for this specific
|
||||||
|
* event loop extension.
|
||||||
|
*/
|
||||||
getdns_eventloop_vmt *vmt;
|
getdns_eventloop_vmt *vmt;
|
||||||
} getdns_eventloop;
|
} getdns_eventloop;
|
||||||
|
|
||||||
/* A prototype for a method having no arguments and not return value. */
|
/**
|
||||||
|
* The function prototype for the `cleanup` and `run` functions in an getdns
|
||||||
|
* event loop's Virtual Method Table. These methods have no (extra) arguments
|
||||||
|
* and return nothing.
|
||||||
|
* @param loop The event loop to `run` or `cleanup`
|
||||||
|
*/
|
||||||
typedef void (*getdns_eventloop_noargs)(getdns_eventloop *loop);
|
typedef void (*getdns_eventloop_noargs)(getdns_eventloop *loop);
|
||||||
|
|
||||||
/* Call the extension to schedule an event
|
/**
|
||||||
*
|
* The function prototype for the `schedule` function in an event loop
|
||||||
|
* Virtual Method Table.
|
||||||
* The getdns_eventloop_event must be provided by the caller with the callbacks
|
* The getdns_eventloop_event must be provided by the caller with the callbacks
|
||||||
* and userarg therein already supplied (by the caller). This function will set
|
* and userarg therein already supplied (by the caller). This function will set
|
||||||
* the ev pointer (in the getdns_eventloop_event) to refer to the underlying
|
* the ev pointer (in the getdns_eventloop_event) to refer to the underlying
|
||||||
* (extension) event.
|
* (extension) event.
|
||||||
|
* @param loop The event loop for which to register the event.
|
||||||
|
* @param fd The file descriptor for which to schedule the read_cb and/or
|
||||||
|
* write_cb callbacks.
|
||||||
|
* @param timeout The number of milliseconds that must pass without read
|
||||||
|
* and/or write event after which the timeout_cb callback is fired.
|
||||||
|
* @param ev The event with all attributes provisioned, except for the ev->ev
|
||||||
|
* attribute, which will be provisioned by the implementation of
|
||||||
|
* the schedule method.
|
||||||
|
* @return GETDNS_RETURN_GOOD when successful and an error code otherwise.
|
||||||
*/
|
*/
|
||||||
typedef getdns_return_t (*getdns_eventloop_schedule)(getdns_eventloop *loop,
|
typedef getdns_return_t (*getdns_eventloop_schedule)(getdns_eventloop *loop,
|
||||||
int fd, uint64_t timeout, getdns_eventloop_event *ev);
|
int fd, uint64_t timeout, getdns_eventloop_event *ev);
|
||||||
|
|
||||||
/* Call the extension to clean a scheduled event */
|
/**
|
||||||
|
* The function prototype for the `clean` function in an event loop
|
||||||
|
* Virtual Method Table.
|
||||||
|
* The implementation must clear the event (which is referred to with
|
||||||
|
* ev->ev) in the underlying event loop and make ev->ev NULL when done.
|
||||||
|
* getdns will test for this value to determine if events are scheduled or not.
|
||||||
|
* @param loop The event loop for which to event needs to be cleared.
|
||||||
|
* @param ev [in,out] The event with the ev->ev attribute referring to the
|
||||||
|
* underlying event. ev->ev must be set to NULL after the event
|
||||||
|
* was cleared.
|
||||||
|
* @return GETDNS_RETURN_GOOD when successful and an error code otherwise.
|
||||||
|
*/
|
||||||
typedef getdns_return_t (*getdns_eventloop_clear)
|
typedef getdns_return_t (*getdns_eventloop_clear)
|
||||||
(getdns_eventloop *loop, getdns_eventloop_event *ev);
|
(getdns_eventloop *loop, getdns_eventloop_event *ev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The function prototype for the `run_once` function in an event loop
|
||||||
|
* Virtual Method Table. The implementation must do a single round of
|
||||||
|
* firing callbacks, either blocking or not.
|
||||||
|
* @param loop The event loop to run
|
||||||
|
* @param blocking When 0, only callbacks for file descriptors that are
|
||||||
|
* immediately readable or writable or timeouts that have
|
||||||
|
* passed will be fired. When 1, the eventloop will wait
|
||||||
|
* until the first callback can be fired, either because a
|
||||||
|
* associated file descriptor has become readable or writeable,
|
||||||
|
* or because a timeout time passed.
|
||||||
|
*/
|
||||||
typedef void (*getdns_eventloop_run_once)(getdns_eventloop *loop,int blocking);
|
typedef void (*getdns_eventloop_run_once)(getdns_eventloop *loop,int blocking);
|
||||||
|
|
||||||
/* Virtual Method Table */
|
/**
|
||||||
|
* The Virtual Method Table providing the interface for this specific
|
||||||
|
* event loop extension.
|
||||||
|
*/
|
||||||
struct getdns_eventloop_vmt {
|
struct getdns_eventloop_vmt {
|
||||||
|
/**
|
||||||
|
* Destroy the getdns_eventloop and the associated underlying event
|
||||||
|
* loop for which it is an extension.
|
||||||
|
*/
|
||||||
getdns_eventloop_noargs cleanup;
|
getdns_eventloop_noargs cleanup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule a getdns_eventloop_event with a getdns_eventloop.
|
||||||
|
*/
|
||||||
getdns_eventloop_schedule schedule;
|
getdns_eventloop_schedule schedule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear a getdns_eventloop_event
|
||||||
|
*/
|
||||||
getdns_eventloop_clear clear;
|
getdns_eventloop_clear clear;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the getdns_eventloop until it has no getdns_eventloop_events
|
||||||
|
* scheduled.
|
||||||
|
*/
|
||||||
getdns_eventloop_noargs run;
|
getdns_eventloop_noargs run;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do a single iteration of firing callbacks for scheduled events
|
||||||
|
* and then return.
|
||||||
|
*/
|
||||||
getdns_eventloop_run_once run_once;
|
getdns_eventloop_run_once run_once;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* set an event loop extension on the context */
|
/**
|
||||||
|
* Configure a context to use the specified event loop abstraction extension.
|
||||||
|
* This function must be called with an provisioned eventloop by the
|
||||||
|
* event loop extension registration functions.
|
||||||
|
* @param context The context to configure
|
||||||
|
* @param eventloop The event loop abstraction extension with a completely
|
||||||
|
* provisioned Virtual Method Table and other associated
|
||||||
|
* data which is opaque to the user.
|
||||||
|
* @return GETDNS_RETURN_GOOD when successful
|
||||||
|
* @return GETDNS_RETURN_INVALID_PARAMETER when context or eventloop were NULL.
|
||||||
|
*/
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_context_set_eventloop(getdns_context* context,
|
getdns_context_set_eventloop(getdns_context* context,
|
||||||
getdns_eventloop *eventloop);
|
getdns_eventloop *eventloop);
|
||||||
|
|
||||||
/* get the currently active (pluggable) eventloop from the context */
|
/**
|
||||||
|
* Get the current event loop abstraction extension from the context
|
||||||
|
* Applications using getdns can use the event loop abstraction extension
|
||||||
|
* themselves directly to inherit the flexibility being immediately
|
||||||
|
* compatible with all the event loop systems for which there is an extension
|
||||||
|
* (i.e. libevent, libev and libuv).
|
||||||
|
* @param context [in] The context to get the eventloop from
|
||||||
|
* @param eventloop [out] The currently active event loop abstraction extension
|
||||||
|
* @return GETDNS_RETURN_GOOD when successful
|
||||||
|
* @return GETDNS_RETURN_INVALID_PARAMETER when context or evenloop were NULL
|
||||||
|
*/
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_context_get_eventloop(getdns_context* context,
|
getdns_context_get_eventloop(getdns_context* context,
|
||||||
getdns_eventloop **eventloop);
|
getdns_eventloop **eventloop);
|
||||||
|
|
||||||
/* detach the eventloop from the context */
|
/**
|
||||||
|
* Detach the eventloop from the context. Resets the context with the default
|
||||||
|
* event loop based on poll(). WARNING! Do not use this function. It is For
|
||||||
|
* internal use only and may disappear in future releases.
|
||||||
|
* @param context The context to reset to default event loop usage
|
||||||
|
* @return GETDNS_RETURN_GOOD when successful
|
||||||
|
* @return GETDNS_RETURN_INVALID_PARAMETER when context is NULL
|
||||||
|
*/
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_context_detach_eventloop(getdns_context *context);
|
getdns_context_detach_eventloop(getdns_context *context);
|
||||||
|
|
||||||
/* Run the context's event loop until nothing more to do */
|
/**
|
||||||
|
* Run the context's event loop until nothing more to do.
|
||||||
|
* This is equivalend to:
|
||||||
|
* ```c
|
||||||
|
* if (getdns_context_get_eventloop(context, &loop) == GETDNS_RETURN_GOOD)
|
||||||
|
* loop->vmt->run(loop);
|
||||||
|
* ```
|
||||||
|
* @param context The context which event loop to run.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
getdns_context_run(getdns_context *context);
|
getdns_context_run(getdns_context *context);
|
||||||
/** @}
|
/** @}
|
||||||
|
|
Loading…
Reference in New Issue