FCGI does not fail accept on interrupt

Dean Banks <[email protected]> Mon, 07 Mar 2011 09:55:31 -0800
Newsgroups gmane.comp.web.fastcgi.devel
Message-ID <[email protected]>
I have a multithreaded FCGI application developed in C that is based on 
the threaded.c example in the SDK.  I am using supervisor to hook it for 
use with nginx.  It works very well, except for the following issue--

Each thread has its own FCGI handle (like threaded.c), and each call to 
FCGX_InitRequest() sets the FCGI_FAIL_ACCEPT_ON_INTR flag.  I have a 
signal handler set up to catch SIGINT and gracefully wind the process 
down.  The signal handler calls FCGX_ShutdownPending() in an attempt to 
do this.

When there are no incoming requests, all threads except one are blocked 
on the FCGX_Accept_r() mutex, and one is blocked on FCGX_Accept_r(), as 
expected.  If a SIGINT is issued, all of the threads that are blocked on 
the mutex will properly abort once the mutex is released and they have a 
chance to call FCGX_Accept_r().  The trouble is that the thread that is 
blocking on FCGX_Accept_r() does not abort when SIGINT is thrown. One 
additional incoming request is required to get past the FCGX_Accept_r() 
block and release that particular thread.

After extensive searching, I could not find a good example of the proper 
use of FCGI_FAIL_ACCEPT_ON_INTR, so I can't help but wonder if I'm 
getting it wrong.  What is the proper way to get FCGX_Accept_r() to 
release its block in a process shutdown scenario?

Cheers,

Dean