fix 857415: Calling convention issue with MSVC
git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@133 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
parent
118c72dad1
commit
de3e4bf67c
4 changed files with 34 additions and 18 deletions
|
@ -27,7 +27,7 @@ unsigned int Loki::Private::elements = 0;
|
|||
// Ensures proper destruction of objects with longevity
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Loki::Private::AtExitFn()
|
||||
void C_CALLING_CONVENTION_QUALIFIER Loki::Private::AtExitFn()
|
||||
{
|
||||
assert(elements > 0 && pTrackerArray != 0);
|
||||
// Pick the element at the top of the stack
|
||||
|
|
|
@ -25,8 +25,16 @@
|
|||
#include <cstdlib>
|
||||
#include <new>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define C_CALLING_CONVENTION_QUALIFIER __cdecl
|
||||
#else
|
||||
#define C_CALLING_CONVENTION_QUALIFIER
|
||||
#endif
|
||||
|
||||
namespace Loki
|
||||
{
|
||||
typedef void (C_CALLING_CONVENTION_QUALIFIER *atexit_pfn_t)();
|
||||
|
||||
namespace Private
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -87,7 +95,7 @@ namespace Loki
|
|||
Destroyer destroyer_;
|
||||
};
|
||||
|
||||
void AtExitFn(); // declaration needed below
|
||||
void C_CALLING_CONVENTION_QUALIFIER AtExitFn(); // declaration needed below
|
||||
|
||||
} // namespace Private
|
||||
|
||||
|
@ -223,7 +231,7 @@ namespace Loki
|
|||
template <class T>
|
||||
struct DefaultLifetime
|
||||
{
|
||||
static void ScheduleDestruction(T*, void (*pFun)())
|
||||
static void ScheduleDestruction(T*, atexit_pfn_t pFun)
|
||||
{ std::atexit(pFun); }
|
||||
|
||||
static void OnDeadReference()
|
||||
|
@ -241,7 +249,7 @@ namespace Loki
|
|||
class PhoenixSingleton
|
||||
{
|
||||
public:
|
||||
static void ScheduleDestruction(T*, void (*pFun)())
|
||||
static void ScheduleDestruction(T*, atexit_pfn_t pFun)
|
||||
{
|
||||
#ifndef ATEXIT_FIXED
|
||||
if (!destroyedOnce_)
|
||||
|
@ -277,7 +285,7 @@ namespace Loki
|
|||
struct Adapter
|
||||
{
|
||||
void operator()(T*) { return pFun_(); }
|
||||
void (*pFun_)();
|
||||
atexit_pfn_t pFun_;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -293,7 +301,7 @@ namespace Loki
|
|||
class SingletonWithLongevity
|
||||
{
|
||||
public:
|
||||
static void ScheduleDestruction(T* pObj, void (*pFun)())
|
||||
static void ScheduleDestruction(T* pObj, atexit_pfn_t pFun)
|
||||
{
|
||||
Private::Adapter<T> adapter = { pFun };
|
||||
SetLongevity(pObj, GetLongevity(pObj), adapter);
|
||||
|
@ -312,7 +320,7 @@ namespace Loki
|
|||
template <class T>
|
||||
struct NoDestroy
|
||||
{
|
||||
static void ScheduleDestruction(T*, void (*)())
|
||||
static void ScheduleDestruction(T*, atexit_pfn_t)
|
||||
{}
|
||||
|
||||
static void OnDeadReference()
|
||||
|
@ -399,7 +407,7 @@ namespace Loki
|
|||
}
|
||||
}
|
||||
|
||||
static void DestroySingleton()
|
||||
static void C_CALLING_CONVENTION_QUALIFIER DestroySingleton()
|
||||
{
|
||||
assert(!destroyed_());
|
||||
CreationPolicy<T>::Destroy(pInstance_());
|
||||
|
|
|
@ -27,7 +27,7 @@ unsigned int Loki::Private::elements = 0;
|
|||
// Ensures proper destruction of objects with longevity
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Loki::Private::AtExitFn()
|
||||
void C_CALLING_CONVENTION_QUALIFIER Loki::Private::AtExitFn()
|
||||
{
|
||||
assert(elements > 0 && pTrackerArray != 0);
|
||||
// Pick the element at the top of the stack
|
||||
|
|
|
@ -23,8 +23,16 @@
|
|||
#include <cstdlib>
|
||||
#include <new>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define C_CALLING_CONVENTION_QUALIFIER __cdecl
|
||||
#else
|
||||
#define C_CALLING_CONVENTION_QUALIFIER
|
||||
#endif
|
||||
|
||||
namespace Loki
|
||||
{
|
||||
typedef void (C_CALLING_CONVENTION_QUALIFIER *atexit_pfn_t)();
|
||||
|
||||
namespace Private
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -85,8 +93,7 @@ namespace Loki
|
|||
Destroyer destroyer_;
|
||||
};
|
||||
|
||||
void AtExitFn(); // declaration needed below
|
||||
|
||||
void C_CALLING_CONVENTION_QUALIFIER AtExitFn(); // declaration needed below
|
||||
} // namespace Private
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -222,7 +229,7 @@ namespace Loki
|
|||
template <class T>
|
||||
struct DefaultLifetime
|
||||
{
|
||||
static void ScheduleDestruction(T*, void (*pFun)())
|
||||
static void ScheduleDestruction(T*, atexit_pfn_t pFun)
|
||||
{ std::atexit(pFun); }
|
||||
|
||||
static void OnDeadReference()
|
||||
|
@ -240,7 +247,7 @@ namespace Loki
|
|||
class PhoenixSingleton
|
||||
{
|
||||
public:
|
||||
static void ScheduleDestruction(T*, void (*pFun)())
|
||||
static void ScheduleDestruction(T*, atexit_pfn_t pFun)
|
||||
{
|
||||
#ifndef ATEXIT_FIXED
|
||||
if (!destroyedOnce_)
|
||||
|
@ -276,7 +283,7 @@ namespace Loki
|
|||
struct Adapter
|
||||
{
|
||||
void operator()(T*) { return pFun_(); }
|
||||
void (*pFun_)();
|
||||
atexit_pfn_t pFun_;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -292,7 +299,7 @@ namespace Loki
|
|||
class SingletonWithLongevity
|
||||
{
|
||||
public:
|
||||
static void ScheduleDestruction(T* pObj, void (*pFun)())
|
||||
static void ScheduleDestruction(T* pObj, atexit_pfn_t pFun)
|
||||
{
|
||||
Private::Adapter<T> adapter = { pFun };
|
||||
SetLongevity(pObj, GetLongevity(pObj), adapter);
|
||||
|
@ -311,7 +318,7 @@ namespace Loki
|
|||
template <class T>
|
||||
struct NoDestroy
|
||||
{
|
||||
static void ScheduleDestruction(T*, void (*)())
|
||||
static void ScheduleDestruction(T*, atexit_pfn_t pFun)
|
||||
{}
|
||||
|
||||
static void OnDeadReference()
|
||||
|
@ -340,7 +347,7 @@ namespace Loki
|
|||
private:
|
||||
// Helpers
|
||||
static void MakeInstance();
|
||||
static void DestroySingleton();
|
||||
static void C_CALLING_CONVENTION_QUALIFIER DestroySingleton();
|
||||
|
||||
// Protection
|
||||
SingletonHolder();
|
||||
|
@ -432,7 +439,8 @@ namespace Loki
|
|||
template <class> class L,
|
||||
template <class> class M
|
||||
>
|
||||
void SingletonHolder<T, CreationPolicy, L, M>::DestroySingleton()
|
||||
void C_CALLING_CONVENTION_QUALIFIER
|
||||
SingletonHolder<T, CreationPolicy, L, M>::DestroySingleton()
|
||||
{
|
||||
assert(!destroyed_);
|
||||
CreationPolicy<T>::Destroy(pInstance_);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue