So I've been thinking about the sigopen() system call I proposed.
(To recap: sigopen() would let you use read() instead of sigwaitinfo()
to retrieve lots of realtime signals at one go, AND would
protect your signal from being swiped by hostile code elsewhere
in the application, a la Sun's JDK.)
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/
This archive was generated by hypermail 2b29 : Tue Aug 07 2001 - 21:00:31 EST