学习C语言,一定要了解宏,开头这部分就是好了兼容不同平台,其余的代码主要还是状态位的设置:
- /* Include the best multiplexing layer supported by this system.
- * The following should be ordered by performances, descending. */
- #ifdef HAVE_EVPORT
- #include "ae_evport.c"
- #else
- #ifdef HAVE_EPOLL
- #include "ae_epoll.c"
- #else
- #ifdef HAVE_KQUEUE
- #include "ae_kqueue.c"
- #else
- #include "ae_select.c"
- #endif
- #endif
- #endif
-
-
- aeEventLoop *aeCreateEventLoop(int setsize) {
- aeEventLoop *eventLoop;
- int i;
-
- monotonicInit(); /* just in case the calling app didn't initialize */
-
- if ((eventLoop = zmalloc(sizeof(*eventLoop))) == NULL) goto err;
- eventLoop->events = zmalloc(sizeof(aeFileEvent)*setsize);
- eventLoop->fired = zmalloc(sizeof(aeFiredEvent)*setsize);
- if (eventLoop->events == NULL || eventLoop->fired == NULL) goto err;
- eventLoop->setsize = setsize;
- eventLoop->timeEventHead = NULL;
- eventLoop->timeEventNextId = 0;
- eventLoop->stop = 0;
- eventLoop->maxfd = -1;
- eventLoop->beforesleep = NULL;
- eventLoop->aftersleep = NULL;
- eventLoop->flags = 0;
- if (aeApiCreate(eventLoop) == -1) goto err;
- /* Events with mask == AE_NONE are not set. So let's initialize the
- * vector with it. */
- for (i = 0; i < setsize; i++)
- eventLoop->events[i].mask = AE_NONE;
- return eventLoop;
-
- err:
- if (eventLoop) {
- zfree(eventLoop->events);
- zfree(eventLoop->fired);
- zfree(eventLoop);
- }
- return NULL;
- }
-
- /* Return the current set size. */
- int aeGetSetSize(aeEventLoop *eventLoop) {
- return eventLoop->setsize;
- }
-
- /* Tells the next iteration/s of the event processing to set timeout of 0. */
- void aeSetDontWait(aeEventLoop *eventLoop, int noWait) {
- if (noWait)
- eventLoop->flags |= AE_DONT_WAIT;
- else
- eventLoop->flags &= ~AE_DONT_WAIT;
- }
-
- /* Resize the maximum set size of the event loop.
- * If the requested set size is smaller than the current set size, but
- * there is already a file descriptor in use that is >= the requested
- * set size minus one, AE_ERR is returned and the operation is not
- * performed at all.
- *
- * Otherwise AE_OK is returned and the operation is successful. */
- int aeResizeSetSize(aeEventLoop *eventLoop, int setsize) {
- int i;
-
- if (setsize == eventLoop->setsize) return AE_OK;
- if (eventLoop->maxfd >= setsize) return AE_ERR;
- if (aeApiResize(eventLoop,setsize) == -1) return AE_ERR;
-
- eventLoop->events = zrealloc(eventLoop->events,sizeof(aeFileEvent)*setsize);
- eventLoop->fired = zrealloc(eventLoop->fired,sizeof(aeFiredEvent)*setsize);
- eventLoop->setsize = setsize;
-
- /* Make sure that if we created new slots, they are initialized with
- * an AE_NONE mask. */
- for (i = eventLoop->maxfd+1; i < setsize; i++)
- eventLoop->events[i].mask = AE_NONE;
- return AE_OK;
- }
-
- void aeDeleteEventLoop(aeEventLoop *eventLoop) {
- aeApiFree(eventLoop);
- zfree(eventLoop->events);
- zfree(eventLoop->fired);
-
- /* Free the time events list. */
- aeTimeEvent *next_te, *te = eventLoop->timeEventHead;
- while (te) {
- next_te = te->next;
- zfree(te);
- te = next_te;
- }
- zfree(eventLoop);
- }
-
- void aeStop(aeEventLoop *eventLoop) {
- eventLoop->stop = 1;
- }
-
- int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,
- aeFileProc *proc, void *clientData)
- {
- if (fd >= eventLoop->setsize) {
- errno = ERANGE;
- return AE_ERR;
- }
- aeFileEvent *fe = &eventLoop->events[fd];
-
- if (aeApiAddEvent(eventLoop, fd, mask) == -1)
- return AE_ERR;
- fe->mask |= mask;
- if (mask & AE_READABLE) fe->rfileProc = proc;
- if (mask & AE_WRITABLE) fe->wfileProc = proc;
- fe->clientData = clientData;
- if (fd > eventLoop->maxfd)
- eventLoop->maxfd = fd;
- return AE_OK;
- }
-
- void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask)
- {
- if (fd >= eventLoop->setsize) return;
- aeFileEvent *fe = &eventLoop->events[fd];
- if (fe->mask == AE_NONE) return;
-
- /* We want to always remove AE_BARRIER if set when AE_WRITABLE
- * is removed. */
- if (mask & AE_WRITABLE) mask |= AE_BARRIER;
-
- aeApiDelEvent(eventLoop, fd, mask);
- fe->mask = fe->mask & (~mask);
- if (fd == eventLoop->maxfd && fe->mask == AE_NONE) {
- /* Update the max fd */
- int j;
-
- for (j = eventLoop->maxfd-1; j >= 0; j--)
- if (eventLoop->events[j].mask != AE_NONE) break;
- eventLoop->maxfd = j;
- }
- }
-
- int aeGetFileEvents(aeEventLoop *eventLoop, int fd) {
- if (fd >= eventLoop->setsize) return 0;
- aeFileEvent *fe = &eventLoop->events[fd];
-
- return fe->mask;
- }
-
- long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds,
- aeTimeProc *proc, void *clientData,
- aeEventFinalizerProc *finalizerProc)
- {
- long long id = eventLoop->timeEventNextId++;
- aeTimeEvent *te;
-
- te = zmalloc(sizeof(*te));
- if (te == NULL) return AE_ERR;
- te->id = id;
- te->when = getMonotonicUs() + milliseconds * 1000;
- te->timeProc = proc;
- te->finalizerProc = finalizerProc;
- te->clientData = clientData;
- te->prev = NULL;
- te->next = eventLoop->timeEventHead;
- te->refcount = 0;
- if (te->next)
- te->next->prev = te;
- eventLoop->timeEventHead = te;
- return id;
- }
-
- int aeDeleteTimeEvent(aeEventLoop *eventLoop, long long id)
- {
- aeTimeEvent *te = eventLoop->timeEventHead;
- while(te) {
- if (te->id == id) {
- te->id = AE_DELETED_EVENT_ID;
- return AE_OK;
- }
- te = te->next;
- }
- return AE_ERR; /* NO event with the specified ID found */
- }