If the PID file isn't locked then appctl.py detects it as stale and bails out without doing anything. Because of this lots of Python tests fail.
Signed-off-by: Paul-Daniel Boca <pb...@cloudbasesolutions.com> --- V2: No changes V3: No changes V4: No changes --- lib/daemon-windows.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/lib/daemon-windows.c b/lib/daemon-windows.c index 8cf0fea..161e754 100644 --- a/lib/daemon-windows.c +++ b/lib/daemon-windows.c @@ -18,6 +18,7 @@ #include "daemon.h" #include "daemon-private.h" #include <stdio.h> +#include <io.h> #include <stdlib.h> #include "dirs.h" #include "ovs-thread.h" @@ -26,6 +27,12 @@ VLOG_DEFINE_THIS_MODULE(daemon_windows); +/* Constants for flock function */ +#define LOCK_SH 0x0 /* Shared lock. */ +#define LOCK_EX LOCKFILE_EXCLUSIVE_LOCK /* Exclusive lock. */ +#define LOCK_NB LOCKFILE_FAIL_IMMEDIATELY /* Don't block when locking. */ +#define LOCK_UN 0x80000000 /* Unlock. */ + static bool service_create; /* Was --service specified? */ static bool service_started; /* Have we dispatched service to start? */ @@ -414,6 +421,33 @@ unlink_pidfile(void) } } +static int +flock(FILE* fd, int operation) +{ + NTSTATUS status; + HANDLE hFile; + OVERLAPPED ov = {0}; + + hFile = (HANDLE)_get_osfhandle(fileno(filep_pidfile)); + if (hFile == INVALID_HANDLE_VALUE) { + VLOG_FATAL("Invalid handle value"); + return -1; + } + + if (operation & LOCK_UN) { + if (UnlockFileEx(hFile, 0, 0, 0xFFFF0000, &ov) == FALSE) { + return -1; + } + } else { + if (LockFileEx(hFile, operation, 0, 0, 0xFFFF0000, &ov) == FALSE) { + VLOG_FATAL("LockFileEx failed, status = 0x%08x\n", status); + return -1; + } + } + + return 0; +} + /* If a pidfile has been configured, creates it and stores the running * process's pid in it. Ensures that the pidfile will be deleted when the * process exits. */ @@ -444,6 +478,16 @@ make_pidfile(void) VLOG_FATAL("Failed to write into the pidfile %s", pidfile); } + fflush(filep_pidfile); + error = flock(filep_pidfile, LOCK_SH); + if (error) { + /* Looks like we failed to acquire the lock. Note that, if we failed + * for some other reason (and '!overwrite_pidfile'), we will have + * left 'tmpfile' as garbage in the file system. */ + VLOG_FATAL("%s: fcntl(F_SETLK) failed (%s)", pidfile, + ovs_strerror(error)); + } + /* Don't close the pidfile till the process exits. */ } -- 2.7.2.windows.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev