Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

event.h

Go to the documentation of this file.
00001 /*
00002 ** Copyright (C) 2005 by Kevin L. Mitchell <klmitch@mit.edu>
00003 **
00004 ** This program is free software; you can redistribute it and/or modify
00005 ** it under the terms of the GNU General Public License as published by
00006 ** the Free Software Foundation; either version 2 of the License, or
00007 ** (at your option) any later version.
00008 **
00009 ** This program is distributed in the hope that it will be useful,
00010 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 ** GNU General Public License for more details.
00013 **
00014 ** You should have received a copy of the GNU General Public License
00015 ** along with this program; if not, write to the Free Software
00016 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017 **
00018 ** @(#)$Id: event.h,v 1.30 2005/12/29 04:33:58 klmitch Exp $
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 /* empty */
00166 # define EV_END_C_DECLS   /* empty */
00167 #endif
00168 
00189 #include <errno.h> /* for EINVAL and friends */
00190 #include <stdlib.h> /* for size_t definition */
00191 #include <treeconf/treeconf.h> /* for treeconf_ctx_t definition */
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 /* __EVENT_LIBRARY__ */
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); /* release the generator */               \
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 /* __include_event_event_h__ */

Generated on Wed Dec 28 23:36:56 2005 for event by  doxygen 1.4.4