• R/O
  • SSH
  • HTTPS

exewrap: コミット


コミットメタ情報

リビジョン93 (tree)
日時2020-08-25 15:58:27
作者hirukawa_ryo

ログメッセージ

* exewrap 1.6.3
console/guiで拡張フラグSINGLEを指定した場合、Mutexの新規作成ではなく所有権の獲得で二重起動を制御するようにしました。

変更サマリ

差分

--- exewrap/trunk/exewrap/src/image_console.c (revision 92)
+++ exewrap/trunk/exewrap/src/image_console.c (revision 93)
@@ -34,6 +34,7 @@
3434 BOOL use_side_by_side_jre;
3535 BOOL is_security_manager_required = FALSE;
3636 HANDLE synchronize_mutex_handle = NULL;
37+ HANDLE singleton_mutex_handle = NULL;
3738 RESOURCE res;
3839 LOAD_RESULT result;
3940
@@ -72,10 +73,28 @@
7273 }
7374 if(wcsstr(ext_flags, L"SINGLE") != NULL)
7475 {
75- if(CreateMutex(NULL, TRUE, get_module_object_name(L"SINGLE")), GetLastError() == ERROR_ALREADY_EXISTS)
76+ singleton_mutex_handle = CreateMutex(NULL, FALSE, get_module_object_name(L"SINGLE"));
77+ if(singleton_mutex_handle == NULL)
7678 {
77- exit_process(ERROR_BUSY, NULL);
79+ exit_process(GetLastError(), L"CreateMutex");
7880 }
81+ else
82+ {
83+ DWORD ret = WaitForSingleObject(singleton_mutex_handle, 0);
84+ if(ret == WAIT_FAILED)
85+ {
86+ CloseHandle(singleton_mutex_handle);
87+ singleton_mutex_handle = NULL;
88+ exit_process(GetLastError(), L"WaitForSingleObject");
89+ }
90+ else if(ret == WAIT_TIMEOUT)
91+ {
92+ CloseHandle(singleton_mutex_handle);
93+ singleton_mutex_handle = NULL;
94+ exit_process(ERROR_BUSY, NULL);
95+ }
96+ // retが上記以外(WAIT_OBJECT_0 または WAIT_ABANDONED)であればミューテックスの所有権を獲得できているので処理を続行します。
97+ }
7998 }
8099 if(wcsstr(ext_flags, L"CD_APPDIR") != NULL)
81100 {
@@ -263,6 +282,12 @@
263282
264283 notify_close();
265284
285+ if(singleton_mutex_handle != NULL)
286+ {
287+ ReleaseMutex(singleton_mutex_handle);
288+ CloseHandle(singleton_mutex_handle);
289+ }
290+
266291 return result.msg_id;
267292 }
268293
--- exewrap/trunk/exewrap/src/image_gui.c (revision 92)
+++ exewrap/trunk/exewrap/src/image_gui.c (revision 93)
@@ -56,6 +56,7 @@
5656 BOOL use_side_by_side_jre;
5757 BOOL is_security_manager_required = FALSE;
5858 HANDLE synchronize_mutex_handle = NULL;
59+ HANDLE singleton_mutex_handle = NULL;
5960 RESOURCE res;
6061 LOAD_RESULT result;
6162
@@ -99,11 +100,31 @@
99100 }
100101 if(wcsstr(ext_flags, L"SINGLE") != NULL)
101102 {
102- if(CreateMutex(NULL, TRUE, get_module_object_name(L"SINGLE")), GetLastError() == ERROR_ALREADY_EXISTS)
103+ singleton_mutex_handle = CreateMutex(NULL, FALSE, get_module_object_name(L"SINGLE"));
104+ if(singleton_mutex_handle == NULL)
103105 {
104- result.msg_id = ERROR_BUSY;
106+ result.msg_id = ERROR_UNKNOWN;
105107 goto EXIT;
106108 }
109+ else
110+ {
111+ DWORD ret = WaitForSingleObject(singleton_mutex_handle, 0);
112+ if(ret == WAIT_FAILED)
113+ {
114+ CloseHandle(singleton_mutex_handle);
115+ singleton_mutex_handle = NULL;
116+ result.msg_id = ERROR_UNKNOWN;
117+ goto EXIT;
118+ }
119+ else if(ret == WAIT_TIMEOUT)
120+ {
121+ CloseHandle(singleton_mutex_handle);
122+ singleton_mutex_handle = NULL;
123+ result.msg_id = ERROR_BUSY;
124+ goto EXIT;
125+ }
126+ // retが上記以外(WAIT_OBJECT_0 または WAIT_ABANDONED)であればミューテックスの所有権を獲得できているので処理を続行します。
127+ }
107128 }
108129 if(wcsstr(ext_flags, L"CD_APPDIR") != NULL)
109130 {
@@ -351,6 +372,12 @@
351372
352373 notify_close();
353374
375+ if(singleton_mutex_handle != NULL)
376+ {
377+ ReleaseMutex(singleton_mutex_handle);
378+ CloseHandle(singleton_mutex_handle);
379+ }
380+
354381 return result.msg_id;
355382 }
356383
旧リポジトリブラウザで表示