summaryrefslogtreecommitdiff
path: root/ot_event.h
blob: efdefff7c438e769b4675affc6bef193c4363655 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* This software was written by Dirk Engling <erdgeist@erdgeist.org>
   It is considered beerware. Prost. Skol. Cheers or whatever.

   $id$ */

#ifndef OT_EVENT_H__
#define OT_EVENT_H__

#include <stdint.h>

/* Which descriptors have become readable or writable, asked of whichever
   mechanism the kernel offers. The generation a descriptor was registered
   with is handed back with every event, so a caller can tell an event for
   the connection it is holding from one for a connection that has since been
   closed and had its number reused. */

enum { EVENT_IN = 1, EVENT_OUT = 2 };

typedef struct {
  int      fd;
  uint32_t generation;
  int      what;
} ot_event;

int  event_init(void);
void event_deinit(void);

int  event_add(int fd, int what, uint32_t generation);
int  event_modify(int fd, int what, uint32_t generation);
int  event_del(int fd);

/* Stop watching a descriptor and close it. Where the kernel drops a closed
   descriptor from its set by itself, this is one system call where doing the
   two separately would be two. */
int  event_close(int fd);

/* Waits at most timeout_ms, or indefinitely when that is negative, and fills
   out with up to max ready descriptors. Returns how many, or -1. */
int  event_wait(ot_event *out, int max, int timeout_ms);

/* Whether the registered set may be changed from another thread while this
   one is waiting on it. True where the kernel keeps the set, false where
   this module keeps it in memory of its own. */
int  event_can_share(void);

/* Which mechanism was compiled in, for the version string */
const char *event_mechanism(void);

#endif