1 /* 2 * Copyright (C) 2006 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 17 #ifndef __FDEVENT_H 18 #define __FDEVENT_H 19 20 #include <stdint.h> /* for int64_t */ 21 22 /* events that may be observed */ 23 #define FDE_READ 0x0001 24 #define FDE_WRITE 0x0002 25 #define FDE_ERROR 0x0004 26 #define FDE_TIMEOUT 0x0008 27 28 /* features that may be set (via the events set/add/del interface) */ 29 #define FDE_DONT_CLOSE 0x0080 30 31 typedef struct fdevent fdevent; 32 33 typedef void (*fd_func)(int fd, unsigned events, void *userdata); 34 35 /* Allocate and initialize a new fdevent object 36 * Note: use FD_TIMER as 'fd' to create a fd-less object 37 * (used to implement timers). 38 */ 39 fdevent *fdevent_create(int fd, fd_func func, void *arg); 40 41 /* Uninitialize and deallocate an fdevent object that was 42 ** created by fdevent_create() 43 */ 44 void fdevent_destroy(fdevent *fde); 45 46 /* Initialize an fdevent object that was externally allocated 47 */ 48 void fdevent_install(fdevent *fde, int fd, fd_func func, void *arg); 49 50 /* Uninitialize an fdevent object that was initialized by 51 ** fdevent_install() 52 */ 53 void fdevent_remove(fdevent *item); 54 55 /* Change which events should cause notifications 56 */ 57 void fdevent_set(fdevent *fde, unsigned events); 58 void fdevent_add(fdevent *fde, unsigned events); 59 void fdevent_del(fdevent *fde, unsigned events); 60 61 void fdevent_set_timeout(fdevent *fde, int64_t timeout_ms); 62 63 /* loop forever, handling events. 64 */ 65 void fdevent_loop(); 66 67 struct fdevent 68 { 69 fdevent *next; 70 fdevent *prev; 71 72 int fd; 73 int force_eof; 74 75 unsigned short state; 76 unsigned short events; 77 78 fd_func func; 79 void *arg; 80 }; 81 82 83 #endif 84