summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/jdbc/Object.cxx
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2004-11-09 11:12:58 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2004-11-09 11:12:58 +0000
commit6dd2e6a1c4a8d538bfd12efdb929779ed69520cf (patch)
tree2eacc73aac7ec2e4a07862189d36043492cbc946 /connectivity/source/drivers/jdbc/Object.cxx
parent524f000e8a40a82c51560751a33312509a89b48b (diff)
INTEGRATION: CWS hsqldb (1.17.6); FILE MERGED
2004/09/10 12:45:02 oj 1.17.6.1: #i33348# code optimizing
Diffstat (limited to 'connectivity/source/drivers/jdbc/Object.cxx')
-rw-r--r--connectivity/source/drivers/jdbc/Object.cxx80
1 files changed, 60 insertions, 20 deletions
diff --git a/connectivity/source/drivers/jdbc/Object.cxx b/connectivity/source/drivers/jdbc/Object.cxx
index 2947c408d5..eb5243364c 100644
--- a/connectivity/source/drivers/jdbc/Object.cxx
+++ b/connectivity/source/drivers/jdbc/Object.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: Object.cxx,v $
*
- * $Revision: 1.17 $
+ * $Revision: 1.18 $
*
- * last change: $Author: hr $ $Date: 2004-08-02 17:05:14 $
+ * last change: $Author: hr $ $Date: 2004-11-09 12:12:58 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -80,6 +80,7 @@
#ifndef _VOS_MUTEX_HXX_
#include <vos/mutex.hxx>
#endif
+#include <osl/thread.h>
#ifndef _COM_SUN_STAR_UNO_SEQUENCE_HXX_
#include <com/sun/star/uno/Sequence.hxx>
@@ -113,10 +114,28 @@ using namespace ::com::sun::star::lang;
return xVM;
}
// -----------------------------------------------------------------------------
+typedef ::std::map<oslThreadIdentifier,TGuard> TGuardMap;
+TGuardMap& lcl_getGuardMap()
+{
+ static TGuardMap s_sMap;
+ return s_sMap;
+}
+// -----------------------------------------------------------------------------
+TGuard getVMGuard()
+{
+ TGuardMap& s_sMap = lcl_getGuardMap();
+
+ oslThreadIdentifier id = osl_getThreadIdentifier(NULL);
+ TGuardMap::iterator aFind = s_sMap.find(id);
+ if ( aFind == s_sMap.end() )
+ aFind = s_sMap.insert(TGuardMap::value_type(id,TGuard(new jvmaccess::VirtualMachine::AttachGuard(java_lang_Object::getVM())))).first;
+ return aFind->second;
+}
+// -----------------------------------------------------------------------------
SDBThreadAttach::SDBThreadAttach()
: pEnv(NULL)
{
- m_aGuard = ::std::auto_ptr< jvmaccess::VirtualMachine::AttachGuard>(new jvmaccess::VirtualMachine::AttachGuard(java_lang_Object::getVM()) );
+ m_aGuard = getVMGuard();
if ( m_aGuard.get() )
pEnv = m_aGuard->getEnvironment();
}
@@ -140,12 +159,15 @@ void SDBThreadAttach::releaseRef()
{
getJavaVMRefCount()--;
if ( getJavaVMRefCount() == 0 )
+ {
+ TGuardMap& s_sMap = lcl_getGuardMap();
+ s_sMap.clear();
getJavaVM2(::rtl::Reference< jvmaccess::VirtualMachine >(),sal_True);
+ }
}
// -----------------------------------------------------------------------------
// statische Variablen der Klasse:
jclass java_lang_Object::theClass = 0;
-sal_uInt32 java_lang_Object::nObjCount = 0;
jclass java_lang_Object::getMyClass()
{
@@ -170,9 +192,8 @@ java_lang_Object::java_lang_Object(const Reference<XMultiServiceFactory >& _rxFa
java_lang_Object::java_lang_Object( JNIEnv * pXEnv, jobject myObj )
: object( NULL )
{
- SDBThreadAttach t;
- if( t.pEnv && myObj )
- object = t.pEnv->NewGlobalRef( myObj );
+ if( pXEnv && myObj )
+ object = pXEnv->NewGlobalRef( myObj );
}
java_lang_Object::~java_lang_Object()
@@ -184,14 +205,31 @@ java_lang_Object::~java_lang_Object()
t.pEnv->DeleteGlobalRef( object );
}
}
+void java_lang_Object::clearObject(JNIEnv& rEnv)
+{
+ if( object )
+ {
+ rEnv.DeleteGlobalRef( object );
+ object = NULL;
+ }
+}
+void java_lang_Object::clearObject()
+{
+ if( object )
+ {
+ SDBThreadAttach t;
+ if( t.pEnv )
+ t.pEnv->DeleteGlobalRef( object );
+ object = NULL;
+ }
+}
// der protected-Konstruktor fuer abgeleitete Klassen
void java_lang_Object::saveRef( JNIEnv * pXEnv, jobject myObj )
{
OSL_ENSURE( myObj, "object in c++ -> Java Wrapper" );
- SDBThreadAttach t;
- if( t.pEnv && myObj )
- object = t.pEnv->NewGlobalRef( myObj );
+ if( pXEnv && myObj )
+ object = pXEnv->NewGlobalRef( myObj );
}
@@ -202,10 +240,12 @@ java_lang_Class * java_lang_Object::getClass()
if( t.pEnv )
{
// temporaere Variable initialisieren
- char * cSignature = "()Ljava/lang/Class;";
- char * cMethodName = "getClass";
+ static char * cSignature = "()Ljava/lang/Class;";
+ static char * cMethodName = "getClass";
// Java-Call absetzen
- jmethodID mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );OSL_ENSURE(mID,"Unknown method id!");
+ static jmethodID mID = NULL;
+ if ( !mID )
+ mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );OSL_ENSURE(mID,"Unknown method id!");
if( mID )
{
out = t.pEnv->CallObjectMethodA( object, mID, NULL );
@@ -224,17 +264,17 @@ java_lang_Class * java_lang_Object::getClass()
if( t.pEnv )
{
// temporaere Variable initialisieren
- char * cSignature = "()Ljava/lang/String;";
- char * cMethodName = "toString";
+ static char * cSignature = "()Ljava/lang/String;";
+ static char * cMethodName = "toString";
// Java-Call absetzen
- jmethodID mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );OSL_ENSURE(mID,"Unknown method id!");
+ static jmethodID mID = NULL;
+ if ( !mID )
+ mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );OSL_ENSURE(mID,"Unknown method id!");
if( mID )
{
- jstring out(0);
- out = (jstring)t.pEnv->CallObjectMethod( object, mID);
+ jstring out = (jstring)t.pEnv->CallObjectMethod( object, mID);
ThrowSQLException(t.pEnv,NULL);
- if(out)
- aStr = JavaString2String(t.pEnv,out);
+ aStr = JavaString2String(t.pEnv,out);
} //mID
} //pEnv
return aStr;