Yeah, I didn't use evthread_use_pthreads. It works as expected now. Thanks
:)

2011/5/2 Nick Mathewson <ni...@freehaven.net>

> On Mon, May 2, 2011 at 7:18 PM, D.P. <piz...@gmail.com> wrote:
> > Hi, I have a question regarding adding an event from a different thread
> > (different from the one event_base_dispatch was called).
> > Initially I create an event_base, add a listener socket to it, and do
> > event_base_dispatch. When a listener socket gets an incoming connection,
> it
> > will add the new client socket (from inside the callback) to event_base.
> > Everything works as expected up to this point (i.e. client socket
> callback
> > is invoked whenever there is data
> > to read, and listener socket is invoked whenever there is another client
> > trying to connect.) Now I add another socket using event_add, but from a
> > different
> > thread. Now let's say some data arrives at this socket that I have just
> > added. It seems that a callback for this socket will only get invoked
> > *after* there
> > is some activity on the other two sockets (listener or client from
> before).
> > So if there is no activity at all on the two sockets that were added
> before,
> > the callback
> > for this new socket will never get called. I tested the same code on OS X
> > with kqueue and poll backends, and on Linux with epoll and poll. This
> does
> > not happen
> > with epoll (the new socket callback will be fired even if there is no
> > activity on the other two), but does happen with kqueue and poll. Is
> there
> > anything I can do
> > to "force" an immediate refresh (while the event loop is running) of the
> set
> > of watched sockets for systems that use kqueue or poll?
>
> This sounds a lot like what would happen if you didn't enable
> threading support.  Check out the "Locks and Threading" part of
> http://www.wangafu.net/~nickm/libevent-book/Ref1_libsetup.html .
>
> Basically, before you create any event_base that you're going to
> access from more than one thread, you need to tell Libevent about your
> threading library.  On Windows, just call
>    int evthread_use_windows_threads(void);
> On Linux or OS X or any place with pthreads, call
>    int evthread_use_pthreads(void);
> If you're using some weird threading library, you'll need to teach
> Libevent how to use it.
>
> Setting up threading performs two functions: it tells Libevent how to
> do locking in order to protect data structures that are accessed from
> multiple threads, and it also tells Libevent how to alert an
> event_base whose dispatch function is running in one thread that it
> needs to wake up and change the set of events that it's listening to.
>
> These functions are new in Libevent 2.0; in earlier versions there was
> no realistic safe way to use an event_base from multiple threads
> simultaneously.
>
> I'm starting to think that we need a FAQ.  ;)
>
> --
> Nick
> ***********************************************************************
> To unsubscribe, send an e-mail to majord...@freehaven.net with
> unsubscribe libevent-users    in the body.
>

Reply via email to