@{
*/ /** A regular event. Uses the evcb_callback callback */ #define EV_CLOSURE_EVENT 0 /** A signal event. Uses the evcb_callback callback */ #define EV_CLOSURE_EVENT_SIGNAL 1 /** A persistent non-signal event. Uses the evcb_callback callback */ #define EV_CLOSURE_EVENT_PERSIST 2 /** A simple callback. Uses the evcb_selfcb callback. */ #define EV_CLOSURE_CB_SELF 3 /** A finalizing callback. Uses the evcb_cbfinalize callback. */ #define EV_CLOSURE_CB_FINALIZE 4 /** A finalizing event. Uses the evcb_evfinalize callback. */ #define EV_CLOSURE_EVENT_FINALIZE 5 /** A finalizing event that should get freed after. Uses the evcb_evfinalize
* callback. */ #define EV_CLOSURE_EVENT_FINALIZE_FREE 6 /** @} */
/** Structure to define the backend of a given event_base. */ struct eventop { /** The name of this backend. */ const char *name; /** Function to set up an event_base to use this backend. It should *createanewstructureholdingwhateverinformationisneededto *runthebackend,andreturnit.Thereturnedpointerwillget *storedbyevent_initintotheevent_base.evbasefield.Onfailure,
* this function should return NULL. */ void *(*init)(struct event_base *); /** Enable reading/writing on a given fd or signal. 'events' will be *theeventsthatwe'retryingtoenable:oneormoreofEV_READ, *EV_WRITE,EV_SIGNAL,andEV_ET.'old'willbethoseeventsthat *wereenabledonthisfdpreviously.'fdinfo'willbeastructure *associatedwiththefdbytheevmap;itssizeisdefinedbythe *fdinfofieldbelow.Itwillbesetto0thefirsttimethefdis *added.Thefunctionshouldreturn0onsuccessand-1onerror.
*/
int (*add)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo); /** As "add", except 'events' contains the events we mean to disable. */
int (*del)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo); /** Function to implement the core of an event loop. It must see which addedeventsareready,andcauseevent_activetobecalledforeach activeevent(usuallyviaevent_io_activeorsuch).Itshould return0onsuccessand-1onerror.
*/
int (*dispatch)(struct event_base *, struct timeval *); /** Function to clean up and free our data from the event_base. */ void (*dealloc)(struct event_base *); /** Flag: set if we need to reinitialize the event base after we fork.
*/
int need_reinit; /** Bit-array of supported event_method_features that this backend can
* provide. */
enum event_method_feature features; /** Length of the extra information we should record for each fd that hasoneormoreactiveevents.Thisinformationisrecorded aspartoftheevmapentryforeachfd,andpassedasanargument totheaddanddelfunctionsabove.
*/
size_t fdinfo_len;
};
#ifdef _WIN32 /* If we're on win32, then file descriptors are not nice low densely packed integers.Instead,theyarepointer-likewindowshandles,andwewantto useahashtableinsteadofanarraytomapfdstoevents.
*/ #define EVMAP_USE_HT #endif
/* Used to map signal numbers to a list of events. If EVMAP_USE_HT is not defined,thisstructureisalsousedasevent_io_map,whichmapsfdstoa listofevents.
*/ struct event_signal_map { /* An array of evmap_io * or of evmap_signal *; empty entries are
* set to NULL. */ void **entries; /* The number of entries available in entries */
int nentries;
};
/* A list of events waiting on a given 'common' timeout value. Ordinarily, *eventswaitingforatimeoutwaitonaminheap.Sometimes,however,a *queuecanbefaster.
**/ struct common_timeout_list { /* List of events currently waiting in the queue. */ struct event_list events; /* 'magic' timeval used to indicate the duration of events in this
* queue. */ struct timeval duration; /* Event that triggers whenever one of the events in the queue is
* ready to activate */ struct event timeout_event; /* The event_base that this timeout list is part of */ struct event_base *base;
};
/** Mask used to get the real tv_usec value from a common timeout. */ #define COMMON_TIMEOUT_MICROSECONDS_MASK 0x000fffff
struct event_change;
/* List of 'changes' since the last call to eventop.dispatch. Only maintained
* if the backend is using changesets. */ struct event_changelist { struct event_change *changes;
int n_changes;
int changes_size;
};
#ifndef EVENT__DISABLE_DEBUG_MODE /* Global internal flag: set to one if debug mode is on. */
extern int event_debug_mode_on_; #define EVENT_DEBUG_MODE_IS_ON() (event_debug_mode_on_) #else #define EVENT_DEBUG_MODE_IS_ON() (0) #endif
TAILQ_HEAD(evcallback_list, event_callback);
/* Sets up an event for processing once */ struct event_once {
LIST_ENTRY(event_once) next_once; struct event ev;
struct event_base { /** Function pointers and other data to describe this event_base's
* backend. */ conststruct eventop *evsel; /** Pointer to backend-specific data. */ void *evbase;
/** List of changes to tell backend about at next dispatch. Only used
* by the O(1) backends. */ struct event_changelist changelist;
/** Function pointers used to describe the backend that this event_base
* uses for signals */ conststruct eventop *evsigsel; /** Data to implement the common signal handler code. */ struct evsig_info sig;
/** Number of virtual events */
int virtual_event_count; /** Maximum number of virtual events active */
int virtual_event_count_max; /** Number of total events added to this event_base */
int event_count; /** Maximum number of total events added to this event_base */
int event_count_max; /** Number of total events active in this event_base */
int event_count_active; /** Maximum number of total events active in this event_base */
int event_count_active_max;
/** Set if we should terminate the loop once we're done processing
* events. */
int event_gotterm; /** Set if we should terminate the loop immediately */
int event_break; /** Set if we should start a new instance of the loop immediately. */
int event_continue;
/** The currently running priority of events */
int event_running_priority;
/** Set if we're running the event_base_loop function, to prevent
* reentrant invocation. */
int running_loop;
/** Set to the number of deferred_cbs we've made 'active' in the *loop.Thisisahacktopreventstarvation;itwouldbesmarter *tojustuseevent_config_set_max_dispatch_interval'smax_callbacks
* feature */
int n_deferreds_queued;
/* Active event management. */ /** An array of nactivequeues queues for active event_callbacks (ones *thathavetriggered,andwhosecallbacksneedtobecalled).Low *prioritynumbersaremoreimportant,andstallhigherones.
*/ struct evcallback_list *activequeues; /** The length of the activequeues array */
int nactivequeues; /** A list of event_callbacks that should become active the next time
* we process events, but not this time. */ struct evcallback_list active_later_queue;
/* common timeout logic */
/** An array of common_timeout_list* for all of the common timeout
* values we know. */ struct common_timeout_list **common_timeout_queues; /** The number of entries used in common_timeout_queues */
int n_common_timeouts; /** The total size of common_timeout_queues. */
int n_common_timeouts_allocated;
/** Mapping from file descriptors to enabled (added) events */ struct event_io_map io;
/** Mapping from signal numbers to enabled (added) events. */ struct event_signal_map sigmap;
/** Priority queue of events with timeouts. */ struct min_heap timeheap;
/** Stored timeval: used to avoid calling gettimeofday/clock_gettime
* too often. */ struct timeval tv_cache;
struct evutil_monotonic_timer monotonic_timer;
/** Difference between internal time (maybe from clock_gettime) and
* gettimeofday. */ struct timeval tv_clock_diff; /** Second in which we last updated tv_clock_diff, in monotonic time. */
time_t last_updated_clock_diff;
#ifndef EVENT__DISABLE_THREAD_SUPPORT /* threading support */ /** The thread currently running the event_loop for this base */ unsigned long th_owner_id; /** A lock to prevent conflicting accesses to this event_base */ void *th_base_lock; /** A condition that gets signalled when we're done processing an
* event with waiters on it. */ void *current_event_cond; /** Number of threads blocking on current_event_cond. */
int current_event_waiters; #endif /** The event whose callback is executing right now */ struct event_callback *current_event;
#ifdef _WIN32 /** IOCP support structure, if IOCP is enabled. */ struct event_iocp_port *iocp; #endif
/** Flags that this base was configured with */
enum event_base_config_flag flags;
struct timeval max_dispatch_time;
int max_dispatch_callbacks;
int limit_callbacks_after_prio;
/* Notify main thread to wake up break, etc. */ /** True if the base already has a pending notify, and we don't need
* to add any more. */
int is_notify_pending; /** A socketpair used by some th_notify functions to wake up the main
* thread. */
evutil_socket_t th_notify_fd[2]; /** An event used by some th_notify functions to wake up the main
* thread. */ struct event th_notify; /** A function used to wake up the main thread from another thread. */
int (*th_notify_fn)(struct event_base *base);
/** Saved seed for weak random number generator. Some backends use
* this to produce fairness among sockets. Protected by th_base_lock. */ struct evutil_weakrand_state weakrand_seed;
/** List of event_onces that have not yet fired. */
LIST_HEAD(once_event_list, event_once) once_events;
/** Internal structure: describes the configuration we want for an event_base
* that we're about to allocate. */ struct event_config {
TAILQ_HEAD(event_configq, event_config_entry) entries;
int n_cpus_hint; struct timeval max_dispatch_interval;
int max_dispatch_callbacks;
int limit_callbacks_after_prio;
enum event_method_feature require_features;
enum event_base_config_flag flags;
};
/* Internal use only: Functions that might be missing from <sys/queue.h> */ #ifndef LIST_END #define LIST_END(head) NULL #endif
int evsig_set_handler_(struct event_base *base, int evsignal, void (*fn)(int));
int evsig_restore_handler_(struct event_base *base, int evsignal);
int event_add_nolock_(struct event *ev, conststruct timeval *tv, int tv_is_absolute); /** Argument for event_del_nolock_. Tells event_del not to block on the event
* if it's running in another thread. */ #define EVENT_DEL_NOBLOCK 0 /** Argument for event_del_nolock_. Tells event_del to block on the event *ifit'srunninginanotherthread,regardlessofitsvalueforEV_FINALIZE
*/ #define EVENT_DEL_BLOCK 1 /** Argument for event_del_nolock_. Tells event_del to block on the event *ifitisrunninginanotherthreadanditdoesn'thaveEV_FINALIZEset.
*/ #define EVENT_DEL_AUTOBLOCK 2 /** Argument for event_del_nolock_. Tells event_del to proceed even if the
* event is set up for finalization rather for regular use.*/ #define EVENT_DEL_EVEN_IF_FINALIZING 3
int event_del_nolock_(struct event *ev, int blocking);
int event_remove_timer_nolock_(struct event *ev);
void event_active_nolock_(struct event *ev, int res, short count);
EVENT2_EXPORT_SYMBOL
int event_callback_activate_(struct event_base *, struct event_callback *);
int event_callback_activate_nolock_(struct event_base *, struct event_callback *);
int event_callback_cancel_(struct event_base *base, struct event_callback *evcb);
/* Helper function: Call 'fn' exactly once every inserted or active event in *theevent_base'base'. * *Iffnreturns0,continueontothenextevent.Otherwise,returnthesame *valuethatfnreturned. * *Requiresthat'base'belocked.
*/
int event_base_foreach_event_nolock_(struct event_base *base,
event_base_foreach_event_cb cb, void *arg);
/* Cleanup function to reset debug mode during shutdown. * *Callingthisfunctiondoesn'tmeanit'llbepossibletore-enable *debugmodeifanyeventswereadded.
*/ void event_disable_debug_mode(void);
#ifdef __cplusplus
} #endif
#endif/* EVENT_INTERNAL_H_INCLUDED_ */
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-08-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.