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 #define AE_OK 0 37 #define AE_ERR -1 38 39 #define AE_NONE 0 40 #define AE_READABLE 1 41 #define AE_WRITABLE 2 42 43 #define AE_FILE_EVENTS 1 44 #define AE_TIME_EVENTS 2 45 #define AE_ALL_EVENTS (AE_FILE_EVENTS|AE_TIME_EVENTS) 46 #define AE_DONT_WAIT 4 47 48 #define AE_NOMORE -1 49 50 /* Macros */ 51 #define AE_NOTUSED(V) ((void) V) 52 53 struct aeEventLoop; 54 55 /* Types and data structures */ 56 typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask); 57 typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *clientData); 58 typedef void aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData); 59 typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop); 60 61 /* File event structure */ 62 typedef struct aeFileEvent { 63 int mask; /* one of AE_(READABLE|WRITABLE) */ 64 aeFileProc *rfileProc; 65 aeFileProc *wfileProc; 66 void *clientData; 67 } aeFileEvent; 68 69 /* Time event structure */ 70 typedef struct aeTimeEvent { 71 long long id; /* time event identifier. */ 72 long when_sec; /* seconds */ 73 long when_ms; /* milliseconds */ 74 aeTimeProc *timeProc; 75 aeEventFinalizerProc *finalizerProc; 76 void *clientData; 77 struct aeTimeEvent *next; 78 } aeTimeEvent; 79 80 /* A fired event */ 81 typedef struct aeFiredEvent { 82 int fd; 83 int mask; 84 } aeFiredEvent; 85 86 /* State of an event based program */ 87 typedef struct aeEventLoop { 88 int maxfd; /* highest file descriptor currently registered */ 89 int setsize; /* max number of file descriptors tracked */ 90 long long timeEventNextId; 91 time_t lastTime; /* Used to detect system clock skew */ 92 aeFileEvent *events; /* Registered events */ 93 aeFiredEvent *fired; /* Fired events */ 94 aeTimeEvent *timeEventHead; 95 int stop; 96 void *apidata; /* This is used for polling API specific data */ 97 aeBeforeSleepProc *beforesleep; 98 } aeEventLoop; 99 100 /* Prototypes */ 101 aeEventLoop *aeCreateEventLoop(int setsize); 102 void aeDeleteEventLoop(aeEventLoop *eventLoop); 103 void aeStop(aeEventLoop *eventLoop); 104 int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, 105 aeFileProc *proc, void *clientData); 106 void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask); 107 int aeGetFileEvents(aeEventLoop *eventLoop, int fd); 108 long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds, 109 aeTimeProc *proc, void *clientData, 110 aeEventFinalizerProc *finalizerProc); 111 int aeDeleteTimeEvent(aeEventLoop *eventLoop, long long id); 112 int aeProcessEvents(aeEventLoop *eventLoop, int flags); 113 int aeWait(int fd, int mask, long long milliseconds); 114 void aeMain(aeEventLoop *eventLoop); 115 char *aeGetApiName(void); 116 void aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *beforesleep); 117 int aeGetSetSize(aeEventLoop *eventLoop); 118 int aeResizeSetSize(aeEventLoop *eventLoop, int setsize); 119 120 #endif 121