On Oct 23, 2010, at 12:40 PM, Ralph Castain wrote: > > On Oct 23, 2010, at 9:42 AM, Nick Mathewson wrote: > >> On Sat, Oct 23, 2010 at 5:14 AM, Ralph Castain <r...@open-mpi.org> wrote: >>> Hi folks >>> >>> I successfully updated our libevent integration in Open MPI, but have >>> encountered a problem with one use-case that used to work and now doesn't. >>> Before proceeding to devise a fix, I just wanted to confirm that I >>> accurately understand the issue. >>> >>> The problem arises from this scenario: >>> >>> 1. we receive a command via a message that we receive in a file descriptor >>> event. We "push" the command message into a timer event (duration zero >>> time) to help break a threading issue, and then return from the file >>> descriptor event. >>> >>> 2. the event library is called with LOOP_ONCE, causing the timer event to >>> fire. >>> >>> 3. from within the timer event, the command causes us to execute a >>> procedure that results in us having to wait for another event to occur. We >>> "block" in that position, running a loop that includes a call to progress >>> the event library (i.e., a call to event_loop(LOOP_ONCE)). >>> >>> This last step used to work just fine, yet now yields the following warning: >>> >>> warn] event_base_loop: reentrant invocation. Only one event_base_loop can >>> run on each event_base at once.: Resource temporarily unavailable >>> >>> and no progression of the event library occurs. >>> >>> I can see a few ways around this problem, but all involve considerable code >>> rewrite. Before I do so, I just wanted to confirm my understanding that >>> this behavior changed (i.e., recursion is no longer allowed), and see if >>> any alternative approaches to revising such codes are recommended. >> >> Hi, Ralph! I'll try to answer in more detail later on -- I can't >> write too much now, but I wanted to drop you a line before you started >> rewriting your code. >> >> I think that the warning you hit may be overzealous. It was meant to >> detect errors that would previously pass silently and produce >> hard-to-diagnose crashes, such as running event_base_dispatch on the >> same event base from multiple threads at once. But I think your use >> case may either a) work right, or b) be trivial to make work right, >> and if so, we should fix Libevent not to warn about it. >> >> I'll look harder at the code here and try to see what's going on here, >> but calling the loop from a callback really was working fine with >> Libevent 1.4, then I think 2.0 should support it. > > FWIW: I decided to just try commenting out the "return" following the warning > in event.c, and everything works fine. > > Not recommending that as a permanent fix, of course - it may just work due to > our peculiar usage. After all, we are running single-threaded, and so you > can't call the dispatch from multiple threads. But thought you might like to > know.
Been thinking about this problem a bit. I wonder if the solution isn't simply to allow recursive calls to event_loop, but for the event library to ignore any event that is currently active? In other words, have the library go ahead and run thru all its events, setting a flag in the event struct when that event handler is called. Subsequent loops check all events -except- those whose flag is set. When an event handler returns, you reset the flag, thus making it active again, or remove the event if it is non-persistent (might be risky in this scenario as popping up the recursion tree could yield stale data - can be handled, but complicated). I haven't thought thru all the thread locking issues around setting/resetting that flag, but I think you'd be okay so long as you refuse to allow an event handler to block while waiting to re-trigger the same event it resides inside (either programmatically somehow or by fiat - i.e., "you will thread lock if you do something this stupid") - perhaps add a lock/condition to the event struct so you can lock only that event when checking/changing the flag. Some performance considerations here, of course. Not sure you can be more re-entrant than that... HTH Ralph > >> >> Thanks for the heads-up, and thanks to everybody else who's hunting >> for regressions and other bugs in 2.0.8-rc. >> >> yrs, >> -- >> Nick >> *********************************************************************** >> To unsubscribe, send an e-mail to majord...@freehaven.net with >> unsubscribe libevent-users in the body. > *********************************************************************** To unsubscribe, send an e-mail to majord...@freehaven.net with unsubscribe libevent-users in the body.