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-2010, 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_SETSIZE (1024*10) /* Max number of fd supported */ 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 52 /* Macros */ 53 #define AE_NOTUSED(V) ((void) V) 54 55 struct aeEventLoop; 56 57 /* Types and data structures */ 58 typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask); 59 typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *clientData); 60 typedef void aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData); 61 typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop); 62 63 /* File event structure */ 64 typedef struct aeFileEvent { 65 int mask; /* one of AE_(READABLE|WRITABLE) */ 66 aeFileProc *rfileProc; 67 aeFileProc *wfileProc; 68 void *clientData; 69 } aeFileEvent; 70 71 /* Time event structure */ 72 typedef struct aeTimeEvent { 73 long long id; /* time event identifier. */ 74 long when_sec; /* seconds */ 75 long when_ms; /* milliseconds */ 76 aeTimeProc *timeProc; 77 aeEventFinalizerProc *finalizerProc; 78 void *clientData; 79 struct aeTimeEvent *next; 80 } aeTimeEvent; 81 82 /* A fired event */ 83 typedef struct aeFiredEvent { 84 int fd; 85 int mask; 86 } aeFiredEvent; 87 88 /* State of an event based program */ 89 typedef struct aeEventLoop { 90 int maxfd; 91 long long timeEventNextId; 92 aeFileEvent events[AE_SETSIZE]; /* Registered events */ 93 aeFiredEvent fired[AE_SETSIZE]; /* 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(void); 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 long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds, 108 aeTimeProc *proc, void *clientData, 109 aeEventFinalizerProc *finalizerProc); 110 int aeDeleteTimeEvent(aeEventLoop *eventLoop, long long id); 111 int aeProcessEvents(aeEventLoop *eventLoop, int flags); 112 int aeWait(int fd, int mask, long long milliseconds); 113 void aeMain(aeEventLoop *eventLoop); 114 char *aeGetApiName(void); 115 void aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *beforesleep); 116 117 #endif 118