123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /* A simple event-driven programming library. Originally I wrote this code
- * for the Jim's event-loop (Jim is a Tcl interpreter) but later translated
- * it in form of a library for easy reuse.
- *
- * Copyright (c) 2006-2012, Salvatore Sanfilippo <antirez at gmail dot com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of Redis nor the names of its contributors may be used
- * to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
- #ifndef __AE_H__
- #define __AE_H__
- #include <time.h>
- #define AE_OK 0
- #define AE_ERR -1
- #define AE_NONE 0
- #define AE_READABLE 1
- #define AE_WRITABLE 2
- #define AE_FILE_EVENTS 1
- #define AE_TIME_EVENTS 2
- #define AE_ALL_EVENTS (AE_FILE_EVENTS | AE_TIME_EVENTS)
- #define AE_DONT_WAIT 4
- #define AE_CALL_AFTER_SLEEP 8
- #define AE_NOMORE -1
- #define AE_DELETED_EVENT_ID -1
- /* Macros */
- #define AE_NOTUSED(V) ((void) V)
- #define zmalloc malloc
- #define zfree free
- #define zrealloc realloc
- struct aeEventLoop;
- /* Types and data structures */
- typedef void aeFileProc(
- struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);
- typedef int aeTimeProc(
- struct aeEventLoop *eventLoop, long long id, void *clientData);
- typedef void aeEventFinalizerProc(
- struct aeEventLoop *eventLoop, void *clientData);
- typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop);
- /* File event structure */
- typedef struct aeFileEvent {
- int mask; /* one of AE_(READABLE|WRITABLE) */
- aeFileProc *rfileProc;
- aeFileProc *wfileProc;
- void *clientData;
- } aeFileEvent;
- /* Time event structure */
- typedef struct aeTimeEvent {
- long long id; /* time event identifier. */
- long when_sec; /* seconds */
- long when_ms; /* milliseconds */
- aeTimeProc *timeProc;
- aeEventFinalizerProc *finalizerProc;
- void *clientData;
- struct aeTimeEvent *next;
- } aeTimeEvent;
- /* A fired event */
- typedef struct aeFiredEvent {
- int fd;
- int mask;
- } aeFiredEvent;
- /* State of an event based program */
- typedef struct aeEventLoop {
- int maxfd; /* highest file descriptor currently registered */
- int setsize; /* max number of file descriptors tracked */
- long long timeEventNextId;
- time_t lastTime; /* Used to detect system clock skew */
- aeFileEvent *events; /* Registered events */
- aeFiredEvent *fired; /* Fired events */
- aeTimeEvent *timeEventHead;
- int stop;
- void *apidata; /* This is used for polling API specific data */
- aeBeforeSleepProc *beforesleep;
- aeBeforeSleepProc *aftersleep;
- } aeEventLoop;
- /* Prototypes */
- CS_API aeEventLoop *aeCreateEventLoop(int setsize);
- CS_API void aeDeleteEventLoop(aeEventLoop *eventLoop);
- CS_API void aeStop(aeEventLoop *eventLoop);
- CS_API int aeCreateFileEvent(
- aeEventLoop *eventLoop,
- int fd,
- int mask,
- aeFileProc *proc,
- void *clientData);
- CS_API void aeDeleteFileEvent(
- aeEventLoop *eventLoop, int fd, int mask);
- CS_API int aeGetFileEvents(aeEventLoop *eventLoop, int fd);
- CS_API long long aeCreateTimeEvent(
- aeEventLoop *eventLoop,
- long long milliseconds,
- aeTimeProc *proc,
- void *clientData,
- aeEventFinalizerProc *finalizerProc);
- CS_API int aeDeleteTimeEvent(aeEventLoop *eventLoop, long long id);
- CS_API int aeProcessEvents(aeEventLoop *eventLoop, int flags);
- CS_API int aeWait(int fd, int mask, long long milliseconds);
- CS_API void aeMain(aeEventLoop *eventLoop);
- CS_API char *aeGetApiName(void);
- CS_API void aeSetBeforeSleepProc(
- aeEventLoop *eventLoop,
- aeBeforeSleepProc *beforesleep);
- CS_API void aeSetAfterSleepProc(
- aeEventLoop *eventLoop,
- aeBeforeSleepProc *aftersleep);
- CS_API int aeGetSetSize(aeEventLoop *eventLoop);
- CS_API int aeResizeSetSize(aeEventLoop *eventLoop, int setsize);
- #endif
|