--- coda-6.9.3/coda-src/vice/srv.cc.sigterm 2007-12-29 00:25:33.000000000 +0100
+++ coda-6.9.3/coda-src/vice/srv.cc 2008-05-15 15:50:29.000000000 +0200
@@ -194,6 +194,7 @@ static int chk = 0; // default 30
static int ForceSalvage = 0; // default 1
static int SalvageOnShutdown = 0; // default 0 */
+static PROCESS CheckPid;
static int ViceShutDown = 0;
static int Statistics;
@@ -246,6 +247,7 @@ static void ClearCounters();
static void FileMsg();
static void SetDebug(int ign);
static void ResetDebug(int ign);
+static void SigTerm(int ign);
static void ShutDown();
static int ReadConfigFile(void);
@@ -521,7 +523,7 @@ int main(int argc, char *argv[])
(void *)&cbwait, "CheckCallBack", &serverPid) == LWP_SUCCESS);
CODA_ASSERT(LWP_CreateProcess(CheckLWP, stack*1024, LWP_NORMAL_PRIORITY,
- (void *)&chk, "Check", &serverPid) == LWP_SUCCESS);
+ (void *)&chk, "Check", &CheckPid) == LWP_SUCCESS);
for (i=0; i < auth_lwps; i++) {
sprintf(sname, "AuthLWP-%d",i);
@@ -860,7 +862,6 @@ static void CallBackCheckLWP(void *arg)
static void CheckLWP(void *arg)
{
- struct timeval time;
struct timeval tpl;
struct timezone tspl;
ProgramType *pt;
@@ -879,11 +880,9 @@ static void CheckLWP(void *arg)
SLog(1, "Starting Check process");
- time.tv_sec = chk;
- time.tv_usec = 0;
while (1) {
- if (IOMGR_Select(0, 0, 0, 0, &time) == 0) {
+ LWP_QWait();
if(ViceShutDown) {
ProgramType *pt, tmp_pt;
@@ -898,9 +897,6 @@ static void CheckLWP(void *arg)
ShutDown();
*pt = tmp_pt;
}
-
- if(time.tv_sec != chk) time.tv_sec = chk;
- }
}
}
@@ -1197,6 +1193,13 @@ static void ResetDebug(int ign)
SLog(0, "Reset Debug levels to 0");
}
+static void SigTerm(int ign)
+{
+ ViceShutDown = 1;
+ SLog(0, "SigTerm received, shutting down");
+ LWP_QSignal(CheckPid);
+}
+
/*
BEGIN_HTML
<a name="SwapMalloc"><strong>Toggle tracing of recoverable(rds) mallocs </strong></a>
@@ -1295,6 +1298,7 @@ void ViceTerminate()
{
ViceShutDown = 1;
SLog(0, "Shutdown received");
+ LWP_QSignal(CheckPid);
}
@@ -1683,6 +1687,9 @@ static int DaemonizeSrv(const char *pidf
memset(&sa, 0, sizeof(sa));
sa.sa_flags = SA_RESTART;
+ sa.sa_handler = SigTerm;
+ sigaction(SIGTERM, &sa, NULL);
+
sa.sa_handler = ResetDebug;
sigaction(SIGUSR2, &sa, NULL);