00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __include_event_event_h__
00021 #define __include_event_event_h__
00022
00159 #undef EV_BEGIN_C_DECLS
00160 #undef EV_END_C_DECLS
00161 #ifdef __cplusplus
00162 # define EV_BEGIN_C_DECLS extern "C" {
00163 # define EV_END_C_DECLS }
00164 #else
00165 # define EV_BEGIN_C_DECLS
00166 # define EV_END_C_DECLS
00167 #endif
00168
00189 #include <errno.h>
00190 #include <stdlib.h>
00191 #include <treeconf/treeconf.h>
00192
00193 EV_BEGIN_C_DECLS
00194
00195 #ifndef __EVENT_LIBRARY__
00196 # include <event/event_err.h>
00197 # include <event/event_version.h>
00198 # include <event/gcc-attrs.h>
00199 #endif
00200
00208 typedef struct _ev_ctx_s ev_ctx_t;
00209
00216 typedef struct _ev_englist_s _ev_englist_t;
00217
00225 typedef struct _ev_attr_s *ev_attr_t;
00226
00233 typedef struct _event_s event_t;
00234
00242 typedef struct _ev_genhdr_s ev_genhdr_t;
00243
00252 typedef enum {
00253 ET_NONE,
00254 ET_READ,
00255 ET_WRITE,
00256 ET_ACCEPT,
00257 ET_CONNECT,
00258 ET_EOF,
00259 ET_ERROR,
00260 ET_SIGNAL,
00261 ET_EXPIRE,
00263 ET_RESERVED = 100,
00265 ET_USER = 1000
00266 } ev_type_t;
00267
00273 typedef enum {
00274 EP_NONE,
00275 EP_INT,
00276 EP_PTR
00277 } ev_paramtype_t;
00278
00289 typedef enum {
00290 EGT_NONE,
00292 EGT_SOCKET,
00293 EGT_SIGNAL,
00294 EGT_TIMER,
00296 EGT_RESERVED = 10,
00298 EGT_USER = 100
00299 } ev_gentype_t;
00300
00309 typedef unsigned int ev_err_t;
00310
00315 typedef unsigned long ev_magic_t;
00316
00323 typedef unsigned long ev_flags_t;
00324
00341 typedef void (*ev_call_t)(ev_ctx_t *ctx, event_t *event, void *data);
00342
00361 typedef void (*ev_log_t)(const char *file, int line, const char *func,
00362 const char *msg);
00363
00375 typedef void (*ev_freegen_t)(ev_ctx_t *ctx, void *gen);
00376
00382 struct _ev_englist_s {
00383 struct _ev_engine_s *el_first;
00384 struct _ev_engine_s *el_last;
00385 };
00386
00392 struct _ev_ctx_s {
00393 ev_magic_t ec_magic;
00394 ev_flags_t ec_flags;
00395 const char *ec_prog;
00396 treeconf_ctx_t ec_conf;
00397 unsigned int ec_maxgen;
00398 struct _ev_gens_s *ec_gens;
00399 struct {
00400 struct _ev_tim_s *tt_root;
00401 struct _ev_tim_s *tt_insert;
00402 } ec_timtree;
00403 struct _ev_engine_s *ec_engine;
00404 _ev_englist_t ec_socket;
00405 _ev_englist_t ec_signal;
00406 _ev_englist_t ec_timer;
00407 unsigned int ec_evcnt;
00408 event_t *ec_evs;
00409 };
00410
00415 #define EV_CTX_MAGIC 0xf3d94057
00416
00423 #define EV_CTX_SECURE 0x00000001
00424
00429 #define EV_CTX_RUNNING 0x00000002
00430
00443 #define ec_verify(ctx) ((ctx) && (ctx)->ec_magic == EV_CTX_MAGIC)
00444
00453 #define ec_flags(ctx) ((ctx)->ec_flags)
00454
00465 #define ec_prog(ctx) ((ctx)->ec_prog)
00466
00478 #define ec_conf(ctx) (&((ctx)->ec_conf))
00479
00485 struct _event_s {
00486 ev_magic_t ev_magic;
00487 ev_ctx_t *ev_context;
00488 event_t *ev_next;
00489 event_t *ev_prev;
00490 unsigned int ev_type;
00491 ev_flags_t ev_flags;
00492 ev_genhdr_t *ev_generator;
00493 ev_paramtype_t ev_paramtype;
00494 union {
00495 unsigned int evp_int;
00496 void *evp_ptr;
00497 } ev_param;
00498 };
00499
00504 #define EVENT_MAGIC 0x7bf8ac57
00505
00518 #define ev_verify(event) ((event) && (event)->ev_magic == EVENT_MAGIC)
00519
00528 #define ev_context(event) ((event)->ev_context)
00529
00539 #define ev_type(event) ((event)->ev_type)
00540
00551 #define ev_generator(event) ((event)->ev_generator)
00552
00563 #define ev_paramtype(event) ((event)->ev_paramtype)
00564
00573 #define ev_intparam(event) ((event)->ev_param.evp_int)
00574
00583 #define ev_ptrparam(event) ((event)->ev_param.evp_ptr)
00584
00591 struct _ev_genhdr_s {
00592 ev_magic_t eg_magic;
00593 unsigned int eg_type;
00594 ev_flags_t eg_flags;
00595 ev_genhdr_t *eg_next;
00596 ev_genhdr_t *eg_prev;
00597 ev_ctx_t *eg_context;
00598 unsigned int eg_ref;
00599 ev_call_t eg_callback;
00600 void *eg_calldata;
00601 union {
00602 int egd_int;
00603 void *egd_ptr;
00604 } eg_engdata;
00605 };
00606
00612 #define EV_GEN_ACTIVE 0x00000001
00613
00619 #define EV_GEN_DELETED 0x00000002
00620
00632 #define _eg_hdr(gen) ((ev_genhdr_t *)(gen))
00633
00648 #define eg_verify(gen, magic) ((gen) && _eg_hdr(gen)->eg_magic == (magic))
00649
00662 #define eg_type(gen) ((gen) ? _eg_hdr(gen)->eg_type : EGT_NONE)
00663
00672 #define eg_flags(gen) (_eg_hdr(gen)->eg_flags)
00673
00682 #define eg_flags_set(gen, fl) (_eg_hdr(gen)->eg_flags |= (fl))
00683
00692 #define eg_flags_clr(gen, fl) (_eg_hdr(gen)->eg_flags &= ~(fl))
00693
00703 #define eg_next(gen) (_eg_hdr(gen)->eg_next)
00704
00714 #define eg_prev(gen) (_eg_hdr(gen)->eg_prev)
00715
00725 #define eg_context(gen) (_eg_hdr(gen)->eg_context)
00726
00736 #define eg_ref(gen) (_eg_hdr(gen)->eg_ref)
00737
00746 #define eg_ref_inc(ctx, gen) (_eg_hdr(gen)->eg_ref++)
00747
00757 #define eg_ref_dec(ctx, gen) \
00758 do { \
00759 ev_genhdr_t *_gen = _eg_hdr(gen); \
00760 if (_gen->eg_ref && !--_gen->eg_ref && (_gen->eg_flags & EV_GEN_DELETED)) \
00761 event_gen_release((ctx), _gen); \
00762 } while (0)
00763
00773 #define eg_callback(gen) (_eg_hdr(gen)->eg_callback)
00774
00783 #define eg_callback_set(gen, call) \
00784 (_eg_hdr(gen)->eg_callback = (call))
00785
00797 #define eg_calldata(gen) (_eg_hdr(gen)->eg_calldata)
00798
00808 #define eg_calldata_set(gen, data) \
00809 (_eg_hdr(gen)->eg_calldata = (data))
00810
00851 extern ev_err_t event_init(ev_ctx_t *ctx, const ev_attr_t *attr,
00852 ev_flags_t flags, const char *prog,
00853 const char *envpath)
00854 _gca_nonnull((1)) _gca_useresult;
00855
00870 extern ev_err_t event_destroy(ev_ctx_t *ctx)
00871 _gca_nonnull((1));
00872
00880 #define EV_INIT_SECURE EV_CTX_SECURE
00881
00898 extern ev_err_t event_attr_init(ev_attr_t *attr)
00899 _gca_nonnull((1));
00900
00924 extern ev_err_t event_attr_confpath(ev_attr_t *attr, const char **path)
00925 _gca_nonnull((1, 2));
00926
00950 extern ev_err_t event_attr_libpath(ev_attr_t *attr, const char **path)
00951 _gca_nonnull((1, 2));
00952
00976 extern ev_err_t event_attr_modlist(ev_attr_t *attr, const char **list)
00977 _gca_nonnull((1, 2));
00978
01011 extern ev_err_t event_attr_confreg(ev_attr_t *attr, const char *name,
01012 const char *def,
01013 treeconf_nodown_t nodown,
01014 treeconf_change_t change, void *assoc)
01015 _gca_nonnull((1, 2));
01016
01039 extern ev_err_t event_attr_confvar(ev_attr_t *attr, const char *name,
01040 const char *value)
01041 _gca_nonnull((1, 2));
01042
01054 extern ev_err_t event_attr_destroy(ev_attr_t *attr)
01055 _gca_nonnull((1));
01056
01081 extern ev_err_t event_gen_register(ev_ctx_t *ctx, unsigned int gentype,
01082 ev_magic_t genmagic, size_t gensize,
01083 ev_freegen_t genrel)
01084 _gca_nonnull((1));
01085
01111 extern ev_err_t event_gen_alloc(ev_ctx_t *ctx, unsigned int gentype, void *gen)
01112 _gca_nonnull((1, 3));
01113
01131 extern ev_err_t event_gen_release(ev_ctx_t *ctx, ev_genhdr_t *gen)
01132 _gca_nonnull((1, 2));
01133
01145 extern ev_err_t event_log_set(ev_log_t logger);
01146
01157 extern ev_err_t event_log_reset(void);
01158
01171 extern ev_err_t event_log_debug(int onoff);
01172
01186 extern ev_err_t event_log_trace(int onoff);
01187
01204 extern ev_err_t event_log_abort(int onoff);
01205
01206 EV_END_C_DECLS
01207
01210 #endif