]>
jfr.im git - irc/quakenet/newserv.git/blob - core/events-poll.c
2 * events.c: the event handling core, poll() version
11 #include "../lib/array.h"
22 * OK, new data structure format for here to make everything
23 * faster. Two fixed static arrays, one of struct pollfds
24 * (for feeding to poll) in no particular order. Second array
25 * has an array of reghandler structs; this is indexed by FD for
29 struct pollfd
*eventfds
;
30 reghandler
*eventhandlers
;
38 /* How many fds are currently registered */
41 void eventstats(int hooknum
, void *arg
);
45 eventadds
=eventdels
=eventexes
=0;
47 eventfds
=(struct pollfd
*)malloc(maxfds
*sizeof(struct pollfd
));
48 memset(eventfds
,0,maxfds
*sizeof(struct pollfd
));
49 eventhandlers
=(reghandler
*)malloc(maxfds
*sizeof(reghandler
));
50 memset(eventhandlers
,0,maxfds
*sizeof(reghandler
));
51 registerhook(HOOK_CORE_STATSREQUEST
, &eventstats
);
55 deregisterhook(HOOK_CORE_STATSREQUEST
, &eventstats
);
62 * Given the number of a new file descriptor, makes sure that the arrays
63 * will be big enough to deal with it.
66 void checkindex(unsigned index
) {
73 while (maxfds
<=index
) {
77 eventfds
=(struct pollfd
*)realloc((void *)eventfds
,maxfds
*sizeof(struct pollfd
));
78 memset(&eventfds
[oldmax
],0,(maxfds
-oldmax
)*sizeof(struct pollfd
));
79 eventhandlers
=(reghandler
*)realloc((void *)eventhandlers
,maxfds
*sizeof(reghandler
));
80 memset(&eventhandlers
[oldmax
],0,(maxfds
-oldmax
)*sizeof(reghandler
));
85 * Add an fd to the poll() array.
90 int registerhandler(int fd
, short events
, FDHandler handler
) {
93 /* Check that it's not already registered */
94 if (eventhandlers
[fd
].handler
!=NULL
) {
98 eventhandlers
[fd
].handler
=handler
;
99 eventhandlers
[fd
].fdarraypos
=regfds
;
101 eventfds
[regfds
].fd
=fd
;
102 eventfds
[regfds
].events
=events
;
103 eventfds
[regfds
].revents
=0;
111 * deregisterhandler():
112 * Remove an fd from the poll() array.
114 * The poll() version can't save any time if doclose is set, so
115 * we just do the same work and then close the socket if it's set.
121 int deregisterhandler(int fd
, int doclose
) {
125 /* Check that the handler exists */
126 if (eventhandlers
[fd
].handler
==NULL
)
129 /* We need to rearrange the fds array slightly to handle the delete */
133 oldfdpos
=eventhandlers
[fd
].fdarraypos
;
134 lastreggedfd
=eventfds
[regfds
].fd
;
135 if (lastreggedfd
!=fd
) {
136 /* We need to move the "lastreggedfd" into "oldfdpos" */
137 memcpy(&eventfds
[oldfdpos
],&eventfds
[regfds
],sizeof(struct pollfd
));
138 eventhandlers
[lastreggedfd
].fdarraypos
=oldfdpos
;
142 eventhandlers
[fd
].handler
=NULL
;
143 eventhandlers
[fd
].fdarraypos
=-1;
154 * Call poll() and handle and call appropiate handlers
155 * for any sockets that come up.
160 int handleevents(int timeout
) {
163 for (i
=0;i
<regfds
;i
++) {
164 eventfds
[i
].revents
=0;
167 res
=poll(eventfds
,regfds
,timeout
);
172 for (i
=0;i
<regfds
;i
++) {
173 if(eventfds
[i
].revents
>0) {
174 (eventhandlers
[eventfds
[i
].fd
].handler
)(eventfds
[i
].fd
, eventfds
[i
].revents
);
181 void eventstats(int hooknum
, void *arg
) {
183 long level
=(long) arg
;
186 sprintf(buf
,"Events :%7d fds registered, %7d fds deregistered",eventadds
,eventdels
);
187 triggerhook(HOOK_CORE_STATSREPLY
,(void *)buf
);
188 sprintf(buf
,"Events :%7d events triggered, %6d fds active",eventexes
,regfds
);
189 triggerhook(HOOK_CORE_STATSREPLY
,(void *)buf
);