Userspace module return value?

Ingo Molnar mingo at elte.hu
Tue Jul 20 14:00:21 UTC 2004


* Marek Habersack <grendel at caudium.net> wrote:

> if (rval == REQ_STATIC) {
>     req->event = 1;
>     do_syslog("Static request, getting the object (%s)", req->objectname);
>     rval = tux(TUX_ACTION_GET_OBJECT, req);
>     if (rval < 0 || req->error) {
>       req->event = 2;
>       if (content_type(req) == CONTENT_NOTIFY) 
>         return send_failure(req, LOG_ERR_OBJECT_NOT_FOUND);
>       
>       goto abort;
>     }
>     return rval;
>   }

This code doesnt handle events properly. When tux() returns there might
be another request active (with a different ->priv value) - you need to
return so that your event loop can be re-called with the proper request
pointer.

the req->event code can be used to distinguish between the various
phases a particular request is in. (you can also track your request's
state via the ->priv pointer) demo2.c shows a 3-phase request. (for
simplicity the demo code uses write() but a truly atomic module should
use TUX_ACTION_SEND_BUFFER to write to the socket. A write(), if the
send buffers are set to be small on your system, might block your thread
and hence all requests might be blocked by the remote client.)

it all looks a bit complex but that is how event-based programming is
...

	Ingo





More information about the tux-list mailing list