diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-08-11 08:31:53 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-08-11 08:31:53 +0200 |
commit | 09d465a9761be085b697b4ec342f5022469eb29a (patch) | |
tree | 52dd1a6707489de0cf4b3ac00aa79af73a62f4b5 /sys/src/libdraw/event.c | |
parent | 62bd2ae8b910b56dd6cbc50c4d9573e2eac6f1ad (diff) |
libdraw: make ebread() return buffer immidiately if available, cleanup
this reduces number of syscalls and improves performance for vt
Diffstat (limited to 'sys/src/libdraw/event.c')
-rw-r--r-- | sys/src/libdraw/event.c | 22 |
1 files changed, 6 insertions, 16 deletions
diff --git a/sys/src/libdraw/event.c b/sys/src/libdraw/event.c index 5df6e63a8..bb4b60179 100644 --- a/sys/src/libdraw/event.c +++ b/sys/src/libdraw/event.c @@ -45,21 +45,10 @@ Ebuf* ebread(Slave *s) { Ebuf *eb; - Dir *d; - ulong l; - - for(;;){ - d = dirfstat(epipe[0]); - if(d == nil) - drawerror(display, "events: eread stat error"); - l = d->length; - free(d); - if(s->head && l==0) - break; + + while((eb = s->head) == 0) extract(); - } - eb = s->head; - s->head = s->head->next; + s->head = eb->next; if(s->head == 0) s->tail = 0; return eb; @@ -322,9 +311,10 @@ loop: memmove(eb->buf, &ebuf[1], n - 1); eb->next = 0; if(s->head) - s->tail = s->tail->next = eb; + s->tail->next = eb; else - s->head = s->tail = eb; + s->head = eb; + s->tail = eb; } static int |