]>
git.proxmox.com Git - mirror_ovs.git/blob - python/ovs/fatal_signal.py
73e4be6ad8f2f8e317393e437e22f6701b1badad
1 # Copyright (c) 2010, 2011 Nicira, Inc.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at:
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
23 vlog
= ovs
.vlog
.Vlog("fatal-signal")
26 def add_hook(hook
, cancel
, run_at_exit
):
28 _hooks
.append((hook
, cancel
, run_at_exit
))
32 """Clears all of the fatal signal hooks without executing them. If any of
33 the hooks passed a 'cancel' function to add_hook(), then those functions
34 will be called, allowing them to free resources, etc.
36 Following a fork, one of the resulting processes can call this function to
37 allow it to terminate without calling the hooks registered before calling
38 this function. New hooks registered after calling this function will take
41 for hook
, cancel
, run_at_exit
in _hooks
:
51 def add_file_to_unlink(file):
52 """Registers 'file' to be unlinked when the program terminates via
53 sys.exit() or a fatal signal."""
57 add_hook(_unlink_files
, _cancel_files
, True)
61 def remove_file_to_unlink(file):
62 """Unregisters 'file' from being unlinked when the program terminates via
63 sys.exit() or a fatal signal."""
68 def unlink_file_now(file):
69 """Like fatal_signal_remove_file_to_unlink(), but also unlinks 'file'.
70 Returns 0 if successful, otherwise a positive errno value."""
73 vlog
.warn("could not unlink \"%s\" (%s)" % (file, os
.strerror(error
)))
74 remove_file_to_unlink(file)
98 def _signal_handler(signr
, _
):
101 # Re-raise the signal with the default handling so that the program
102 # termination status reflects that we were killed by this signal.
103 signal
.signal(signr
, signal
.SIG_DFL
)
104 os
.kill(os
.getpid(), signr
)
107 def _atexit_handler():
114 def _call_hooks(signr
):
120 for hook
, cancel
, run_at_exit
in _hooks
:
121 if signr
!= 0 or run_at_exit
:
132 if sys
.platform
== "win32":
133 signals
= [signal
.SIGTERM
, signal
.SIGINT
]
135 signals
= [signal
.SIGTERM
, signal
.SIGINT
, signal
.SIGHUP
,
138 for signr
in signals
:
139 if signal
.getsignal(signr
) == signal
.SIG_DFL
:
140 signal
.signal(signr
, _signal_handler
)
141 atexit
.register(_atexit_handler
)
144 def signal_alarm(timeout
):
145 if sys
.platform
== "win32":
150 class Alarm (threading
.Thread
):
151 def __init__(self
, timeout
):
152 super(Alarm
, self
).__init
__()
153 self
.timeout
= timeout
157 time
.sleep(self
.timeout
)
160 alarm
= Alarm(timeout
)
163 signal
.alarm(timeout
)