X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Feventl.c;h=8bc158b100d63a06ddbb8aaf1c1fdf4ed5da81d3;hb=817e3ec506c4095bc4fcc1923cee36153ef4ee43;hp=5c77f49382ba8233a7173a2a1051de014b656b20;hpb=2bd14321370e2d042c370d19149d6caec9c01930;p=pazpar2-moved-to-github.git diff --git a/src/eventl.c b/src/eventl.c index 5c77f49..8bc158b 100644 --- a/src/eventl.c +++ b/src/eventl.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2013 Index Data + Copyright (C) Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -20,7 +20,7 @@ /* * Based on ParaZ - a simple tool for harvesting performance data for * parallel operations using Z39.50. - * Copyright (C) 2006-2013 Index Data ApS + * Copyright (C) Index Data ApS * See LICENSE file for details. */ @@ -195,16 +195,14 @@ static void work_handler(void *work_data) { } static void run_fun(iochan_man_t man, IOCHAN p) { - if (p->this_event) { - if (man->sel_thread) { - yaz_log(man->log_level, - "eventl: work add chan=%p name=%s event=%d", p, - p->name ? p->name : "", p->this_event); - p->thread_users++; - sel_thread_add(man->sel_thread, p); - } else - work_handler(p); - } + if (man->sel_thread) { + yaz_log(man->log_level, + "eventl: work add chan=%p name=%s event=%d", p, + p->name ? p->name : "", p->this_event); + p->thread_users++; + sel_thread_add(man->sel_thread, p); + } else + work_handler(p); } static int event_loop(iochan_man_t man, IOCHAN *iochans) { @@ -219,7 +217,7 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans) { struct timeval *timeout; // struct yaz_poll_fd *fds; - int no_fds = 0; + int i, no_fds = 0; FD_ZERO(&in); FD_ZERO(&out); FD_ZERO(&except); @@ -294,6 +292,7 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans) { } yaz_log(man->log_level, "%d channels", no); } + i = 0; for (p = start; p; p = p->next) { time_t now = time(0); @@ -329,7 +328,17 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans) { p->this_event |= EVENT_EXCEPT; } } - run_fun(man, p); + /* only fire one Z39.50/SRU socket event.. except for timeout */ + if (p->this_event) { + if (!(p->this_event & EVENT_TIMEOUT) && + !strcmp(p->name, "connection_socket")) { + /* not a timeout and we have a Z39.50/SRU socket */ + if (i == 0) + run_fun(man, p); + i++; + } else + run_fun(man, p); + } } assert(inv_start == start); yaz_mutex_enter(man->iochan_mutex);