[Box Backup-commit] COMMIT r1900 - box/trunk/lib/common

boxbackup-dev at fluffy.co.uk boxbackup-dev at fluffy.co.uk
Mon Oct 22 18:25:42 BST 2007


Author: chris
Date: 2007-10-22 18:25:41 +0100 (Mon, 22 Oct 2007)
New Revision: 1900

Modified:
   box/trunk/lib/common/Timer.cpp
Log:
Bite the bullet and use sigaction() instead, since [1803] shows that
signal() works badly on SuckOS, and James reports that BSD doesn't
have sigset().


Modified: box/trunk/lib/common/Timer.cpp
===================================================================
--- box/trunk/lib/common/Timer.cpp	2007-10-20 22:50:01 UTC (rev 1899)
+++ box/trunk/lib/common/Timer.cpp	2007-10-22 17:25:41 UTC (rev 1900)
@@ -39,9 +39,16 @@
 		InitTimer();
 		SetTimerHandler(Timers::SignalHandler);
 	#else
-		sighandler_t oldHandler = ::sigset(SIGALRM, 
-			Timers::SignalHandler);
-		ASSERT(oldHandler == 0);
+		struct sigaction newact, oldact;
+		newact.sa_handler = Timers::SignalHandler;
+		newact.sa_flags = SA_RESTART;
+		::sigemptyset(&newact.sa_mask);
+		if (::sigaction(SIGALRM, &newact, &oldact) != 0)
+		{
+			BOX_ERROR("Failed to install signal handler");
+			THROW_EXCEPTION(CommonException, Internal);
+		}
+		ASSERT(oldact.sa_handler == 0);
 	#endif // WIN32 && !PLATFORM_CYGWIN
 	
 	spTimers = new std::vector<Timer*>;
@@ -70,8 +77,16 @@
 		int result = ::setitimer(ITIMER_REAL, &timeout, NULL);
 		ASSERT(result == 0);
 
-		sighandler_t oldHandler = ::sigset(SIGALRM, NULL);
-		ASSERT(oldHandler == Timers::SignalHandler);
+		struct sigaction newact, oldact;
+		newact.sa_handler = SIG_DFL;
+		newact.sa_flags = SA_RESTART;
+		::sigemptyset(&newact.sa_mask);
+		if (::sigaction(SIGALRM, &newact, &oldact) != 0)
+		{
+			BOX_ERROR("Failed to remove signal handler");
+			THROW_EXCEPTION(CommonException, Internal);
+		}
+		ASSERT(oldact.sa_handler == Timers::SignalHandler);
 	#endif // WIN32 && !PLATFORM_CYGWIN
 
 	spTimers->clear();
@@ -154,13 +169,21 @@
 	}
 
 	#ifndef WIN32
-	void (*oldhandler)(int) = ::sigset(SIGALRM, Timers::SignalHandler);
-	if (oldhandler != Timers::SignalHandler)
-	{
-		printf("Signal handler was %p, expected %p\n", 
-			oldhandler, Timers::SignalHandler);
-		THROW_EXCEPTION(CommonException, Internal)
-	}
+		struct sigaction oldact;
+		if (::sigaction(SIGALRM, NULL, &oldact) != 0)
+		{
+			BOX_ERROR("Failed to check signal handler");
+			THROW_EXCEPTION(CommonException, Internal)
+		}
+
+		ASSERT(oldact.sa_handler == Timers::SignalHandler);
+
+		if (oldact.sa_handler != Timers::SignalHandler)
+		{
+			printf("Signal handler was %p, expected %p\n", 
+				oldact.sa_handler, Timers::SignalHandler);
+			THROW_EXCEPTION(CommonException, Internal)
+		}
 	#endif
 
 	// Clear the reschedule-needed flag to false before we start.




More information about the Boxbackup-commit mailing list