From 419c23cd81c0648c97ebe5cb99c030252bcf6a68 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Thu, 14 Apr 2016 18:01:28 -0300 Subject: [PATCH] Adding automatic unload of pw3270 sessions when the JNI is unloaded (Linux only for now). --- src/classlib/session.cc | 20 ++++++++++++++++++-- src/include/pw3270/class.h | 4 ++++ src/java/main.cc | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/classlib/session.cc b/src/classlib/session.cc index 706c405..a7ae10f 100644 --- a/src/classlib/session.cc +++ b/src/classlib/session.cc @@ -46,14 +46,30 @@ #define nullptr NULL #endif // !c11 + /*--[ Implement ]--------------------------------------------------------------------------------------------------*/ - namespace PW3270_NAMESPACE - { + namespace PW3270_NAMESPACE { + session * session::first = nullptr; session * session::last = nullptr; session * (*session::factory)(const char *name) = nullptr; + void session::init() + { + trace("Loading %s objects",PACKAGE_NAME); + } + + void session::deinit() + { + trace("Unloading %s objects",PACKAGE_NAME); + while(first) + { + delete first; + } + + } + session::session() { diff --git a/src/include/pw3270/class.h b/src/include/pw3270/class.h index dbf3cc8..2f62691 100644 --- a/src/include/pw3270/class.h +++ b/src/include/pw3270/class.h @@ -128,6 +128,10 @@ virtual ~session(); + // Internal methods, used to init/deinit control tables. + static void init(); + static void deinit(); + // 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/main.cc b/src/java/main.cc index b3eaf2c..08e984d 100644 --- a/src/java/main.cc +++ b/src/java/main.cc @@ -32,6 +32,23 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +#if defined(linux) + static void onLoad() __attribute__((constructor)); + static void onUnLoad() __attribute__((destructor)); +#endif // linux + + using namespace PW3270_NAMESPACE; + + static void onLoad() + { + session::init(); + } + + static void onUnLoad() + { + session::deinit(); + } + namespace PW3270_NAMESPACE { jfieldID java::getHandleField(JNIEnv *env, jobject obj) { -- libgit2 0.21.2