-
Notifications
You must be signed in to change notification settings - Fork 18.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Snapshot on signal #2253
Merged
Merged
Snapshot on signal #2253
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#ifndef INCLUDE_CAFFE_UTIL_SIGNAL_HANDLER_H_ | ||
#define INCLUDE_CAFFE_UTIL_SIGNAL_HANDLER_H_ | ||
|
||
#include "caffe/proto/caffe.pb.h" | ||
#include "caffe/solver.hpp" | ||
|
||
namespace caffe { | ||
|
||
class SignalHandler { | ||
public: | ||
// Contructor. Specify what action to take when a signal is received. | ||
SignalHandler(SolverAction::Enum SIGINT_action, | ||
SolverAction::Enum SIGHUP_action); | ||
~SignalHandler(); | ||
ActionCallback GetActionFunction(); | ||
private: | ||
SolverAction::Enum CheckForSignals() const; | ||
SolverAction::Enum SIGINT_action_; | ||
SolverAction::Enum SIGHUP_action_; | ||
}; | ||
|
||
} // namespace caffe | ||
|
||
#endif // INCLUDE_CAFFE_UTIL_SIGNAL_HANDLER_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
#include <boost/bind.hpp> | ||
#include <glog/logging.h> | ||
|
||
#include <signal.h> | ||
#include <csignal> | ||
|
||
#include "caffe/util/signal_handler.h" | ||
|
||
namespace { | ||
static volatile sig_atomic_t got_sigint = false; | ||
static volatile sig_atomic_t got_sighup = false; | ||
static bool already_hooked_up = false; | ||
|
||
void handle_signal(int signal) { | ||
switch (signal) { | ||
case SIGHUP: | ||
got_sighup = true; | ||
break; | ||
case SIGINT: | ||
got_sigint = true; | ||
break; | ||
} | ||
} | ||
|
||
void HookupHandler() { | ||
if (already_hooked_up) { | ||
LOG(FATAL) << "Tried to hookup signal handlers more than once."; | ||
} | ||
already_hooked_up = true; | ||
|
||
struct sigaction sa; | ||
// Setup the handler | ||
sa.sa_handler = &handle_signal; | ||
// Restart the system call, if at all possible | ||
sa.sa_flags = SA_RESTART; | ||
// Block every signal during the handler | ||
sigfillset(&sa.sa_mask); | ||
// Intercept SIGHUP and SIGINT | ||
if (sigaction(SIGHUP, &sa, NULL) == -1) { | ||
LOG(FATAL) << "Cannot install SIGHUP handler."; | ||
} | ||
if (sigaction(SIGINT, &sa, NULL) == -1) { | ||
LOG(FATAL) << "Cannot install SIGINT handler."; | ||
} | ||
} | ||
|
||
// Set the signal handlers to the default. | ||
void UnhookHandler() { | ||
if (already_hooked_up) { | ||
struct sigaction sa; | ||
// Setup the sighub handler | ||
sa.sa_handler = SIG_DFL; | ||
// Restart the system call, if at all possible | ||
sa.sa_flags = SA_RESTART; | ||
// Block every signal during the handler | ||
sigfillset(&sa.sa_mask); | ||
// Intercept SIGHUP and SIGINT | ||
if (sigaction(SIGHUP, &sa, NULL) == -1) { | ||
LOG(FATAL) << "Cannot uninstall SIGHUP handler."; | ||
} | ||
if (sigaction(SIGINT, &sa, NULL) == -1) { | ||
LOG(FATAL) << "Cannot uninstall SIGINT handler."; | ||
} | ||
|
||
already_hooked_up = false; | ||
} | ||
} | ||
|
||
// Return true iff a SIGINT has been received since the last time this | ||
// function was called. | ||
bool GotSIGINT() { | ||
bool result = got_sigint; | ||
got_sigint = false; | ||
return result; | ||
} | ||
|
||
// Return true iff a SIGHUP has been received since the last time this | ||
// function was called. | ||
bool GotSIGHUP() { | ||
bool result = got_sighup; | ||
got_sighup = false; | ||
return result; | ||
} | ||
} // namespace | ||
|
||
namespace caffe { | ||
|
||
SignalHandler::SignalHandler(SolverAction::Enum SIGINT_action, | ||
SolverAction::Enum SIGHUP_action): | ||
SIGINT_action_(SIGINT_action), | ||
SIGHUP_action_(SIGHUP_action) { | ||
HookupHandler(); | ||
} | ||
|
||
SignalHandler::~SignalHandler() { | ||
UnhookHandler(); | ||
} | ||
|
||
SolverAction::Enum SignalHandler::CheckForSignals() const { | ||
if (GotSIGHUP()) { | ||
return SIGHUP_action_; | ||
} | ||
if (GotSIGINT()) { | ||
return SIGINT_action_; | ||
} | ||
return SolverAction::NONE; | ||
} | ||
|
||
// Return the function that the solver can use to find out if a snapshot or | ||
// early exit is being requested. | ||
ActionCallback SignalHandler::GetActionFunction() { | ||
return boost::bind(&SignalHandler::CheckForSignals, this); | ||
} | ||
|
||
} // namespace caffe |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe "unhook" these signals in
SignalHandler::~SignalHandler()
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK will do.