diff --git a/mozilla/modules/ipc/common/ipcConfig.h b/mozilla/modules/ipc/common/ipcConfig.h index df381a8b15d..952d40b2257 100644 --- a/mozilla/modules/ipc/common/ipcConfig.h +++ b/mozilla/modules/ipc/common/ipcConfig.h @@ -48,6 +48,7 @@ #define IPC_WINDOW_NAME "Mozilla:IPCWindow" #define IPC_CLIENT_WINDOW_CLASS "Mozilla:IPCAppWindowClass" #define IPC_CLIENT_WINDOW_NAME_PREFIX "Mozilla:IPCAppWindow:" +#define IPC_SYNC_EVENT_NAME "Local\\MozillaIPCSyncEvent" #define IPC_DAEMON_APP_NAME "mozipcd.exe" #define IPC_PATH_SEP_CHAR '\\' diff --git a/mozilla/modules/ipc/daemon/ipcdUnix.cpp b/mozilla/modules/ipc/daemon/ipcdUnix.cpp index 832b851ee9d..df340029afb 100644 --- a/mozilla/modules/ipc/daemon/ipcdUnix.cpp +++ b/mozilla/modules/ipc/daemon/ipcdUnix.cpp @@ -383,8 +383,10 @@ int main(int argc, char **argv) else socket_path = argv[1]; - if (!InitDaemonDir(socket_path)) + if (!InitDaemonDir(socket_path)) { + PR_Close(listenFD); return 0; + } addr.local.family = PR_AF_LOCAL; PL_strncpyz(addr.local.path, socket_path, sizeof(addr.local.path)); diff --git a/mozilla/modules/ipc/daemon/ipcdWin.cpp b/mozilla/modules/ipc/daemon/ipcdWin.cpp index f047d6a9939..930b9fe3b55 100644 --- a/mozilla/modules/ipc/daemon/ipcdWin.cpp +++ b/mozilla/modules/ipc/daemon/ipcdWin.cpp @@ -200,7 +200,7 @@ IPC_SendMessageNow(ipcClient *client, const ipcMessage *msg) //----------------------------------------------------------------------------- static LRESULT CALLBACK -ipcWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LOG(("got message [msg=%x wparam=%x lparam=%x]\n", uMsg, wParam, lParam)); @@ -230,6 +230,47 @@ ipcWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return DefWindowProc(hWnd, uMsg, wParam, lParam); } +//----------------------------------------------------------------------------- +// daemon startup synchronization +//----------------------------------------------------------------------------- + +static HANDLE ipcSyncEvent; + +static PRBool +AcquireLock() +{ + ipcSyncEvent = CreateEvent(NULL, FALSE, FALSE, + IPC_SYNC_EVENT_NAME); + if (!ipcSyncEvent) { + LOG(("CreateEvent failed [%u]\n", GetLastError())); + return PR_FALSE; + } + + if (ipcSyncEvent) { + // check to see if event already existed prior to this call. + if (GetLastError() == ERROR_ALREADY_EXISTS) { + LOG((" lock already set; exiting...\n")); + return PR_FALSE; + } + } + + LOG((" acquired lock\n")); + return PR_TRUE; +} + +static void +ReleaseLock() +{ + if (ipcSyncEvent) { + CloseHandle(ipcSyncEvent); + ipcSyncEvent = NULL; + } +} + +//----------------------------------------------------------------------------- +// main +//----------------------------------------------------------------------------- + int main(int argc, char **argv) { @@ -238,6 +279,9 @@ main(int argc, char **argv) #endif LOG(("daemon started...\n")); + if (!AcquireLock()) + return 0; + ipcClients = ipcClientArray; ipcClientCount = 0; @@ -246,7 +290,7 @@ main(int argc, char **argv) // WNDCLASS wc; memset(&wc, 0, sizeof(wc)); - wc.lpfnWndProc = ipcWindowProc; + wc.lpfnWndProc = WindowProc; wc.lpszClassName = IPC_WINDOW_CLASS; RegisterClass(&wc); @@ -270,6 +314,8 @@ main(int argc, char **argv) while (GetMessage(&msg, ipcHwnd, 0, 0)) DispatchMessage(&msg); + ReleaseLock(); + LOG(("exiting\n")); return 0; }