]>
git.saurik.com Git - redis.git/blob - src/ae.h
   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. 
   5  * Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com> 
   8  * Redistribution and use in source and binary forms, with or without 
   9  * modification, are permitted provided that the following conditions are met: 
  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. 
  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. 
  36 #define AE_SETSIZE (1024*10)    /* Max number of fd supported */ 
  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 
  53 #define AE_NOTUSED(V) ((void) V) 
  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
); 
  63 /* File event structure */ 
  64 typedef struct aeFileEvent 
{ 
  65     int mask
; /* one of AE_(READABLE|WRITABLE) */ 
  66     aeFileProc 
*rfileProc
; 
  67     aeFileProc 
*wfileProc
; 
  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 */ 
  77     aeEventFinalizerProc 
*finalizerProc
; 
  79     struct aeTimeEvent 
*next
; 
  83 typedef struct aeFiredEvent 
{ 
  88 /* State of an event based program */ 
  89 typedef struct aeEventLoop 
{ 
  91     long long timeEventNextId
; 
  92     aeFileEvent events
[AE_SETSIZE
]; /* Registered events */ 
  93     aeFiredEvent fired
[AE_SETSIZE
]; /* Fired events */ 
  94     aeTimeEvent 
*timeEventHead
; 
  96     void *apidata
; /* This is used for polling API specific data */ 
  97     aeBeforeSleepProc 
*beforesleep
; 
 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
);