summaryrefslogtreecommitdiff
path: root/libmodman/module.hpp
diff options
context:
space:
mode:
authornicolas.dufresne <nicolas.dufresne@c587cffe-e639-0410-9787-d7902ae8ed56>2010-08-18 20:04:19 +0000
committernicolas.dufresne <nicolas.dufresne@c587cffe-e639-0410-9787-d7902ae8ed56>2010-08-18 20:04:19 +0000
commit7defd5c1866b561d6dc9eb2d68c8f43f07d865e5 (patch)
tree075ee29fc3b8bc6f6920e647e2bea34905120699 /libmodman/module.hpp
parent955b6329d3db60e8e5ce5e48ec383a9ebd16967c (diff)
downloadlibproxy-7defd5c1866b561d6dc9eb2d68c8f43f07d865e5.tar.gz
Change modman module to use a structure enabling real builtin
This changes libmodman internal module ABI/API to use a single structure to store module information. We now have a single structure to load from the shared object. This same structure is being passed to load builtin module in a way that does not rely uppon dlopen/dlsym. See issue 133. git-svn-id: http://libproxy.googlecode.com/svn/trunk@720 c587cffe-e639-0410-9787-d7902ae8ed56
Diffstat (limited to 'libmodman/module.hpp')
-rw-r--r--libmodman/module.hpp55
1 files changed, 36 insertions, 19 deletions
diff --git a/libmodman/module.hpp b/libmodman/module.hpp
index 7f31ddd..43fc166 100644
--- a/libmodman/module.hpp
+++ b/libmodman/module.hpp
@@ -28,40 +28,42 @@
#ifdef WIN32
#define __MM_DLL_EXPORT __declspec(dllexport)
-#define __MM_FUNC_DEF_PREFIX extern "C" __MM_DLL_EXPORT
-#define __MM_SCLR_DEF_PREFIX extern "C" __MM_DLL_EXPORT
#else
#include <typeinfo>
#define __MM_DLL_EXPORT __attribute__ ((visibility("default")))
-#define __MM_FUNC_DEF_PREFIX __MM_DLL_EXPORT
-#define __MM_SCLR_DEF_PREFIX extern "C" __MM_DLL_EXPORT
#endif
-#define __MM_MODULE_VERSION 1
+#define __MM_MODULE_VERSION 2
#define __MM_MODULE_VARNAME__(suffix, name) mm_ ## name ## _ ## suffix
#define __MM_MODULE_VARNAME_(suffix, name) __MM_MODULE_VARNAME__(suffix, name)
#define __MM_MODULE_VARNAME(name) __MM_MODULE_VARNAME_(MM_MODULE_BUILTIN, name)
-#define MM_MODULE_INIT(mtype, minit) \
- __MM_SCLR_DEF_PREFIX const unsigned int __MM_MODULE_VARNAME(vers) = __MM_MODULE_VERSION; \
- __MM_FUNC_DEF_PREFIX const char* (*__MM_MODULE_VARNAME(type))() = mtype::base_type; \
- __MM_FUNC_DEF_PREFIX base_extension** (*__MM_MODULE_VARNAME(init))() = minit;
-#define MM_MODULE_TEST(mtest) \
- __MM_FUNC_DEF_PREFIX bool (*__MM_MODULE_VARNAME(test))() = mtest;
-#define MM_MODULE_SYMB(msymb, msmod) \
- __MM_SCLR_DEF_PREFIX const char* const __MM_MODULE_VARNAME(symb) = msymb; \
- __MM_SCLR_DEF_PREFIX const char* const __MM_MODULE_VARNAME(smod) = msmod;
-
-#define MM_MODULE_INIT_EZ(clsname) \
+
+#define MM_MODULE_INIT(mtype, minit, mtest, msymb, msmod) \
+ extern "C" __MM_DLL_EXPORT struct mm_module __MM_MODULE_VARNAME(info); \
+ struct mm_module __MM_MODULE_VARNAME(info) = { \
+ __MM_MODULE_VERSION, \
+ # mtype, \
+ mtype::base_type, \
+ minit, mtest, msymb, msmod \
+ }
+
+#define MM_MODULE_INIT_EZ(clsname, mtest, msymb, msmod) \
static libmodman::base_extension** clsname ## _init() { \
libmodman::base_extension** retval = new libmodman::base_extension*[2]; \
retval[0] = new clsname(); \
retval[1] = NULL; \
return retval; \
} \
- MM_MODULE_INIT(clsname, clsname ## _init)
-#define MM_MODULE_TEST_EZ(clsname, mtest) \
static bool clsname ## _test() { return mtest; } \
- MM_MODULE_TEST(clsname ## _test)
+ MM_MODULE_INIT(clsname, clsname ## _init, clsname ## _test, msymb, msmod)
+
+/* Helper macro for loading builtins */
+
+#define MM_DEF_BUILTIN(modname) \
+ extern struct mm_module __MM_MODULE_VARNAME_(modname,info)
+
+#define MM_BUILTIN(modname) __MM_MODULE_VARNAME_(modname,info)
+
namespace libmodman {
@@ -90,4 +92,19 @@ public:
}
+extern "C" {
+
+struct mm_module
+{
+ const unsigned int vers;
+ const char* name;
+ const char* (*type)();
+ libmodman::base_extension** (*init)();
+ bool (*test)();
+ const char* symb;
+ const char* smod;
+};
+
+}
+
#endif /* MODULE_HPP_ */