Commit 419c23cd81c0648c97ebe5cb99c030252bcf6a68
1 parent
6058ed37
Exists in
master
and in
5 other branches
Adding automatic unload of pw3270 sessions when the JNI is unloaded (Linux only for now).
Showing
3 changed files
with
39 additions
and
2 deletions
Show diff stats
src/classlib/session.cc
@@ -46,14 +46,30 @@ | @@ -46,14 +46,30 @@ | ||
46 | #define nullptr NULL | 46 | #define nullptr NULL |
47 | #endif // !c11 | 47 | #endif // !c11 |
48 | 48 | ||
49 | + | ||
49 | /*--[ Implement ]--------------------------------------------------------------------------------------------------*/ | 50 | /*--[ Implement ]--------------------------------------------------------------------------------------------------*/ |
50 | 51 | ||
51 | - namespace PW3270_NAMESPACE | ||
52 | - { | 52 | + namespace PW3270_NAMESPACE { |
53 | + | ||
53 | session * session::first = nullptr; | 54 | session * session::first = nullptr; |
54 | session * session::last = nullptr; | 55 | session * session::last = nullptr; |
55 | session * (*session::factory)(const char *name) = nullptr; | 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 | session::session() | 73 | session::session() |
58 | { | 74 | { |
59 | 75 |
src/include/pw3270/class.h
@@ -128,6 +128,10 @@ | @@ -128,6 +128,10 @@ | ||
128 | 128 | ||
129 | virtual ~session(); | 129 | virtual ~session(); |
130 | 130 | ||
131 | + // Internal methods, used to init/deinit control tables. | ||
132 | + static void init(); | ||
133 | + static void deinit(); | ||
134 | + | ||
131 | // Factory methods and settings | 135 | // Factory methods and settings |
132 | static session * start(const char *name = 0); | 136 | static session * start(const char *name = 0); |
133 | static session * create(const char *name = 0) throw (std::exception); | 137 | static session * create(const char *name = 0) throw (std::exception); |
src/java/main.cc
@@ -32,6 +32,23 @@ | @@ -32,6 +32,23 @@ | ||
32 | 32 | ||
33 | /*---[ Implement ]----------------------------------------------------------------------------------*/ | 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 | namespace PW3270_NAMESPACE { | 52 | namespace PW3270_NAMESPACE { |
36 | 53 | ||
37 | jfieldID java::getHandleField(JNIEnv *env, jobject obj) { | 54 | jfieldID java::getHandleField(JNIEnv *env, jobject obj) { |