State associated with a request.
This is the API for multi-threaded code. Code should be structured like this:
int descriptor;
Mutex mutex;
void handler() {
FastCGI.request request;
assert(FastCGI.request.init(out request, descriptor) == 0);
while (true) {
mutex.lock () ;
var fail = request.accept() < 0;
mutex.unlock();
if (fail)
break;
// Process request
request.finish();
}
request.close(false);
}
void main() {
mutex = new Mutex();
assert(FastCGI.init() == 0);
stderr.printf("I:open_socket path=\"%s\" backlog=%d\n", socket_path, backlog);
descriptor = FastCGI.open_socket(socket_path, backlog);
assert(descriptor != -1);
try {
while (thread_count > 1) {
Thread.create<void>(handler, false);
thread_count--;
}
handler();
} catch(ThreadError e) {
// Handle error
}
}
It is important that only one thread at a time attempt to call accept, hence the mutex. The request can be read from the client using environment and the response can be written to the client using out.