Commit 419c23cd81c0648c97ebe5cb99c030252bcf6a68

Authored by Perry Werneck
1 parent 6058ed37

Adding automatic unload of pw3270 sessions when the JNI is unloaded (Linux only for now).

src/classlib/session.cc
... ... @@ -46,14 +46,30 @@
46 46 #define nullptr NULL
47 47 #endif // !c11
48 48  
  49 +
49 50 /*--[ Implement ]--------------------------------------------------------------------------------------------------*/
50 51  
51   - namespace PW3270_NAMESPACE
52   - {
  52 + namespace PW3270_NAMESPACE {
  53 +
53 54 session * session::first = nullptr;
54 55 session * session::last = nullptr;
55 56 session * (*session::factory)(const char *name) = nullptr;
56 57  
  58 + void session::init()
  59 + {
  60 + trace("Loading %s objects",PACKAGE_NAME);
  61 + }
  62 +
  63 + void session::deinit()
  64 + {
  65 + trace("Unloading %s objects",PACKAGE_NAME);
  66 + while(first)
  67 + {
  68 + delete first;
  69 + }
  70 +
  71 + }
  72 +
57 73 session::session()
58 74 {
59 75  
... ...
src/include/pw3270/class.h
... ... @@ -128,6 +128,10 @@
128 128  
129 129 virtual ~session();
130 130  
  131 + // Internal methods, used to init/deinit control tables.
  132 + static void init();
  133 + static void deinit();
  134 +
131 135 // Factory methods and settings
132 136 static session * start(const char *name = 0);
133 137 static session * create(const char *name = 0) throw (std::exception);
... ...
src/java/main.cc
... ... @@ -32,6 +32,23 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +#if defined(linux)
  36 + static void onLoad() __attribute__((constructor));
  37 + static void onUnLoad() __attribute__((destructor));
  38 +#endif // linux
  39 +
  40 + using namespace PW3270_NAMESPACE;
  41 +
  42 + static void onLoad()
  43 + {
  44 + session::init();
  45 + }
  46 +
  47 + static void onUnLoad()
  48 + {
  49 + session::deinit();
  50 + }
  51 +
35 52 namespace PW3270_NAMESPACE {
36 53  
37 54 jfieldID java::getHandleField(JNIEnv *env, jobject obj) {
... ...