Re: [RFC] epoll

From: Davide Libenzi
Date: Fri Sep 23 2005 - 12:28:51 EST


On Thu, 22 Sep 2005, Vadim Lobanov wrote:

On Thu, 22 Sep 2005, Davide Libenzi wrote:

This born from the initial epoll implementation, that was using the size
parameter to size the hash. Since now epoll uses rbtrees, the parameter is
no more used. Changing the API to remove it, and break userspace, was/is
not a good idea.


Any thoughts on allowing a size of '0'?

We would need to change man pages for that, and this IMHO w/out a strong reason of doing so.



Yes, it is nicer if epoll behaves like poll. (*)


No patch needed from me here, then?

No need thx. I'll be sending the one-liner to the list right now.



3. Wakeup
As determined by testing with userland code, the sys_tgkill() and
sys_tkill() functions currently will NOT wake up a sleeping
epoll_wait(). Effectively, this means that epoll_wait() is NOT a pthread
cancellation point. There are two potential issues with this:
- epoll_wait() meets the unofficial(?) definition of a "system call that
may block".
- epoll_wait() behaves differently from poll() and friends.

The epoll_wait() wait loop is the standard one that even poll() uses (prep
wait, make interruptible, test signals, sched timeo). So if poll() is woke
up, so should epoll_wait(). A minimal code snippet that proves poll()
behing woke up, and epoll_wait() not, would help.


Certainly. :-) See end of email for sample program.

I'm afraid you need to bug the glibc guys, since I think they wrap sys_poll(). Try the test program below, when defining _X_, that makes it call sys_poll() directly. It will have the same epoll_wait() behaviour.




- Davide





#include <sys/epoll.h>
#include <sys/poll.h>
#include <pthread.h>
#include <stdio.h>
#include <linux/unistd.h>
#include <errno.h>
#include <unistd.h>


#define __NR_xpoll __NR_poll

#define __sys_xpoll(ufds, nfds, timeout) _syscall3(int, xpoll, struct pollfd *, ufds, \
unsigned int, nfds, long, timeout)

__sys_xpoll(ufds, nfds, timeout);


void * run (int * fd) {
struct epoll_event result;

printf("Wait forever while polling.\n");
#if defined(_E_)
epoll_wait(*fd, &result, 1, -1);
#elif defined(_X_)
xpoll(NULL, 0, -1);
#else
poll(NULL, 0, -1);
#endif
printf("Uhoh! Something is borked!\n");

return NULL;
}

int main (void) {
int events;
pthread_t thread;

#if defined(_E_)
events = epoll_create(1);
#endif
pthread_create(&thread, NULL, (void * (*) (void *))run, &events);
getchar();
printf("Try to kill the thread.\n");
pthread_cancel(thread);
pthread_join(thread, NULL);
printf("Success.\n");
#if defined(_E_)
close(events);
#endif

return 0;
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/