Upon further consideration, maybe I should model it after
/dev/epoll. That would get rid of nagging questions like
"but read() can't leave holes like sigtimedwait could",
and would be even higher performance than read()
(see graphs at http://www.xmailserver.org/linux-patches/nio-improve.html )
So I'm proposing the following user story:
// open a fd linked to signal mysignum
int fd = open("/dev/sigtimedwait", O_RDWR);
int sigs[1]; sigs[0] = mysignum;
write(fd, sigs, sizeof(sigs[0]));
// memory map a result buffer
struct siginfo_t *map = mmap(NULL, mapsize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
for (;;) {
// grab recent siginfo_t's
struct devsiginfo dsi;
dsi.dsi_nsis = 1000;
dsi.dsi_sis = NULL; // NULL means "use map instead of buffer"
dsi.dsi_timeout = 1;
int nsis = ioctl(fd, DS_SIGTIMEDWAIT, &dvp);
// use 'em. Some might be completion notifications; some might be readiness notifications.
for (i=0; i<nsis; i++)
handle_siginfo(map+i);
}
Sure, the interface is crap, but it's fast, and at least it doesn't
add any syscalls (the sigopen() proposal required two new syscalls: sigopen()
and timedread()).
Comments?
BTW I'm halfway thru "Understanding the Linux Kernel" and it's
a very good read (modulo some strange lingo, e.g. "cycle" for "loop"
and "table" for "record" or "struct").
So since I only halfway understand the linux kernel, the above proposal
may be half baked.
- Dan
-- "I have seen the future, and it licks itself clean." -- Bucky Katt - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/