Changeset: e9aefb4fc944 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e9aefb4fc944
Modified Files:
testing/Mtest.py.in
testing/process.py
tools/mserver/mserver5.c
Branch: default
Log Message:
On Windows, jump through hoops to gently terminate server.
process.terminate() hard kills the process which we don't want, since
output may not have been flushed. So create new console group for
server and send a CTRL-BREAK to it when we want the server to exit.
This is then caught by the server which dutifully exits.
diffs (102 lines):
diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in
--- a/testing/Mtest.py.in
+++ b/testing/Mtest.py.in
@@ -2831,8 +2831,13 @@ def LaunchIt(cmd, TestOut, TestErr, Time
if procdebug:
print('LaunchIt: starting process "%s" (inpipe)\n' % '" "'.join(cmd))
setpgrp = True
- proc = process.Popen(cmd, stdin=open(os.devnull), stdout=SrvrOut,
- stderr=TestErr, universal_newlines=True)
+ if os.name == "nt":
+ proc = process.Popen(cmd, stdin=open(os.devnull), stdout=SrvrOut,
+ stderr=TestErr, universal_newlines=True,
+ creationflags=process.CREATE_NEW_PROCESS_GROUP)
+ else:
+ proc = process.Popen(cmd, stdin=open(os.devnull), stdout=SrvrOut,
+ stderr=TestErr, universal_newlines=True)
# maybe buffer output as it comes to avoid deadlock
if SrvrOut == process.PIPE:
proc.stdout = process._BufferedPipe(proc.stdout)
@@ -3224,7 +3229,10 @@ def DoIt(env, SERVER, CALL, TST, EXT, PR
if SERVER in ["MAL", "SQL"]:
if ServerReady:
- pSrvr.terminate()
+ if os.name == "nt":
+ pSrvr.send_signal(signal.CTRL_BREAK_EVENT)
+ else:
+ pSrvr.terminate()
CollectIt(pSrvr.stdout, SrvrOut)
pSrvr.wait()
diff --git a/testing/process.py b/testing/process.py
--- a/testing/process.py
+++ b/testing/process.py
@@ -19,8 +19,15 @@ else:
import queue
from subprocess import PIPE
+__all__ = ['PIPE', 'Popen', 'client', 'server']
-__all__ = ['PIPE', 'Popen', 'client', 'server']
+try:
+ # on Windows, also make this available
+ from subprocess import CREATE_NEW_PROCESS_GROUP
+except ImportError:
+ pass
+else:
+ __all__.append('CREATE_NEW_PROCESS_GROUP')
verbose = False
diff --git a/tools/mserver/mserver5.c b/tools/mserver/mserver5.c
--- a/tools/mserver/mserver5.c
+++ b/tools/mserver/mserver5.c
@@ -237,6 +237,20 @@ static void emergencyBreakpoint(void)
static volatile sig_atomic_t interrupted = 0;
+#ifdef _MSC_VER
+static BOOL
+winhandler(DWORD type)
+{
+ (void) type;
+#ifdef HAVE_CONSOLE
+ if (!monet_daemon)
+ _Exit(-1);
+ else
+#endif
+ interrupted = 1;
+ return TRUE;
+}
+#else
static void
handler(int sig)
{
@@ -248,6 +262,7 @@ handler(int sig)
#endif
interrupted = 1;
}
+#endif
int
main(int argc, char **av)
@@ -623,6 +638,10 @@ main(int argc, char **av)
}
}
#else
+#ifdef _MSC_VER
+ if (!SetConsoleCtrlHandler(winhandler, TRUE))
+ fprintf(stderr, "!unable to create console control handler\n");
+#else
if(signal(SIGINT, handler) == SIG_ERR)
fprintf(stderr, "!unable to create signal handlers\n");
#ifdef SIGQUIT
@@ -632,6 +651,7 @@ main(int argc, char **av)
if(signal(SIGTERM, handler) == SIG_ERR)
fprintf(stderr, "!unable to create signal handlers\n");
#endif
+#endif
{
str lang = "mal";
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list