summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/event-poll.c
diff options
context:
space:
mode:
authorVijaikumar M <vmallika@redhat.com>2014-06-19 15:41:22 +0530
committerVijay Bellur <vbellur@redhat.com>2015-02-07 13:17:30 -0800
commitc61074400a45e69c6edbf82b8ed02568726d37ae (patch)
treec9c826414bcd3da0e1f30edbaaf79ac0c716a371 /libglusterfs/src/event-poll.c
parent5e25569ed0717aa8636ad708430a823d39f9aa60 (diff)
epoll: edge triggered and multi-threaded epoll
- edge triggered (oneshot) polling with epoll - pick one event to avoid multiple events getting picked up by same thread and so get better distribution of events against multiple threads - wire support for multiple poll threads to epoll_wait in parallel - evdata to store absolute index and not hint for epoll - store index and gen of slot instead of fd and index hint - perform fd close asynchronously inside event.c for multithread safety - poll is still single threaded Change-Id: I536851dda0ab224c5d5a1b130a571397c9cace8f BUG: 1104462 Signed-off-by: Anand Avati <avati@redhat.com> Signed-off-by: Vijaikumar M <vmallika@redhat.com> Signed-off-by: Jeff Darcy <jdarcy@redhat.com> Signed-off-by: Shyam <srangana@redhat.com> Reviewed-on: http://review.gluster.org/3842 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'libglusterfs/src/event-poll.c')
-rw-r--r--libglusterfs/src/event-poll.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/libglusterfs/src/event-poll.c b/libglusterfs/src/event-poll.c
index 7f7f560d086..a7e2e663103 100644
--- a/libglusterfs/src/event-poll.c
+++ b/libglusterfs/src/event-poll.c
@@ -26,6 +26,16 @@
#include "config.h"
#endif
+
+
+struct event_slot_poll {
+ int fd;
+ int events;
+ void *data;
+ event_handler_t handler;
+};
+
+
static int
event_register_poll (struct event_pool *event_pool, int fd,
event_handler_t handler,
@@ -63,12 +73,16 @@ __event_getindex (struct event_pool *event_pool, int fd, int idx)
GF_VALIDATE_OR_GOTO ("event", event_pool, out);
+ /* lookup in used space based on index provided */
if (idx > -1 && idx < event_pool->used) {
- if (event_pool->reg[idx].fd == fd)
+ if (event_pool->reg[idx].fd == fd) {
ret = idx;
+ goto out;
+ }
}
- for (i=0; ret == -1 && i<event_pool->used; i++) {
+ /* search in used space, if lookup fails */
+ for (i = 0; i < event_pool->used; i++) {
if (event_pool->reg[i].fd == fd) {
ret = i;
break;
@@ -264,6 +278,20 @@ out:
static int
+event_unregister_close_poll (struct event_pool *event_pool, int fd,
+ int idx_hint)
+{
+ int ret = -1;
+
+ ret = event_unregister_poll (event_pool, fd, idx_hint);
+
+ close (fd);
+
+ return ret;
+}
+
+
+static int
event_select_on_poll (struct event_pool *event_pool, int fd, int idx_hint,
int poll_in, int poll_out)
{
@@ -443,9 +471,10 @@ out:
struct event_ops event_ops_poll = {
- .new = event_pool_new_poll,
- .event_register = event_register_poll,
- .event_select_on = event_select_on_poll,
- .event_unregister = event_unregister_poll,
- .event_dispatch = event_dispatch_poll
+ .new = event_pool_new_poll,
+ .event_register = event_register_poll,
+ .event_select_on = event_select_on_poll,
+ .event_unregister = event_unregister_poll,
+ .event_unregister_close = event_unregister_close_poll,
+ .event_dispatch = event_dispatch_poll
};