00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __include_event_engines_h__
00021 #define __include_event_engines_h__
00022
00037 #ifndef __EVENT_LIBRARY__
00038 # include <event/event.h>
00039 # include <event/sock.h>
00040 # include <event/sig.h>
00041 # include <event/tim.h>
00042 #endif
00043
00044 EV_BEGIN_C_DECLS
00045
00046 struct timeval;
00047
00055 #if DOXYGEN
00056 #define ENGINE_MODULE
00057 #endif
00058
00068 #define _ev__p(l, r) l ## r
00069
00080 #define _ev_paste(l, r) _ev__p(l, r)
00081
00101 #if DOXYGEN
00102 extern ev_engine_t *engine_mod_init(ev_ctx_t *ctx);
00103 #else
00104 #define engine_mod_init _ev_paste(ENGINE_MODULE, _LTX_engine_mod_init)
00105 #endif
00106
00121 #if DOXYGEN
00122 extern ev_engine_t *engine_module;
00123 #else
00124 #define engine_module _ev_paste(ENGINE_MODULE, _LTX_engine_module)
00125 #endif
00126
00133 typedef struct _ev_engine_s ev_engine_t;
00134
00141 typedef struct _ev_englink_s _ev_englink_t;
00142
00150 typedef struct _ev_sockets_s _ev_sockets_t;
00151
00159 typedef struct _ev_signals_s _ev_signals_t;
00160
00168 typedef struct _ev_timers_s _ev_timers_t;
00169
00187 typedef ev_engine_t *(*ev_modinit_t)(ev_ctx_t *ctx);
00188
00205 typedef ev_err_t (*ev_init_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00206 ev_flags_t *eng_flags);
00207
00223 typedef ev_err_t (*ev_poll_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00224 struct timeval *timeout);
00225
00235 typedef void (*ev_fini_t)(ev_ctx_t *ctx, ev_engine_t *engine);
00236
00250 typedef ev_err_t (*ev_sockadd_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00251 ev_sock_t *sock);
00252
00266 typedef ev_err_t (*ev_sockrem_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00267 ev_sock_t *sock);
00268
00284 typedef ev_err_t (*ev_sockev_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00285 ev_sock_t *sock, ev_flags_t evs);
00286
00300 typedef ev_err_t (*ev_sigadd_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00301 ev_sig_t *sig);
00302
00316 typedef ev_err_t (*ev_sigrem_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00317 ev_sig_t *sig);
00318
00332 typedef ev_err_t (*ev_timadd_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00333 ev_tim_t *tim);
00334
00348 typedef ev_err_t (*ev_timrem_t)(ev_ctx_t *ctx, ev_engine_t *engine,
00349 ev_tim_t *tim);
00350
00356 struct _ev_englink_s {
00357 ev_engine_t *el_next;
00358 ev_engine_t *el_prev;
00359 };
00360
00366 struct _ev_sockets_s {
00367 _ev_englink_t eso_active;
00368 void *eso_data;
00369 ev_sockadd_t eso_add;
00370 ev_sockrem_t eso_rem;
00371 ev_sockev_t eso_ev;
00372 };
00373
00379 struct _ev_signals_s {
00380 _ev_englink_t esi_active;
00381 void *esi_data;
00382 ev_sigadd_t esi_add;
00383 ev_sigrem_t esi_rem;
00384 };
00385
00391 struct _ev_timers_s {
00392 _ev_englink_t eti_active;
00393 void *eti_data;
00394 ev_timadd_t eti_add;
00395 ev_timrem_t eti_rem;
00396 };
00397
00403 struct _ev_engine_s {
00404 ev_magic_t eng_magic;
00405 const char *eng_name;
00406 const char *eng_desc;
00407 ev_flags_t eng_flags;
00408 ev_flags_t eng_runfl;
00409 _ev_englink_t eng_list;
00410 void *eng_handle;
00411 void *eng_data;
00412 ev_init_t eng_init;
00413 ev_poll_t eng_poll;
00414 ev_fini_t eng_fini;
00415 _ev_sockets_t eng_socket;
00416 _ev_signals_t eng_signal;
00417 _ev_timers_t eng_timer;
00418 };
00419
00424 #define EV_ENGINE_MAGIC 0x909ca8e5
00425
00483 #define EV_ENGINE_INIT(name, desc, flags, init, poll, fini, so_add, so_rem, \
00484 so_ev, si_add, si_rem, ti_add, ti_rem) \
00485 { EV_ENGINE_MAGIC, (name), (desc), (flags), 0, { 0, 0 }, 0, \
00486 0, (init), (poll), (fini), \
00487 { { 0, 0 }, 0, (so_add), (so_rem), (so_ev) }, \
00488 { { 0, 0 }, 0, (si_add), (si_rem) }, \
00489 { { 0, 0 }, 0, (ti_add), (ti_rem) } }
00490
00499 #define EV_ENGINE_SOCKET 0x00000001
00500
00509 #define EV_ENGINE_SIGNAL 0x00000002
00510
00519 #define EV_ENGINE_TIMER 0x00000004
00520
00527 #define EV_ENGINE_COMPMASK (EV_ENGINE_SOCKET | EV_ENGINE_SIGNAL | \
00528 EV_ENGINE_TIMER)
00529
00535 #define EV_ENGINE_REGISTERED 0x00000008
00536
00542 #define EV_ENGINE_RUNNING 0x00000010
00543
00556 #define eng_verify(eng) ((eng) && (eng)->eng_magic == EV_ENGINE_MAGIC)
00557
00566 #define eng_name(eng) ((eng)->eng_name)
00567
00576 #define eng_desc(eng) ((eng)->eng_desc)
00577
00586 #define eng_flags(eng) ((eng)->eng_flags)
00587
00597 #define eng_runfl(eng) ((eng)->eng_runfl)
00598
00607 #define eng_runfl_set(eng, fl) ((eng)->eng_runfl |= (fl))
00608
00617 #define eng_runfl_clr(eng, fl) ((eng)->eng_runfl &= ~(fl))
00618
00628 #define eng_data(eng) ((eng)->eng_data)
00629
00639 #define eng_data_set(eng, data) ((eng)->eng_data = (data))
00640
00650 #define eng_sockdata(eng) ((eng)->eng_socket.eso_data)
00651
00661 #define eng_sockdata_set(eng, data) \
00662 ((eng)->eng_socket.eso_data = (data))
00663
00673 #define eng_sigdata(eng) ((eng)->eng_signal.esi_data)
00674
00684 #define eng_sigdata_set(eng, data) \
00685 ((eng)->eng_signal.esi_data = (data))
00686
00696 #define eng_timdata(eng) ((eng)->eng_timer.eti_data)
00697
00707 #define eng_timdata_set(eng, data) \
00708 ((eng)->eng_timer.eti_data = (data))
00709
00717 #define so_eevents_set(sock, flags) \
00718 _so_set((sock), _so_encev((flags), \
00719 _EV_SOCK_EEVENTS))
00720
00728 #define so_eevents_clr(sock, flags) \
00729 _so_clr((sock), _so_encev((flags), \
00730 _EV_SOCK_EEVENTS))
00731
00749 extern ev_err_t engine_register(ev_ctx_t *ctx, ev_engine_t *engine)
00750 _gca_nonnull((1, 2));
00751
00771 extern ev_err_t engine_activate(ev_ctx_t *ctx, ev_engine_t *engine,
00772 ev_flags_t comps)
00773 _gca_nonnull((1, 2));
00774
00794 extern ev_err_t event_attr_engine(ev_attr_t *attr, ev_engine_t *engine)
00795 _gca_nonnull((1, 2));
00796
00797 EV_END_C_DECLS
00798
00801 #endif