Issue Details (XML | Word | Printable)

Key: MODPYTHON-37
Type: New Feature New Feature
Status: Closed Closed
Resolution: Fixed
Priority: Minor Minor
Assignee: Unassigned
Reporter: Graham Dumpleton
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
mod_python

Add apache.register_cleanup().

Created: 20/Mar/05 07:09 PM   Updated: 05/Mar/06 03:05 PM
Return to search
Component/s: core
Affects Version/s: 3.1.4
Fix Version/s: 3.2.7

Time Tracking:
Not Specified

File Attachments:
  Size
Text File Licensed for inclusion in ASF works register_cleanup.diff.txt 2005-08-06 09:39 AM Graham Dumpleton 4 kB

Resolution Date: 06/Aug/05 06:11 PM


 Description  « Hide
The only way to register cleanup methods to be executed upon child termination
is through req.server.register_cleanup(). Since the cleanup method isn't specific
to a request, it seems that there should also be an apache.register_cleanup(). This
would allow cleanup function registration upon child termination to be done from
a module imported using the PythonImport directive.

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Graham Dumpleton added a comment - 26/Mar/05 08:24 AM
This may not be straightforward. See comments from FAQ entry:

  http://www.modpython.org/FAQ/faqw.py?req=show&file=faq03.011.htp

Graham Dumpleton added a comment - 06/Aug/05 09:39 AM
Added diff as attachment that implements desired functionality. Diff was against the
latest code in subversion repository.

Graham Dumpleton added a comment - 06/Aug/05 01:15 PM
Note, attached diff has minor mistake. See following excerpt from mailing
list note this as well as a bit of documentation.

> I need to know what all parameters apache.register_cleanup() is expecting.

Just like you had called req.register_cleanup() except that cleanup
handler is called on server shutdown like req.server.register_cleanup().

 register_cleanup(callable[, data])

   Registers a cleanup. Argument callable can be any callable object, the
   optional argument data can be any object (default is None). At Apache
   child process termination, callable will be called with one argument, data.

   If errors are encountered during cleanup processing, they should be in
   error log.

Note that I have actually made a minor mistake in the code. In apache.py,
the prototype should be:

  def register_cleanup(handler,data=None):
      _apache.register_cleanup(_interpreter,_server,handler,data)

I used "args=()" which isn't technically correct but only in as much as
I used "()" instead of "None". I was thinking you could supply a tuple of
arguments whereas you can actually only supply a single argument. What I
did wouldn't have stopped it working though.

Anyway, you should be able to do:

  def shutdown1():
      apache.log_error("shutdown1")

  apache.register_cleanup(shutdown1)

  def shutdown2(data):
      apache.log_error("shutdown2 %r"%data)

  apache.register_cleanup(shutdown2,"data")

Nicolas Lehuen added a comment - 06/Aug/05 06:11 PM
I have integrated Graham's patch (with data=None instead of data=()). I have also added a unit test to check whether the new apache.register_cleanup funciton works correctly? I ran the unit test and everything seems OK, there is no regression and the new function is OK.

Graham Dumpleton added a comment - 05/Mar/06 03:05 PM
Although closing this issue, should be noted that both apache.register_cleanup() and req.server.register_cleanup() may need to be deprecated and removed. This is because the only mechanism for having a cleanup function run on server shutdown is error prone as it invokes stuff from a signal handler. See MODPYTHON-109.