Hi folks, I am having some trouble with external select mode getting my call to select() to recognize that a response has been queued. The key thing I am trying to learn is how to create and queue a response in a different thread from the main response handling thread.
Short version: the access handler callback does not create or queue a response, but suspends the connection, and queues a task object (including a pointer to the suspended MHD_Connection) on a shared queue. A worker thread pops the task off the queue, pretends to do some work (the code is just a learning exercise at this point), then creates a MHD_Response (using MHD_create_response_from_buffer), resumes the connection, and queues the response. Meanwhile, the main loop is waiting for select() to see that something happened, but it doesn't notice any changes. The call to select will eventually time out (after 15 seconds), and the next time through the main loop it will pick up the changes, and the call to MHD_run will cause the response to be sent, finally. Clearly I am missing something, since I seem to have managed to turn a supposedly event-driven select loop into a polling loop, in effect. Should this have worked? (I.e., there is evidently a bug or some deeper design detail that needs code samples to work out.) Or did I miss an obvious high-level step (or two or three)? I don't mind admitting that I am out of my depth here! (Hey, that's how you learn things.) I've used MHD in more conventional settings a few times now, and like the library very much, but up until now I've never really plumbed the depths this much. I've worked through fileserver_example_external_select.c, and I've read a few threads from the archives on asynchronous applications of the library, but I'm afraid I have not quite managed to connect all the dots. Any advice, further questions, or other help would be most welcome. Tom Cornell
