On 04/11/2006, at 12:34 PM, Jeff Robbins wrote:

Graham,

I haven't had any new ideas about this problem. It is clear that on Windows, mod_python is initialized both in a parent process and more usefully in the child process that spins up the threads that service client requests. The parent process is long-lived and the standard hack to wait for the second call to the ap_hook_post_config is useless because each "restart" of apache is yet another call (third, fourth, fifth, etc...) and each time there's a leak of one handle.


The fix I tested seems reasonable. I know it is dependent on mpm_winnt.c, but, after all, that file is the file responsible for the dual process architecture on windows to begin with. And the fix has an #ifdef win32 so it won't hurt linux users.

I'd like you to consider folding it in. I think it is better than having a leak (along with spurious python initialization) on windows.

Jeff, can you see if you can come up with a test based on 'initialized' and
'child_init_pool' as I note in:

  http://issues.apache.org/jira/browse/MODPYTHON-195

If it is only in the parent process you need to skip subsequent calls, perhaps:

  if (child_init_pool == 0 && initialized != 0)
      return OK;

Will have to think about how this may screw up old versions of Mac OS X
though which is why initialized was added in the first place.

You might include in your debug a call to Py_IsInitialized() so it can be determined if Python thinks it is already initialised. Since your fiddle is
working, I'd say it probably is.

Also see if main_server is set and not zero as well and whether its value is different to 's' passed as argument to function. Whether it is the same or not may dictate where in function the check to bail out of function needs
to be. It may have to go just before the global config and mutexes are
created.

Graham

Reply via email to