beard%netscape.com 1069ecca71 added getObject() method.
git-svn-id: svn://10.0.0.236/trunk@41578 18797224-902f-48f8-a5cc-f745e15eee43
1999-07-30 03:27:05 +00:00

120 lines
3.0 KiB
C++

/*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
MRJMonitor.cpp
Provides a C++ interface to Java monitors.
by Patrick C. Beard.
*/
#include "MRJMonitor.h"
#include "MRJSession.h"
MRJMonitor::MRJMonitor(MRJSession* session, jobject monitor)
: mSession(session), mMonitor(NULL), mWaitMethod(NULL), mNotifyMethod(NULL), mNotifyAllMethod(NULL)
{
JNIEnv* env = mSession->getCurrentEnv();
jclass javaLangObject = env->FindClass("java/lang/Object");
if (javaLangObject != NULL) {
// look up method IDs.
mWaitMethod = env->GetMethodID(javaLangObject, "wait", "()V");
mTimedWaitMethod = env->GetMethodID(javaLangObject, "wait", "(J)V");
mNotifyMethod = env->GetMethodID(javaLangObject, "notify", "()V");
mNotifyAllMethod = env->GetMethodID(javaLangObject, "notifyAll", "()V");
Boolean allocateMonitor = (monitor == NULL);
if (allocateMonitor)
monitor = env->AllocObject(javaLangObject);
if (monitor != NULL)
mMonitor = env->NewGlobalRef(monitor);
if (allocateMonitor)
env->DeleteLocalRef(monitor);
env->DeleteLocalRef(javaLangObject);
}
}
MRJMonitor::~MRJMonitor()
{
if (mMonitor != NULL) {
JNIEnv* env = mSession->getCurrentEnv();
env->DeleteGlobalRef(mMonitor);
mMonitor = NULL;
}
}
void MRJMonitor::enter()
{
JNIEnv* env = mSession->getCurrentEnv();
env->MonitorEnter(mMonitor);
}
void MRJMonitor::exit()
{
JNIEnv* env = mSession->getCurrentEnv();
env->MonitorExit(mMonitor);
}
void MRJMonitor::wait()
{
if (mMonitor != NULL && mWaitMethod != NULL) {
JNIEnv* env = mSession->getCurrentEnv();
env->MonitorEnter(mMonitor);
env->CallVoidMethod(mMonitor, mWaitMethod);
env->MonitorExit(mMonitor);
}
}
void MRJMonitor::wait(long long millis)
{
if (mMonitor != NULL && mWaitMethod != NULL) {
JNIEnv* env = mSession->getCurrentEnv();
env->MonitorEnter(mMonitor);
env->CallVoidMethod(mMonitor, mTimedWaitMethod, jlong(millis));
env->MonitorExit(mMonitor);
}
}
void MRJMonitor::notify()
{
if (mMonitor != NULL && mNotifyMethod != NULL) {
JNIEnv* env = mSession->getCurrentEnv();
env->MonitorEnter(mMonitor);
env->CallVoidMethod(mMonitor, mNotifyMethod);
env->MonitorExit(mMonitor);
}
}
void MRJMonitor::notifyAll()
{
if (mMonitor != NULL && mNotifyAllMethod != NULL) {
JNIEnv* env = mSession->getCurrentEnv();
env->MonitorEnter(mMonitor);
env->CallVoidMethod(mMonitor, mNotifyAllMethod);
env->MonitorExit(mMonitor);
}
}
jobject MRJMonitor::getObject()
{
return mMonitor;
}