java.nio and SelectionKey.interestOps(int i)

Kurt Miller kurt at intricatesoftware.com
Fri Jan 23 20:50:50 PST 2009


Martin Kihlgren wrote:
> Well that certainly explains it!
>
> I tried your test program, and it freezes before any output on both my
> Linux 2.6.21 and my OS X Tiger.

Sorry I forgot the BSD's use bidirectional pipes and Linux, and OS X
have half duplex pipes. I wrote to the wrong fd for a half duplex pipe.
The test program should not freeze, it should complete without error
indicating the kernel doesn't write over the event field, or print an
error message. Below is a new version that should be portable and work
on OS X, Linux, etc.

> On the other hand, now that I know what the problem is, I can simply
> create a task for the thread doing the select, to change the
> interestOps between selects instead. That way the overwrite won't
> happen, and my program works again.
>
> Thanks for the help and explanation - it really did help, and now my
> project works fine on BSD systems as well :D

Your welcome. :-)

#include <err.h>
#include <poll.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

struct pollfd fds[2];
int pipefds[2];

static void *
thread(void *arg) {
 sleep(1);
 fds[0].events = POLLIN | POLLOUT;
 write(pipefds[1], "", 1);
 return NULL;
}

int
main(int argc, char *argv[]) {
 pthread_t tid;

 if (pipe(pipefds) != 0)
   err(1, "pipe failed");

 fds[0].fd = pipefds[0];
 fds[0].events = POLLIN;

 fds[1].fd = pipefds[1];
 fds[1].events = POLLIN;

 if (pthread_create(&tid, NULL, thread, NULL) != 0)
   err(1, "pthread_create failed");

 poll(fds, 2, -1);

 if (fds[0].events != (POLLIN | POLLOUT)) {
   printf("events overwritten by kernel!\n");
   return 1;
 }

 return 0;
}




More information about the bsd-port-dev mailing list