-# Copyright (c) 2010, 2011 Nicira Networks
+# Copyright (c) 2010, 2011 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# limitations under the License.
import atexit
-import logging
import os
import signal
+import ovs.vlog
+
_hooks = []
+vlog = ovs.vlog.Vlog("fatal-signal")
+
def add_hook(hook, cancel, run_at_exit):
_init()
_hooks.append((hook, cancel, run_at_exit))
+
def fork():
"""Clears all of the fatal signal hooks without executing them. If any of
the hooks passed a 'cancel' function to add_hook(), then those functions
_added_hook = False
_files = {}
+
def add_file_to_unlink(file):
"""Registers 'file' to be unlinked when the program terminates via
sys.exit() or a fatal signal."""
add_hook(_unlink_files, _cancel_files, True)
_files[file] = None
+
def remove_file_to_unlink(file):
"""Unregisters 'file' from being unlinked when the program terminates via
sys.exit() or a fatal signal."""
if file in _files:
del _files[file]
+
def unlink_file_now(file):
"""Like fatal_signal_remove_file_to_unlink(), but also unlinks 'file'.
Returns 0 if successful, otherwise a positive errno value."""
error = _unlink(file)
if error:
- logging.warning("could not unlink \"%s\" (%s)"
- % (file, os.strerror(error)))
+ vlog.warn("could not unlink \"%s\" (%s)" % (file, os.strerror(error)))
remove_file_to_unlink(file)
return error
+
def _unlink_files():
- for file in _files:
- _unlink(file)
+ for file_ in _files:
+ _unlink(file_)
+
def _cancel_files():
global _added_hook
_added_hook = False
_files = {}
-def _unlink(file):
+
+def _unlink(file_):
try:
- os.unlink(file)
+ os.unlink(file_)
return 0
except OSError, e:
return e.errno
+
\f
def _signal_handler(signr, _):
_call_hooks(signr)
signal.signal(signr, signal.SIG_DFL)
os.kill(os.getpid(), signr)
+
def _atexit_handler():
_call_hooks(0)
+
recurse = False
+
+
def _call_hooks(signr):
global recurse
if recurse:
if signr != 0 or run_at_exit:
hook()
+
_inited = False
+
+
def _init():
global _inited
if not _inited: