15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef IOLOOPER_H
25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define IOLOOPER_H
35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <stdint.h>
55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* An IOLooper is an abstraction for select() */
75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct IoLooper  IoLooper;
95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerIoLooper*  iolooper_new(void);
115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid       iolooper_free( IoLooper*  iol );
125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid       iolooper_reset( IoLooper*  iol );
135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid       iolooper_add_read( IoLooper*  iol, int  fd );
155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid       iolooper_add_write( IoLooper*  iol, int  fd );
165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid       iolooper_del_read( IoLooper*  iol, int  fd );
175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid       iolooper_del_write( IoLooper*  iol, int  fd );
185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
197a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turnerenum {
207a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner    IOLOOPER_READ = (1<<0),
217a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner    IOLOOPER_WRITE = (1<<1),
227a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner};
237a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turnervoid       iolooper_modify( IoLooper*  iol, int fd, int oldflags, int newflags);
247a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner
255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint        iolooper_poll( IoLooper*  iol );
26d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine/* Wrapper around select()
27d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * Return:
28d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  > 0 in case an I/O has occurred, or < 0 on error, or 0 on timeout with
29d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  errno set to ETIMEDOUT.
30d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine */
315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint        iolooper_wait( IoLooper*  iol, int64_t  duration );
325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint        iolooper_is_read( IoLooper*  iol, int  fd );
345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint        iolooper_is_write( IoLooper*  iol, int  fd );
35cc19d3eeef59cbd354c1c618f7421d6fe5e0a098Ot ten Thije/* Returns 1 if this IoLooper has one or more file descriptor to interact with */
36cc19d3eeef59cbd354c1c618f7421d6fe5e0a098Ot ten Thijeint        iolooper_has_operations( IoLooper*  iol );
37d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine/* Gets current time in milliseconds.
38d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * Return:
39d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  Number of milliseconds corresponded to the current time on success, or -1
40d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  on failure.
41d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine */
42d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkineint64_t    iolooper_now(void);
43d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine/* Waits for an I/O to occur before specific absolute time.
44d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * This routine should be used (instead of iolooper_wait) in cases when multiple
45d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * sequential I/O should be completed within given time interval. For instance,
46d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * consider the scenario, when "server" does two sequential writes, and "client"
47d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * now has to read data transferred with these two distinct writes. It might be
48d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * wasteful to do two reads, each with the same (large) timeout. Instead, it
49d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * would be better to assign a deadline for both reads before the first read,
50d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * and call iolooper_wait_absoulte with the same deadline value:
51d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  int64_t deadline = iolooper_now() + TIMEOUT;
52d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  if (iolooper_wait_absoulte(iol, deadline)) {
53d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *      // Process first buffer.
54d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *      (iolooper_wait_absoulte(iol, deadline)) {
55d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *          // Process second read
56d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *      }
57d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  }
58d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * Param:
59d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  iol IoLooper instance for an I/O.
60d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  deadline Deadline (absoulte time in milliseconds) before which an I/O should
61d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *      occur.
62d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine * Return:
63d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  Number of I/O descriptors set in iol, if an I/O has occurred, 0 if no I/O
64d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine *  occurred before the deadline, or -1 on error.
65d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkine */
66d8ba2ae8942abd9757338fc110ce6d215c486b1cVladimir Chtchetkineint iolooper_wait_absolute(IoLooper* iol, int64_t deadline);
675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif /* IOLOOPER_H */
69