Improve compatibility with -fvisibility=hidden.

Refs #5246
This commit is contained in:
Gunnar Beutner 2013-11-30 17:47:53 +01:00 committed by Gunnar Beutner
parent f05858d3ad
commit 553bd3246b
11 changed files with 65 additions and 32 deletions

View File

@ -36,7 +36,7 @@ inline bool InitializeOnceHelper(InitializeFunc func)
#define INITIALIZE_ONCE(func) \ #define INITIALIZE_ONCE(func) \
namespace { \ namespace { \
I2_EXPORT bool l_InitializeOnce(InitializeOnceHelper(func)); \ I2_EXPORT bool l_InitializeOnce(icinga::InitializeOnceHelper(func)); \
} }
} }

View File

@ -21,7 +21,6 @@
#define REGISTRY_H #define REGISTRY_H
#include "base/i2-base.h" #include "base/i2-base.h"
#include "base/singleton.h"
#include "base/qstring.h" #include "base/qstring.h"
#include <map> #include <map>
#include <boost/thread/mutex.hpp> #include <boost/thread/mutex.hpp>
@ -42,11 +41,6 @@ class Registry
public: public:
typedef std::map<String, T> ItemMap; typedef std::map<String, T> ItemMap;
static Registry<U, T> *GetInstance(void)
{
return Singleton<Registry<U, T> >::GetInstance();
}
void RegisterIfNew(const String& name, const T& item) void RegisterIfNew(const String& name, const T& item)
{ {
boost::mutex::scoped_lock lock(m_Mutex); boost::mutex::scoped_lock lock(m_Mutex);

View File

@ -19,6 +19,7 @@
#include "base/scriptfunction.h" #include "base/scriptfunction.h"
#include "base/registry.h" #include "base/registry.h"
#include "base/singleton.h"
using namespace icinga; using namespace icinga;
@ -36,3 +37,9 @@ RegisterFunctionHelper::RegisterFunctionHelper(const String& name, const ScriptF
ScriptFunction::Ptr func = make_shared<ScriptFunction>(function); ScriptFunction::Ptr func = make_shared<ScriptFunction>(function);
ScriptFunctionRegistry::GetInstance()->Register(name, func); ScriptFunctionRegistry::GetInstance()->Register(name, func);
} }
ScriptFunctionRegistry *ScriptFunctionRegistry::GetInstance(void)
{
return Singleton<ScriptFunctionRegistry>::GetInstance();
}

View File

@ -22,6 +22,7 @@
#include "base/i2-base.h" #include "base/i2-base.h"
#include "base/registry.h" #include "base/registry.h"
#include "base/singleton.h"
#include "base/value.h" #include "base/value.h"
#include "base/scriptfunctionwrapper.h" #include "base/scriptfunctionwrapper.h"
#include <vector> #include <vector>
@ -56,7 +57,10 @@ private:
* @ingroup base * @ingroup base
*/ */
class I2_BASE_API ScriptFunctionRegistry : public Registry<ScriptFunctionRegistry, ScriptFunction::Ptr> class I2_BASE_API ScriptFunctionRegistry : public Registry<ScriptFunctionRegistry, ScriptFunction::Ptr>
{ }; {
public:
static ScriptFunctionRegistry *GetInstance(void);
};
/** /**
* Helper class for registering ScriptFunction implementation classes. * Helper class for registering ScriptFunction implementation classes.

View File

@ -22,11 +22,9 @@
using namespace icinga; using namespace icinga;
Registry<ScriptVariable, Value> ScriptVariable::m_Registry;
Value ScriptVariable::Get(const String& name) Value ScriptVariable::Get(const String& name)
{ {
Value value = m_Registry.GetItem(name); Value value = ScriptVariableRegistry::GetInstance()->GetItem(name);
if (value.IsEmpty()) if (value.IsEmpty())
Log(LogWarning, "icinga", "Tried to access empty variable: " + name); Log(LogWarning, "icinga", "Tried to access empty variable: " + name);
@ -35,10 +33,10 @@ Value ScriptVariable::Get(const String& name)
void ScriptVariable::Set(const String& name, const Value& value) void ScriptVariable::Set(const String& name, const Value& value)
{ {
m_Registry.Register(name, value); ScriptVariableRegistry::GetInstance()->Register(name, value);
} }
void ScriptVariable::Declare(const String& name, const Value& value) void ScriptVariable::Declare(const String& name, const Value& value)
{ {
m_Registry.RegisterIfNew(name, value); ScriptVariableRegistry::GetInstance()->RegisterIfNew(name, value);
} }

View File

@ -22,6 +22,7 @@
#include "base/i2-base.h" #include "base/i2-base.h"
#include "base/registry.h" #include "base/registry.h"
#include "base/singleton.h"
#include "base/value.h" #include "base/value.h"
namespace icinga namespace icinga
@ -43,6 +44,15 @@ private:
static Registry<ScriptVariable, Value> m_Registry; static Registry<ScriptVariable, Value> m_Registry;
}; };
class I2_BASE_API ScriptVariableRegistry : public Registry<ScriptVariableRegistry, Value>
{
public:
static inline ScriptVariableRegistry *GetInstance(void)
{
return Singleton<ScriptVariableRegistry>::GetInstance();
}
};
} }
#endif /* SCRIPTVARIABLE_H */ #endif /* SCRIPTVARIABLE_H */

View File

@ -22,7 +22,6 @@
#include "base/convert.h" #include "base/convert.h"
#include "base/debug.h" #include "base/debug.h"
#include "base/utility.h" #include "base/utility.h"
#include "base/scriptvariable.h"
#include "base/application.h" #include "base/application.h"
#include "base/exception.h" #include "base/exception.h"
#include <sstream> #include <sstream>

View File

@ -23,6 +23,8 @@
#include "config/i2-config.h" #include "config/i2-config.h"
#include "config/debuginfo.h" #include "config/debuginfo.h"
#include "base/registry.h" #include "base/registry.h"
#include "base/initialize.h"
#include "base/singleton.h"
#include <iostream> #include <iostream>
#include <boost/function.hpp> #include <boost/function.hpp>
@ -72,24 +74,23 @@ private:
}; };
class I2_CONFIG_API ConfigFragmentRegistry : public Registry<ConfigFragmentRegistry, String> class I2_CONFIG_API ConfigFragmentRegistry : public Registry<ConfigFragmentRegistry, String>
{ };
/**
* Helper class for registering config fragments.
*
* @ingroup base
*/
class RegisterConfigFragmentHelper
{ {
public: public:
RegisterConfigFragmentHelper(const String& name, const String& fragment) static inline ConfigFragmentRegistry *GetInstance(void)
{ {
ConfigFragmentRegistry::GetInstance()->Register(name, fragment); return Singleton<ConfigFragmentRegistry>::GetInstance();
} }
}; };
#define REGISTER_CONFIG_FRAGMENT(id, name, fragment) \ #define REGISTER_CONFIG_FRAGMENT(id, name, fragment) \
I2_EXPORT icinga::RegisterConfigFragmentHelper g_RegisterCF_ ## id(name, fragment) namespace { \
void RegisterConfigFragment(void) \
{ \
icinga::ConfigFragmentRegistry::GetInstance()->Register(name, fragment); \
} \
\
INITIALIZE_ONCE(RegisterConfigFragment); \
}
} }

View File

@ -278,20 +278,26 @@ void ConfigType::ValidateArray(const Array::Ptr& array,
void ConfigType::Register(void) void ConfigType::Register(void)
{ {
Registry<ConfigType, ConfigType::Ptr>::GetInstance()->Register(GetName(), GetSelf()); ConfigTypeRegistry::GetInstance()->Register(GetName(), GetSelf());
} }
ConfigType::Ptr ConfigType::GetByName(const String& name) ConfigType::Ptr ConfigType::GetByName(const String& name)
{ {
return Registry<ConfigType, ConfigType::Ptr>::GetInstance()->GetItem(name); return ConfigTypeRegistry::GetInstance()->GetItem(name);
} }
Registry<ConfigType, ConfigType::Ptr>::ItemMap ConfigType::GetTypes(void) ConfigTypeRegistry::ItemMap ConfigType::GetTypes(void)
{ {
return Registry<ConfigType, ConfigType::Ptr>::GetInstance()->GetItems(); return ConfigTypeRegistry::GetInstance()->GetItems();
} }
void ConfigType::DiscardTypes(void) void ConfigType::DiscardTypes(void)
{ {
Registry<ConfigType, ConfigType::Ptr>::GetInstance()->Clear(); ConfigTypeRegistry::GetInstance()->Clear();
} }
ConfigTypeRegistry *ConfigTypeRegistry::GetInstance(void)
{
return Singleton<ConfigTypeRegistry>::GetInstance();
}

View File

@ -26,6 +26,7 @@
#include "config/configitem.h" #include "config/configitem.h"
#include "base/array.h" #include "base/array.h"
#include "base/registry.h" #include "base/registry.h"
#include "base/singleton.h"
namespace icinga namespace icinga
{ {
@ -74,6 +75,12 @@ private:
static void AddParentRules(std::vector<TypeRuleList::Ptr>& ruleLists, const ConfigType::Ptr& item); static void AddParentRules(std::vector<TypeRuleList::Ptr>& ruleLists, const ConfigType::Ptr& item);
}; };
class I2_CONFIG_API ConfigTypeRegistry : public Registry<ConfigTypeRegistry, ConfigType::Ptr>
{
public:
static ConfigTypeRegistry *GetInstance(void);
};
} }
#endif /* CONFIGTYPE_H */ #endif /* CONFIGTYPE_H */

View File

@ -23,6 +23,7 @@
#include "db_ido/i2-db_ido.h" #include "db_ido/i2-db_ido.h"
#include "base/object.h" #include "base/object.h"
#include "base/registry.h" #include "base/registry.h"
#include "base/singleton.h"
namespace icinga namespace icinga
{ {
@ -75,8 +76,14 @@ private:
* *
* @ingroup ido * @ingroup ido
*/ */
class DbTypeRegistry : public Registry<DbTypeRegistry, DbType::Ptr> class I2_DB_IDO_API DbTypeRegistry : public Registry<DbTypeRegistry, DbType::Ptr>
{ }; {
public:
static inline DbTypeRegistry *GetInstance(void)
{
return Singleton<DbTypeRegistry>::GetInstance();
}
};
/** /**
* Helper class for registering DynamicObject implementation classes. * Helper class for registering DynamicObject implementation classes.