diff options
author | nicolas.dufresne <nicolas.dufresne@c587cffe-e639-0410-9787-d7902ae8ed56> | 2010-08-18 20:04:19 +0000 |
---|---|---|
committer | nicolas.dufresne <nicolas.dufresne@c587cffe-e639-0410-9787-d7902ae8ed56> | 2010-08-18 20:04:19 +0000 |
commit | 7defd5c1866b561d6dc9eb2d68c8f43f07d865e5 (patch) | |
tree | 075ee29fc3b8bc6f6920e647e2bea34905120699 /libmodman/module.hpp | |
parent | 955b6329d3db60e8e5ce5e48ec383a9ebd16967c (diff) | |
download | libproxy-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.hpp | 55 |
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_ */ |