projects
/
yaz-moved-to-github.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Bug-fixes
[yaz-moved-to-github.git]
/
server
/
eventl.c
diff --git
a/server/eventl.c
b/server/eventl.c
index
e363111
..
1780a01
100644
(file)
--- a/
server/eventl.c
+++ b/
server/eventl.c
@@
-4,7
+4,16
@@
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: eventl.c,v $
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: eventl.c,v $
- * Revision 1.1 1995-03-10 18:22:44 quinn
+ * Revision 1.4 1995-03-14 16:59:48 quinn
+ * Bug-fixes
+ *
+ * Revision 1.3 1995/03/14 11:30:14 quinn
+ * Works better now.
+ *
+ * Revision 1.2 1995/03/14 10:27:59 quinn
+ * More work on demo server.
+ *
+ * Revision 1.1 1995/03/10 18:22:44 quinn
* The rudiments of an asynchronous server.
*
*/
* The rudiments of an asynchronous server.
*
*/
@@
-29,14
+38,12
@@
IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags)
new->fd = fd;
new->flags = flags;
new->fun = cb;
new->fd = fd;
new->flags = flags;
new->fun = cb;
+ new->next = iochans;
+ new->force_event = 0;
+ iochans = new;
return new;
}
return new;
}
-void iochan_destroy(IOCHAN i)
-{
- i->destroyed = 1;
-}
-
int event_loop()
{
do
int event_loop()
{
do
@@
-44,12
+51,18
@@
int event_loop()
IOCHAN p, nextp;
fd_set in, out, except;
int res, max;
IOCHAN p, nextp;
fd_set in, out, except;
int res, max;
+ static struct timeval nullto = {0, 0};
+ struct timeval *timeout;
FD_ZERO(&in);
FD_ZERO(&out);
FD_ZERO(&except);
FD_ZERO(&in);
FD_ZERO(&out);
FD_ZERO(&except);
+ timeout = 0; /* hang on select */
+ max = 0;
for (p = iochans; p; p = p->next)
{
for (p = iochans; p; p = p->next)
{
+ if (p->force_event)
+ timeout = &nullto;
if (p->flags & EVENT_INPUT)
FD_SET(p->fd, &in);
if (p->flags & EVENT_OUTPUT)
if (p->flags & EVENT_INPUT)
FD_SET(p->fd, &in);
if (p->flags & EVENT_OUTPUT)
@@
-59,7
+72,7
@@
int event_loop()
if (p->fd > max)
max = p->fd;
}
if (p->fd > max)
max = p->fd;
}
- if ((res = select(max + 1, &in, &out, &except, 0)) < 0)
+ if ((res = select(max + 1, &in, &out, &except, timeout)) < 0)
{
if (errno == EINTR)
continue;
{
if (errno == EINTR)
continue;
@@
-69,12
+82,17
@@
int event_loop()
continue;
for (p = iochans; p; p = nextp)
{
continue;
for (p = iochans; p; p = nextp)
{
+ int force_event = p->force_event;
+
+ p->force_event = 0;
nextp = p->next;
nextp = p->next;
- if (FD_ISSET(p->fd, &in))
+ if (FD_ISSET(p->fd, &in) || force_event == EVENT_INPUT)
(*p->fun)(p, EVENT_INPUT);
(*p->fun)(p, EVENT_INPUT);
- if (!p->destroyed && FD_ISSET(p->fd, &in))
+ if (!p->destroyed && (FD_ISSET(p->fd, &in) ||
+ force_event == EVENT_OUTPUT))
(*p->fun)(p, EVENT_OUTPUT);
(*p->fun)(p, EVENT_OUTPUT);
- if (!p->destroyed && FD_ISSET(p->fd, &except))
+ if (!p->destroyed && (FD_ISSET(p->fd, &except) ||
+ force_event == EVENT_EXCEPT))
(*p->fun)(p, EVENT_EXCEPT);
if (p->destroyed)
{
(*p->fun)(p, EVENT_EXCEPT);
if (p->destroyed)
{