summaryrefslogtreecommitdiff
path: root/i/marvin/src/utils/signalhandler.tcc
diff options
context:
space:
mode:
Diffstat (limited to 'i/marvin/src/utils/signalhandler.tcc')
-rw-r--r--i/marvin/src/utils/signalhandler.tcc66
1 files changed, 66 insertions, 0 deletions
diff --git a/i/marvin/src/utils/signalhandler.tcc b/i/marvin/src/utils/signalhandler.tcc
new file mode 100644
index 0000000..04a1660
--- /dev/null
+++ b/i/marvin/src/utils/signalhandler.tcc
@@ -0,0 +1,66 @@
+// signalhandler.cc
+// // // marvin - programme du robot 2006. {{{
+// // //
+// // // Copyright (C) 2003-2006 Sebastien Beaufour
+// // //
+// // // Robot APB Team/Efrei 2006.
+// // // Web: http://assos.efrei.fr/robot/
+// // // Email: robot AT efrei DOT fr
+// // //
+// // // This program is free software; you can redistribute it and/or modify
+// // // it under the terms of the GNU General Public License as published by
+// // // the Free Software Foundation; either version 2 of the License, or
+// // // (at your option) any later version.
+// // //
+// // // This program is distributed in the hope that it will be useful,
+// // // but WITHOUT ANY WARRANTY; without even the implied warranty of
+// // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// // // GNU General Public License for more details.
+// // //
+// // // You should have received a copy of the GNU General Public License
+// // // along with this program; if not, write to the Free Software
+// // // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// // //
+// // // }}}
+// //
+// //
+//
+
+#include "signalhandler.hh"
+
+/// reset NEED a default reset, so here is a default reset with nothing inside
+template<int sig> void SignalHandler<sig>::DefaultReset (void)
+{
+ // Nothing
+}
+
+// Now we can set the default value to reset
+template<int sig> Callback<void> SignalHandler<sig>::reset=SignalHandler::DefaultReset;
+
+///Static member which will be use by sigaction
+template<int sig> void SignalHandler<sig>::trapsigint(int a)
+{
+ std::cout << "Trap du crtl+c "<< std::endl;
+ reset();
+}
+
+///Function to bind to the function to be called when signal il caught
+template<int sig> void SignalHandler<sig>::bind(Callback<void> r)
+{
+ reset=r;
+ action.sa_handler = trapsigint;
+ action.sa_flags = SA_ONESHOT;
+ sigaction(sig,&action,NULL);
+}
+
+/// Constructor, nothing to do
+template<int sig> SignalHandler<sig>::SignalHandler()
+{
+ //nada
+}
+
+///Destructor, put the old sig handler back
+template<int sig> SignalHandler<sig>::~SignalHandler()
+{
+ sigaction(sig,&old,NULL);
+}