Re: [RFC] epoll

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux