-ExtFunc MyEventType WaitMyEvent(MyEvent *event, int mask)
-{ //poll
- int i, retry = 0;
- fd_set fds[FT_len];
- EventGenRec *gen;
- int result, anyReady, anySet;
- struct timeval tv;
-
- for (;;) {
- for (i = 0; i < FT_len; ++i)
- FD_ZERO(&fds[i]);
- anyReady = anySet = 0;
- gen = nextGen;
- do {
- if (gen->mask & mask) {
- if (gen->ready)
- anyReady = 1;
- if (gen->fd >= 0) {
- FD_SET(gen->fd, &fds[gen->fdType]);
- anySet = 1;
- }
- }
- gen = gen->next;
- } while (gen != nextGen);
- if (anySet) {
- tv.tv_sec = 0;
- tv.tv_usec = (retry && !anyReady) ? 500000 : 0;
- result = select(FD_SETSIZE, &fds[FT_read], &fds[FT_write],
- &fds[FT_except], anyReady ? &tv : NULL);
- }
- else {
- if (retry && !anyReady)
- sleep(1);
- result = 0;
- }
- gen = nextGen;
- do {
- if ((gen->mask & mask)
- && (gen->ready || (result > 0 && gen->fd >= 0
- && FD_ISSET(gen->fd, &fds[gen->fdType])))) {
- gen->ready = 0;
- event->type = gen->func(gen, event);
- if (event->type != E_none) {
- nextGen = gen->next;
- return event->type;
- }
- }
- gen = gen->next;
- } while (gen != nextGen);
- retry = 1;
- }
-} //WaitMyEvent
-
-ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event)