Hi all,

I am having trouble sending HTTP replies/responses in a timely manner using
evhttp.

PROBLEM:
If I call evhttp_send_reply in the gencb (callback that handles all
requests), then my requests are sent out in a timely manner and everything
is fine.  However, I do some processing that will take a while so I don't
want do the processing in this callback because it will hold up the
dispatch loop and I think I won't be able to accept any connections while
I'm doing this slow processing.  Instead, when I get a request, I store the
evhttp_request* off, and then hand it to a thread, and then return from the
gencb.  Later, when the processing is done, the original request's
evhttp_request* is retrieved and used to send the response.  However, the
browser doesn't receive the response until exactly 10.0s later after the
evhttp_send_reply was invoked, everytime...unless I call evhttp_send_reply
from the gencb in the dispatch loop thread, in which case the browser gets
the response immediately.

PSEUDOCODE:

*Dispatch loop thread*
::onGeneralRequest { 1. Store the evhttp_request, 2. Hand off the request
to a worker thread, 3. return }

*Worker thread*
      // do work that might take a few seconds
      cout << "about to send reply" << endl;
      evbuffer* resp_buf = evbuffer_new();
      evbuffer_add_printf(resp_buf, "This is the body");
      evhttp_send_reply(response.conn, 200, "bogus reason", resp_buf); //
use the original evhttp_request* (response.conn), send a success message
      cout << "sent reply" << endl; // at this point the browser still
doesn't get the response, 10s in the future it will get it

QUESTIONS:

   - Do I need to use evthread.h?  I am using QThreads, part of the Qt
   library, so it looks like I need to implement and call three methods: 1)
   evthread_set_condition_callbacks, 2) evthread_set_id_callbacks, and 3)
   evthread_set_lock_callbacks.  Do I just implement and call these methods
   and then everything will be fine?  I don't need to tell the library to
   specifically use my custom threading library as long as I call these three
   methods?  There's no other setup?  After I set these methods all the
   threading/locking is transparent to me?
   - Why does it seem like I can't send the reply from a different thread?
    The variables I'm using are local to the particular request and are not
   shared, so I don't see why there should be any problem.  In other words, I
   don't expect that there would be any race conditions since the requests are
   isolated from each other (?)
   - Any idea what this 10s delay is when I send the reply from a different
   thread?


Any feedback would be greatly appreciated.

Thanks,
-Julian

Reply via email to