From 7b56d86e65029a85888d017150a62e2a3b025f32 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 25 Apr 2016 15:06:49 -0300 Subject: [PATCH] Como as filas da sessão passaram a ser indepententes agora é possível usar o lock por sessão. --- src/classlib/local.cc | 25 +++++++++++-------------- src/classlib/session.cc | 112 ++++++++++++++++++++++++---------------------------------------------------------------------------------------- src/include/pw3270/class.h | 3 --- src/java/jni3270.cbp | 1 + src/java/main.cc | 13 ------------- 5 files changed, 36 insertions(+), 118 deletions(-) diff --git a/src/classlib/local.cc b/src/classlib/local.cc index 6b0e1ac..7f5847e 100644 --- a/src/classlib/local.cc +++ b/src/classlib/local.cc @@ -46,7 +46,8 @@ #endif -#include +#include "private.h" + #include #include #include @@ -114,7 +115,7 @@ namespace PW3270_NAMESPACE { - class local : public session, private module + class local : public session, private module, private recursive_mutex { private: @@ -243,8 +244,6 @@ throw exception("Can't find symbol %s",call[f].name); } - session::lock(); - // Get Session handle, setup base callbacks set_log_handler(loghandler); set_trace_handler(tracehandler); @@ -252,13 +251,11 @@ set_display_charset(); - session::unlock(); - } virtual ~local() { - session::lock(); + this->lock(); if(is_connected()) { disconnect(); @@ -276,7 +273,7 @@ } catch(exception e) { } - session::unlock(); + this->unlock(); } @@ -300,9 +297,9 @@ int connect(void) { - session::lock(); + this->lock(); int rc = _connect(hSession,0); - session::unlock(); + this->unlock(); return rc; } @@ -314,9 +311,9 @@ int disconnect(void) { - session::lock(); + this->lock(); int rc = _disconnect(hSession); - session::unlock(); + this->unlock(); return rc; } @@ -338,9 +335,9 @@ int iterate(bool wait) { - session::lock(); + this->lock(); _main_iterate(hSession,wait); - session::unlock(); + this->unlock(); return 0; } diff --git a/src/classlib/session.cc b/src/classlib/session.cc index 19da795..9a4c168 100644 --- a/src/classlib/session.cc +++ b/src/classlib/session.cc @@ -32,7 +32,7 @@ #include #include - #include + #include "private.h" #ifndef WIN32 #include @@ -42,85 +42,6 @@ #include #endif // HAVE_SYSLOG -#if __cplusplus < 201103L - - #define nullptr NULL - - #ifdef _WIN32 - - class recursive_mutex { - private: - HANDLE hMutex; - - public: - recursive_mutex() { - hMutex = CreateMutex(NULL,FALSE,NULL); - }; - - ~recursive_mutex() { - CloseHandle(hMutex); - }; - - void lock(void) { - WaitForSingleObject(hMutex,INFINITE); - }; - - void unlock(void) { - ReleaseMutex(hMutex); - }; - - bool try_lock(void) { - if(WaitForSingleObject(hMutex,1) == WAIT_OBJECT_0) - return true; - return false; - }; - }; - - #else - - class recursive_mutex { - private: - pthread_mutex_t mtx; - pthread_mutexattr_t mtxAttr; - - public: - recursive_mutex() { - - memset(&mtx,0,sizeof(mtx)); - memset(&mtxAttr,0,sizeof(mtxAttr)); - - pthread_mutexattr_init(&mtxAttr); - pthread_mutexattr_settype(&mtxAttr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&mtx, &mtxAttr); - }; - - ~recursive_mutex() { - pthread_mutex_destroy(&mtx); - }; - - void lock(void) { - pthread_mutex_lock(&mtx); - }; - - void unlock(void) { - pthread_mutex_unlock(&mtx); - }; - - bool try_lock(void) { - return pthread_mutex_trylock(&mtx) == 0; - }; - }; - - - - #endif // _WIN32 - -#else - - #include - -#endif // !c11 - /*--[ Implement ]--------------------------------------------------------------------------------------------------*/ @@ -171,13 +92,12 @@ static recursive_mutex mtx; - - void session::lock() + inline void lock() { mtx.lock(); } - void session::unlock() + inline void unlock() { mtx.unlock(); } @@ -246,15 +166,31 @@ // Factory methods and settings session * session::create(const char *name) throw (std::exception) { + session *rc = nullptr; + trace("%s(%s)",__FUNCTION__,name); - if(factory) - return factory(name); + lock(); + + try + { + if(factory) + rc = factory(name); + else if(name && *name) + rc = create_remote(name); + else + rc = create_local(); + + } + catch(std::exception &e) + { + unlock(); + throw e; + } - if(name && *name) - return create_remote(name); + unlock(); - return create_local(); + return rc; } session * session::start(const char *name) diff --git a/src/include/pw3270/class.h b/src/include/pw3270/class.h index 7bc7616..c1bfd47 100644 --- a/src/include/pw3270/class.h +++ b/src/include/pw3270/class.h @@ -132,9 +132,6 @@ static void init(); static void deinit(); - static void lock(); - static void unlock(); - // Factory methods and settings static session * start(const char *name = 0); static session * create(const char *name = 0) throw (std::exception); diff --git a/src/java/jni3270.cbp b/src/java/jni3270.cbp index e8fc90c..8a70c83 100644 --- a/src/java/jni3270.cbp +++ b/src/java/jni3270.cbp @@ -42,6 +42,7 @@ + diff --git a/src/java/main.cc b/src/java/main.cc index feccc6a..c618e7d 100644 --- a/src/java/main.cc +++ b/src/java/main.cc @@ -76,14 +76,10 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_init__Ljava_lang_String_2(JNIEnv *en try { - session::lock(); - jlong handle = reinterpret_cast(session::create(id)); env->SetLongField(obj, getHandleField(env, obj), handle); env->ReleaseStringUTFChars( j_id, id); - session::unlock(); - } catch(std::exception &e) { env->ReleaseStringUTFChars( j_id, id); @@ -99,23 +95,14 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_deinit(JNIEnv *env, jobject obj) { try { - session::lock(); - session *s = getHandle(env,obj); - trace("********************* Destruindo objeto %p",s); - if(s) { - trace("********************* Destruindo objeto %p",s); delete s; - trace("********************* Destruindo objeto %p",s); } - trace("********************* Destruindo objeto %p",s); env->SetLongField(obj, getHandleField(env, obj), 0); - trace("********************* Destruindo objeto %p",s); - session::unlock(); } catch(std::exception &e) { -- libgit2 0.21.2