[java][jni][windows]プロセス同期だミューテックス
2008/10/28
java
jni
win32
Javaです。Windowsです。ミューテックスです。
相互排他の処理でミューテックスです。
注意点、CloseHandleは重要かも。存在チェックのためにCreateMutex使ってもCloseHandleしたほうがよい!?
Javaから呼び出して、ミューテックスを作ったJavaがexitするとミューテックスをリリースしてくれているようなので、まず存在チェックして、なければCreateMutexする流れでよいと思う。
もちろんアプリケーションの起動シーケンス、環境、がシビアでない場合だけど。。。
JNIで、GetStringUTFCharsしたら、ReleaseStringUTFCharsを忘れないこと、繰り返し実行で、メモリリークよくわかる。Orz....
かっこわるいですがとりあえず、JNIコード(Cベース)
JNIEXPORT jboolean JNICALL Java_WindowsMutex_existMutex
(JNIEnv *env, jobject obj, jstring name)
{
const char *sname = (*env)->GetStringUTFChars(env, name, NULL);
HANDLE hMutex = CreateMutex(NULL, FALSE, sname);
if(hMutex == NULL){
(*env)->ReleaseStringUTFChars(env, name, sname);
return FALSE;
}
//既に存在している。
if(GetLastError() == ERROR_ALREADY_EXISTS){
CloseHandle(hMutex);
(*env)->ReleaseStringUTFChars(env, name, sname);
return TRUE;
}
CloseHandle(hMutex);
(*env)->ReleaseStringUTFChars(env, name, sname);
return FALSE;
}
: