Messages in this thread | | | Date | Wed, 28 Mar 2012 21:58:48 +0200 | From | Hagen Paul Pfeifer <> | Subject | Re: [PATCH Resend] epoll: add EPOLLEXCLUSIVE support |
| |
* Jason Baron | 2012-03-28 12:21:08 [-0400]:
>Hmmm...Looking at ep_poll() it does an '__add_wait_queue_exclusive()'. >So, I *think* epoll_wait() should do what you want, if you are waiting >on the same epfd in all the threads. > >I think the case you are describing is where each thread does its own >ep_create(), and then a subsequent epoll_wait() on the fd from the >create? > >So, I *think* you can get what you want without adding this flag.
;) sorry:
epoll_wait returned epoll_wait returned epoll_wait returned epoll_wait returned epoll_wait returned epoll_wait returned epoll_wait returned epoll_wait returned epoll_wait returned epoll_wait returned
minimal example:
>>>>>>>>>>> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sys/epoll.h>
#define AMAX 16
static void *runner(void *args) { int fd = (int) *((int *) args); struct epoll_event events[AMAX];
epoll_wait(fd, events, AMAX, -1); write(1, "epoll_wait returned\n", 20);
return NULL; }
int main(int ac, char **av) { int i, evfd, pipefd[2]; pthread_t thread_id[2]; struct epoll_event epoll_ev;
pipe(pipefd); evfd = epoll_create(64);
memset(&epoll_ev, 0, sizeof(struct epoll_event)); epoll_ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP; epoll_ctl(evfd, EPOLL_CTL_ADD, pipefd[0], &epoll_ev);
for (i = 0; i < 10; i++) pthread_create(&thread_id[0], NULL, runner, &evfd);
sleep(1); close(pipefd[1]); write(pipefd[0], "x", 1); sleep(1);
return EXIT_SUCCESS; } <<<<<<<<<<<
Cheers, Hagen
| |