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