1 /*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #ifndef IOLOOPER_H
17 #define IOLOOPER_H
18 
19 #include <stdint.h>
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 /* An IOLooper is an abstraction for select() */
26 
27 typedef struct IoLooper  IoLooper;
28 
29 IoLooper*  iolooper_new(void);
30 void       iolooper_free( IoLooper*  iol );
31 void       iolooper_reset( IoLooper*  iol );
32 
33 void       iolooper_add_read( IoLooper*  iol, int  fd );
34 void       iolooper_add_write( IoLooper*  iol, int  fd );
35 void       iolooper_del_read( IoLooper*  iol, int  fd );
36 void       iolooper_del_write( IoLooper*  iol, int  fd );
37 
38 enum {
39     IOLOOPER_READ = (1<<0),
40     IOLOOPER_WRITE = (1<<1),
41 };
42 void       iolooper_modify( IoLooper*  iol, int fd, int oldflags, int newflags);
43 
44 int        iolooper_poll( IoLooper*  iol );
45 /* Wrapper around select()
46  * Return:
47  *  > 0 in case an I/O has occurred, or < 0 on error, or 0 on timeout with
48  *  errno set to ETIMEDOUT.
49  */
50 int        iolooper_wait( IoLooper*  iol, int64_t  duration );
51 
52 int        iolooper_is_read( IoLooper*  iol, int  fd );
53 int        iolooper_is_write( IoLooper*  iol, int  fd );
54 /* Returns 1 if this IoLooper has one or more file descriptor to interact with */
55 int        iolooper_has_operations( IoLooper*  iol );
56 /* Gets current time in milliseconds.
57  * Return:
58  *  Number of milliseconds corresponded to the current time on success, or -1
59  *  on failure.
60  */
61 int64_t    iolooper_now(void);
62 /* Waits for an I/O to occur before specific absolute time.
63  * This routine should be used (instead of iolooper_wait) in cases when multiple
64  * sequential I/O should be completed within given time interval. For instance,
65  * consider the scenario, when "server" does two sequential writes, and "client"
66  * now has to read data transferred with these two distinct writes. It might be
67  * wasteful to do two reads, each with the same (large) timeout. Instead, it
68  * would be better to assign a deadline for both reads before the first read,
69  * and call iolooper_wait_absoulte with the same deadline value:
70  *  int64_t deadline = iolooper_now() + TIMEOUT;
71  *  if (iolooper_wait_absoulte(iol, deadline)) {
72  *      // Process first buffer.
73  *      (iolooper_wait_absoulte(iol, deadline)) {
74  *          // Process second read
75  *      }
76  *  }
77  * Param:
78  *  iol IoLooper instance for an I/O.
79  *  deadline Deadline (absoulte time in milliseconds) before which an I/O should
80  *      occur.
81  * Return:
82  *  Number of I/O descriptors set in iol, if an I/O has occurred, 0 if no I/O
83  *  occurred before the deadline, or -1 on error.
84  */
85 int iolooper_wait_absolute(IoLooper* iol, int64_t deadline);
86 
87 #ifdef __cplusplus
88 }
89 #endif
90 
91 #endif /* IOLOOPER_H */
92