00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BACKEND_H
00009 #define BACKEND_H
00010
00011 #include "global.h"
00012 #include "time_stuff.h"
00013 #include "callback.h"
00014
00015
00016
00017
00018
00019 #if defined(HAVE_POLL) && defined(HAVE_AND_USE_POLL)
00020
00021 #if defined(HAVE_SYS_DEVPOLL_H) && defined(PIKE_POLL_DEVICE)
00022
00023
00024
00025
00026
00027
00028
00029
00030 #define BACKEND_USES_POLL_DEVICE
00031 #define BACKEND_USES_DEVPOLL
00032 #elif defined(HAVE_SYS_EPOLL_H) && defined(PIKE_POLL_DEVICE)
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #define BACKEND_USES_POLL_DEVICE
00043 #define BACKEND_USES_DEVEPOLL
00044 #else
00045
00046
00047
00048
00049
00050 #define BACKEND_USES_POLL
00051 #endif
00052 #elif defined(HAVE_SYS_EVENT_H) && defined(HAVE_KQUEUE)
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 #define BACKEND_USES_KQUEUE
00064
00065
00066
00067 #define BACKEND_OOB_IS_SIMULATED
00068 #else
00069
00070
00071
00072
00073
00074 #define BACKEND_USES_SELECT
00075 #endif
00076
00077 struct Backend_struct;
00078 struct selectors;
00079
00080 PMOD_EXPORT extern struct timeval current_time;
00081 PMOD_EXPORT extern struct timeval next_timeout;
00082 PMOD_EXPORT extern struct Backend_struct *default_backend;
00083 extern struct callback_list do_debug_callbacks;
00084 PMOD_EXPORT extern struct program *Backend_program;
00085
00086 PMOD_EXPORT void debug_check_fd_not_in_use (int fd);
00087 #if 1
00088 struct Backend_struct *get_backend_for_fd(int fd);
00089 PMOD_EXPORT struct object *get_backend_obj_for_fd (int fd);
00090 PMOD_EXPORT void set_backend_for_fd (int fd, struct Backend_struct *new);
00091 #endif
00092
00093 PMOD_EXPORT struct object *get_backend_obj (struct Backend_struct *b);
00094 PMOD_EXPORT void wake_up_backend(void);
00095 void init_backend(void);
00096 void do_debug(void);
00097 void backend(void);
00098 void exit_backend(void);
00099 PMOD_EXPORT int write_to_stderr(char *a, size_t len);
00100 PMOD_EXPORT struct callback *debug_add_backend_callback(callback_func call,
00101 void *arg,
00102 callback_func free_func);
00103
00104
00105
00106
00107
00108 struct fd_callback_box;
00109
00110 typedef int (*fd_box_callback) (struct fd_callback_box *box, int event);
00111
00112
00113
00114
00115 struct fd_callback_box
00116 {
00117 struct Backend_struct *backend;
00118
00119 struct object *ref_obj;
00120
00121
00122
00123 struct fd_callback_box *next;
00124
00125
00126
00127 int fd;
00128
00129
00130
00131
00132 int events;
00133
00134
00135
00136 int revents;
00137
00138
00139 fd_box_callback callback;
00140
00141 };
00142
00143 #define INIT_FD_CALLBACK_BOX(BOX, BACKEND, REF_OBJ, FD, EVENTS, CALLBACK) do { \
00144 struct fd_callback_box *box__ = (BOX); \
00145 box__->backend = (BACKEND); \
00146 box__->ref_obj = (REF_OBJ); \
00147 box__->next = NULL; \
00148 box__->fd = (FD); \
00149 box__->events = (EVENTS); \
00150 box__->revents = 0; \
00151 box__->callback = (CALLBACK); \
00152 hook_fd_callback_box (box__); \
00153 } while (0)
00154
00155
00156 #define PIKE_FD_READ 0
00157 #define PIKE_FD_WRITE 1
00158 #define PIKE_FD_READ_OOB 2
00159 #define PIKE_FD_WRITE_OOB 3
00160 #define PIKE_FD_ERROR 4
00161 #define PIKE_FD_NUM_EVENTS 5
00162
00163
00164 #define PIKE_BIT_FD_READ (1 << PIKE_FD_READ)
00165 #define PIKE_BIT_FD_WRITE (1 << PIKE_FD_WRITE)
00166 #define PIKE_BIT_FD_READ_OOB (1 << PIKE_FD_READ_OOB)
00167 #define PIKE_BIT_FD_WRITE_OOB (1 << PIKE_FD_WRITE_OOB)
00168 #define PIKE_BIT_FD_ERROR (1 << PIKE_FD_ERROR)
00169
00170
00171
00172
00173
00174
00175
00176 PMOD_EXPORT void hook_fd_callback_box (struct fd_callback_box *box);
00177 PMOD_EXPORT void unhook_fd_callback_box (struct fd_callback_box *box);
00178 PMOD_EXPORT void set_fd_callback_events (struct fd_callback_box *box, int events);
00179 PMOD_EXPORT void change_backend_for_box (struct fd_callback_box *box,
00180 struct Backend_struct *new);
00181 PMOD_EXPORT void change_fd_for_box (struct fd_callback_box *box, int new_fd);
00182
00183
00184
00185
00186 typedef int (*file_callback)(int,void *);
00187
00188 #if 1
00189 PMOD_EXPORT void set_read_callback(int fd,file_callback cb,void *data);
00190 PMOD_EXPORT void set_write_callback(int fd,file_callback cb,void *data);
00191 PMOD_EXPORT void set_read_oob_callback(int fd,file_callback cb,void *data);
00192 PMOD_EXPORT void set_write_oob_callback(int fd,file_callback cb,void *data);
00193 PMOD_EXPORT file_callback query_read_callback(int fd);
00194 PMOD_EXPORT file_callback query_write_callback(int fd);
00195 PMOD_EXPORT file_callback query_read_oob_callback(int fd);
00196 PMOD_EXPORT file_callback query_write_oob_callback(int fd);
00197 PMOD_EXPORT void *query_read_callback_data(int fd);
00198 PMOD_EXPORT void *query_write_callback_data(int fd);
00199 PMOD_EXPORT void *query_read_oob_callback_data(int fd);
00200 PMOD_EXPORT void *query_write_oob_callback_data(int fd);
00201 #endif
00202
00203 #define add_backend_callback(X,Y,Z) \
00204 dmalloc_touch(struct callback *,debug_add_backend_callback((X),(Y),(Z)))
00205
00206 #endif