diff options
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/src/plugin.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/plugin/src/plugin.c b/plugin/src/plugin.c index f65132f..cd05faf 100644 --- a/plugin/src/plugin.c +++ b/plugin/src/plugin.c | |||
@@ -19,10 +19,16 @@ | |||
19 | // shared library before the compiler has fully written to it. | 19 | // shared library before the compiler has fully written to it. |
20 | static const int WATCH_MASK = IN_CLOSE_WRITE; | 20 | static const int WATCH_MASK = IN_CLOSE_WRITE; |
21 | 21 | ||
22 | /// Plugin state. | ||
23 | /// | ||
24 | /// Each Plugin object points to a shared library and holds a state object. | ||
25 | /// | ||
26 | /// The same shared library can be loaded multiple times, resulting in multiple | ||
27 | /// Plugin instances, each with its own internal state. | ||
22 | typedef struct Plugin { | 28 | typedef struct Plugin { |
23 | void* handle; // First member so that Plugin can be cast to handle. | 29 | void* handle; // First member so that Plugin can be cast to handle. |
24 | void* state; // Plugin's internal state. | 30 | void* state; // Plugin's internal state. |
25 | bool reloaded; // Whether the plugin has been reloaded state needs to be | 31 | bool reloaded; // Whether the plugin has been reloaded, state needs to be |
26 | // re-created. | 32 | // re-created. |
27 | PluginEngine* eng; // So that the public API can do stuff with just a Plugin*. | 33 | PluginEngine* eng; // So that the public API can do stuff with just a Plugin*. |
28 | mstring filename; | 34 | mstring filename; |
@@ -30,6 +36,7 @@ typedef struct Plugin { | |||
30 | 36 | ||
31 | DEF_LIST(Plugin); | 37 | DEF_LIST(Plugin); |
32 | 38 | ||
39 | /// Plugin engine. | ||
33 | typedef struct PluginEngine { | 40 | typedef struct PluginEngine { |
34 | int inotify_instance; | 41 | int inotify_instance; |
35 | int dir_watch; // inotify watch on the plugins directory. | 42 | int dir_watch; // inotify watch on the plugins directory. |
@@ -76,16 +83,31 @@ static bool load_library(Plugin* plugin) { | |||
76 | return false; | 83 | return false; |
77 | } | 84 | } |
78 | 85 | ||
86 | static void delete_plugin_state(Plugin* plugin) { | ||
87 | if (plugin->state) { | ||
88 | free(plugin->state); | ||
89 | plugin->state = 0; | ||
90 | } | ||
91 | } | ||
92 | |||
93 | void set_plugin_state(Plugin* plugin, void* state) { | ||
94 | assert(plugin); | ||
95 | delete_plugin_state(plugin); | ||
96 | plugin->state = state; | ||
97 | } | ||
98 | |||
99 | void* get_plugin_state(Plugin* plugin) { | ||
100 | assert(plugin); | ||
101 | return plugin->state; | ||
102 | } | ||
103 | |||
79 | static void destroy_plugin(Plugin* plugin) { | 104 | static void destroy_plugin(Plugin* plugin) { |
80 | if (plugin) { | 105 | if (plugin) { |
81 | if (plugin->handle) { | 106 | if (plugin->handle) { |
82 | dlclose(plugin->handle); | 107 | dlclose(plugin->handle); |
83 | plugin->handle = 0; | 108 | plugin->handle = 0; |
84 | } | 109 | } |
85 | if (plugin->state) { | 110 | delete_plugin_state(plugin); |
86 | free(plugin->state); | ||
87 | plugin->state = 0; | ||
88 | } | ||
89 | } | 111 | } |
90 | } | 112 | } |
91 | 113 | ||
@@ -114,24 +136,6 @@ void delete_plugin(Plugin** pPlugin) { | |||
114 | } | 136 | } |
115 | } | 137 | } |
116 | 138 | ||
117 | static void delete_plugin_state(Plugin* plugin) { | ||
118 | if (plugin->state) { | ||
119 | free(plugin->state); | ||
120 | plugin->state = 0; | ||
121 | } | ||
122 | } | ||
123 | |||
124 | void set_plugin_state(Plugin* plugin, void* state) { | ||
125 | assert(plugin); | ||
126 | delete_plugin_state(plugin); | ||
127 | plugin->state = state; | ||
128 | } | ||
129 | |||
130 | void* get_plugin_state(Plugin* plugin) { | ||
131 | assert(plugin); | ||
132 | return plugin->state; | ||
133 | } | ||
134 | |||
135 | bool plugin_reloaded(Plugin* plugin) { | 139 | bool plugin_reloaded(Plugin* plugin) { |
136 | assert(plugin); | 140 | assert(plugin); |
137 | const bool reloaded = plugin->reloaded; | 141 | const bool reloaded = plugin->reloaded; |