1 /* A simple event-driven programming library. Originally I wrote this code 2 * for the Jim's event-loop (Jim is a Tcl interpreter) but later translated 3 * it in form of a library for easy reuse. 4 * 5 * Copyright (c) 2006-2012, Salvatore Sanfilippo <antirez at gmail dot com> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are met: 10 * 11 * * Redistributions of source code must retain the above copyright notice, 12 * this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * * Neither the name of Redis nor the names of its contributors may be used 17 * to endorse or promote products derived from this software without 18 * specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #ifndef __AE_H__ 34 #define __AE_H__ 35 36 #include <time.h> 37 38 #define AE_OK 0 39 #define AE_ERR -1 40 41 #define AE_NONE 0 42 #define AE_READABLE 1 43 #define AE_WRITABLE 2 44 45 #define AE_FILE_EVENTS 1 46 #define AE_TIME_EVENTS 2 47 #define AE_ALL_EVENTS (AE_FILE_EVENTS|AE_TIME_EVENTS) 48 #define AE_DONT_WAIT 4 49 50 #define AE_NOMORE -1 51 #define AE_DELETED_EVENT_ID -1 52 53 /* Macros */ 54 #define AE_NOTUSED(V) ((void) V) 55 56 struct aeEventLoop; 57 58 /* Types and data structures */ 59 typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask); 60 typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *clientData); 61 typedef void aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData); 62 typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop); 63 64 /* File event structure */ 65 typedef struct aeFileEvent { 66 int mask; /* one of AE_(READABLE|WRITABLE) */ 67 aeFileProc *rfileProc; 68 aeFileProc *wfileProc; 69 void *clientData; 70 } aeFileEvent; 71 72 /* Time event structure */ 73 typedef struct aeTimeEvent { 74 long long id; /* time event identifier. */ 75 long when_sec; /* seconds */ 76 long when_ms; /* milliseconds */ 77 aeTimeProc *timeProc; 78 aeEventFinalizerProc *finalizerProc; 79 void *clientData; 80 struct aeTimeEvent *next; 81 } aeTimeEvent; 82 83 /* A fired event */ 84 typedef struct aeFiredEvent { 85 int fd; 86 int mask; 87 } aeFiredEvent; 88 89 /* State of an event based program */ 90 typedef struct aeEventLoop { 91 int maxfd; /* highest file descriptor currently registered */ 92 int setsize; /* max number of file descriptors tracked */ 93 long long timeEventNextId; 94 time_t lastTime; /* Used to detect system clock skew */ 95 aeFileEvent *events; /* Registered events */ 96 aeFiredEvent *fired; /* Fired events */ 97 aeTimeEvent *timeEventHead; 98 int stop; 99 void *apidata; /* This is used for polling API specific data */ 100 aeBeforeSleepProc *beforesleep; 101 } aeEventLoop; 102 103 /* Prototypes */ 104 aeEventLoop *aeCreateEventLoop(int setsize); 105 void aeDeleteEventLoop(aeEventLoop *eventLoop); 106 void aeStop(aeEventLoop *eventLoop); 107 int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, 108 aeFileProc *proc, void *clientData); 109 void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask); 110 int aeGetFileEvents(aeEventLoop *eventLoop, int fd); 111 long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds, 112 aeTimeProc *proc, void *clientData, 113 aeEventFinalizerProc *finalizerProc); 114 int aeDeleteTimeEvent(aeEventLoop *eventLoop, long long id); 115 int aeProcessEvents(aeEventLoop *eventLoop, int flags); 116 int aeWait(int fd, int mask, long long milliseconds); 117 void aeMain(aeEventLoop *eventLoop); 118 char *aeGetApiName(void); 119 void aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *beforesleep); 120 int aeGetSetSize(aeEventLoop *eventLoop); 121 int aeResizeSetSize(aeEventLoop *eventLoop, int setsize); 122 123 #endif 124