aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/sfx/timer/sigalrm.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2009-02-15 11:39:07 +0000
committerEugene Sandulenko2009-02-15 11:39:07 +0000
commite241843bec22600ab4ef98e7a085e82aac73fc93 (patch)
tree61a793884d3462e1feb80e80f202d8816d0c8ec4 /engines/sci/sfx/timer/sigalrm.cpp
parente9f742806362a84ffdb176a7414318dd2ab4df89 (diff)
downloadscummvm-rg350-e241843bec22600ab4ef98e7a085e82aac73fc93.tar.gz
scummvm-rg350-e241843bec22600ab4ef98e7a085e82aac73fc93.tar.bz2
scummvm-rg350-e241843bec22600ab4ef98e7a085e82aac73fc93.zip
- Remove some unneeded files
- Mass rename .c to .cpp svn-id: r38227
Diffstat (limited to 'engines/sci/sfx/timer/sigalrm.cpp')
-rw-r--r--engines/sci/sfx/timer/sigalrm.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/engines/sci/sfx/timer/sigalrm.cpp b/engines/sci/sfx/timer/sigalrm.cpp
new file mode 100644
index 0000000000..40cc2872e1
--- /dev/null
+++ b/engines/sci/sfx/timer/sigalrm.cpp
@@ -0,0 +1,157 @@
+/***************************************************************************
+ sigalrm.c Copyright (C) 2002 Christoph Reichenbach
+
+
+ This program may be modified and copied freely according to the terms of
+ the GNU general public license (GPL), as long as the above copyright
+ notice and the licensing information contained herein are preserved.
+
+ Please refer to www.gnu.org for licensing details.
+
+ This work is provided AS IS, without warranty of any kind, expressed or
+ implied, including but not limited to the warranties of merchantibility,
+ noninfringement, and fitness for a specific purpose. The author will not
+ be held liable for any damage caused by this work or derivatives of it.
+
+ By using this source code, you agree to the licensing terms as stated
+ above.
+
+
+ Please contact the maintainer for bug reports or inquiries.
+
+ Current Maintainer:
+
+ Christoph Reichenbach (CR) <jameson@linuxgames.com>
+
+***************************************************************************/
+
+#include <sfx_timer.h>
+
+#ifdef HAVE_SETITIMER
+
+#include <sys/time.h>
+#include <signal.h>
+#include <stdio.h>
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+#define sigprocmask pthread_sigmask
+#endif
+
+static void (*sig_callback)(void *) = NULL;
+static void *sig_callback_data = NULL;
+static sigset_t current_sigset;
+
+static void
+timer_handler(int i)
+{
+ if (sig_callback)
+ sig_callback(sig_callback_data);
+}
+
+static int
+sigalrm_set_option(char *name, char *value)
+{
+ return SFX_ERROR;
+}
+
+
+static int
+sigalrm_start(void)
+{
+ struct itimerval itimer;
+
+ itimer.it_value.tv_sec = 0;
+ itimer.it_value.tv_usec = 1000000/60;
+ itimer.it_interval = itimer.it_value;
+
+ signal(SIGALRM, timer_handler); /* Re-instate timer handler, to make sure */
+ setitimer(ITIMER_REAL, &itimer, NULL);
+
+ return SFX_OK;
+}
+
+
+static int
+sigalrm_init(void (*callback)(void *), void *data)
+{
+ if (sig_callback) {
+ fprintf(stderr, "Error: Attempt to initialize sigalrm timer more than once\n");
+ return SFX_ERROR;
+ }
+
+ if (!callback) {
+ fprintf(stderr, "Error: Attempt to initialize sigalrm timer w/o callback\n");
+ return SFX_ERROR;
+ }
+
+ sig_callback = callback;
+ sig_callback_data = data;
+
+ sigalrm_start();
+
+ sigemptyset(&current_sigset);
+ sigaddset(&current_sigset, SIGALRM);
+
+ return SFX_OK;
+}
+
+
+static int
+sigalrm_stop(void)
+{
+ struct itimerval itimer;
+
+ if (!sig_callback) {
+ fprintf(stderr, "Error: Attempt to stop sigalrm timer when not running\n");
+ return SFX_ERROR;
+ }
+
+ itimer.it_value.tv_sec = 0;
+ itimer.it_value.tv_usec = 0;
+ itimer.it_interval = itimer.it_value;
+
+ setitimer(ITIMER_REAL, &itimer, NULL); /* Stop timer */
+ signal(SIGALRM, SIG_DFL);
+
+ return SFX_OK;
+}
+
+
+static int
+sigalrm_block(void)
+{
+ if (sigprocmask(SIG_BLOCK, &current_sigset, NULL) != 0) {
+ fprintf(stderr, "Error: Failed to block sigalrm\n");
+ return SFX_ERROR;
+ }
+
+ return SFX_OK;
+}
+
+
+static int
+sigalrm_unblock(void)
+{
+ if (sigprocmask(SIG_UNBLOCK, &current_sigset, NULL) != 0) {
+ fprintf(stderr, "Error: Failed to unblock sigalrm\n");
+ return SFX_ERROR;
+ }
+
+ return SFX_OK;
+}
+
+
+sfx_timer_t sfx_timer_sigalrm = {
+ "sigalrm",
+ "0.1",
+ 17, /* 1000 / 60 */
+ 0,
+ &sigalrm_set_option,
+ &sigalrm_init,
+ &sigalrm_stop,
+ &sigalrm_block,
+ &sigalrm_unblock
+};
+
+#endif /* HAVE_SETITIMER */