Steven Grimm wrote:
It looks like this would be a pretty easy problem to fix -- just make evsignal_init() check to see if the socketpair has already been allocated, and return without doing anything if so.
yes. i have already sent a patch.. but the mail doesn't seems to have been accepted even if it was relayed and i had no response back. Maybe attachments are moderated.

Then you just need to make sure your first call to event_init() happens in only one thread. (I am assuming here that you don't actually need signal handling; if you do, then that first thread's event base would need to be kept around since it'd be the only one handling incoming signals.)

I call event_init once per thread and destroy it when the thread finishes.
Barring that, can you maintain a freelist of event bases and only allocate new ones when there aren't any unused ones left? That wouldn't fix the underlying bug, but would at least limit your file descriptor leakage to 2x the largest number of event bases in use at a time.
the patch seems to solve the problem.
I use 2 events per thread, i event_init() every thred and attach the events to that base. Then i delete the events and call event_base_free() [Note that this is not documented in the man page, afaik].

Even if experimental, now the support for threaded apps seems to work pretty well but i have not yet checked for memory leaks which willbe the 1st step after the application works.

now the patch:

----------------------FIRSTLINE
+++ libevent-1.3b.patched/signal.c      2007-03-08 02:01:54.000000000 +0100
@@ -57,6 +57,7 @@
static sig_atomic_t evsigcaught[NSIG];
volatile sig_atomic_t evsignal_caught = 0;

+static int ev_signal_pair_done = 0;
static struct event ev_signal;
static int ev_signal_pair[2];
static int ev_signal_added;
@@ -86,15 +87,17 @@
#define FD_CLOSEONEXEC(x)
#endif

-void
-evsignal_init(void)
+void evsignal_init(void)
{
+
+       if ( ev_signal_pair_done )
+           return;
       /*
        * Our signal handler is going to write to one end of the socket
        * pair to wake up our event loop.  The event loop then scans for
        * signals that got delivered.
        */
-       if (socketpair(AF_UNIX, SOCK_STREAM, 0, ev_signal_pair) == -1)
+       if ( socketpair(AF_UNIX, SOCK_STREAM, 0, ev_signal_pair) == -1)
               event_err(1, "%s: socketpair", __func__);

       FD_CLOSEONEXEC(ev_signal_pair[0]);
@@ -105,6 +108,8 @@
       event_set(&ev_signal, ev_signal_pair[1], EV_READ,
           evsignal_cb, &ev_signal);
       ev_signal.ev_flags |= EVLIST_INTERNAL;
+
+       ev_signal_pair_done = 1;
}

int
-------------------------------LASTLINE








_______________________________________________
Libevent-users mailing list
[email protected]
http://monkey.org/mailman/listinfo/libevent-users

Reply via email to