java.nio and SelectionKey.interestOps(int i)
Martin Kihlgren
zondolfin at gmail.com
Sat Jan 24 03:03:53 PST 2009
Yup, that one worked - on OS X it talked about overwritten events, on
Linux it exited silently.
But, to be honest, I can't be arsed to make a serious complaint about
this. Anyone that feel they have the energy is welcome to, of course
:)
regards,
//Martin
On Sat, Jan 24, 2009 at 5:50 AM, Kurt Miller <kurt at intricatesoftware.com> wrote:
> 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