[java][jni][windows]プロセス同期だミューテックス 2008/10/28

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;
}

: