150 lines
2.9 KiB
C++
150 lines
2.9 KiB
C++
/*
|
|
Bullet Continuous Collision Detection and Physics Library
|
|
Copyright (c) 2007 Starbreeze Studios
|
|
|
|
This software is provided 'as-is', without any express or implied warranty.
|
|
In no event will the authors be held liable for any damages arising from the use of this software.
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it freely,
|
|
subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
Written by: Marten Svanfeldt
|
|
*/
|
|
|
|
#ifndef BT_SPU_SYNC_H
|
|
#define BT_SPU_SYNC_H
|
|
|
|
|
|
#include "PlatformDefinitions.h"
|
|
|
|
|
|
#if defined(WIN32)
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#ifdef _XBOX
|
|
#include <Xtl.h>
|
|
#else
|
|
#include <Windows.h>
|
|
#endif
|
|
|
|
///The btSpinlock is a structure to allow multi-platform synchronization. This allows to port the SPU tasks to other platforms.
|
|
class btSpinlock
|
|
{
|
|
public:
|
|
//typedef volatile LONG SpinVariable;
|
|
typedef CRITICAL_SECTION SpinVariable;
|
|
|
|
btSpinlock (SpinVariable* var)
|
|
: spinVariable (var)
|
|
{}
|
|
|
|
void Init ()
|
|
{
|
|
//*spinVariable = 0;
|
|
InitializeCriticalSection(spinVariable);
|
|
}
|
|
|
|
void Lock ()
|
|
{
|
|
EnterCriticalSection(spinVariable);
|
|
}
|
|
|
|
void Unlock ()
|
|
{
|
|
LeaveCriticalSection(spinVariable);
|
|
}
|
|
|
|
private:
|
|
SpinVariable* spinVariable;
|
|
};
|
|
|
|
|
|
#elif defined (__CELLOS_LV2__)
|
|
|
|
//#include <cell/atomic.h>
|
|
#include <cell/sync/mutex.h>
|
|
|
|
///The btSpinlock is a structure to allow multi-platform synchronization. This allows to port the SPU tasks to other platforms.
|
|
class btSpinlock
|
|
{
|
|
public:
|
|
typedef CellSyncMutex SpinVariable;
|
|
|
|
btSpinlock (SpinVariable* var)
|
|
: spinVariable (var)
|
|
{}
|
|
|
|
void Init ()
|
|
{
|
|
#ifndef __SPU__
|
|
//*spinVariable = 1;
|
|
cellSyncMutexInitialize(spinVariable);
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
void Lock ()
|
|
{
|
|
#ifdef __SPU__
|
|
// lock semaphore
|
|
/*while (cellAtomicTestAndDecr32(atomic_buf, (uint64_t)spinVariable) == 0)
|
|
{
|
|
|
|
};*/
|
|
cellSyncMutexLock((uint64_t)spinVariable);
|
|
#endif
|
|
}
|
|
|
|
void Unlock ()
|
|
{
|
|
#ifdef __SPU__
|
|
//cellAtomicIncr32(atomic_buf, (uint64_t)spinVariable);
|
|
cellSyncMutexUnlock((uint64_t)spinVariable);
|
|
#endif
|
|
}
|
|
|
|
|
|
private:
|
|
SpinVariable* spinVariable;
|
|
ATTRIBUTE_ALIGNED128(uint32_t atomic_buf[32]);
|
|
};
|
|
|
|
#else
|
|
//create a dummy implementation (without any locking) useful for serial processing
|
|
class btSpinlock
|
|
{
|
|
public:
|
|
typedef int SpinVariable;
|
|
|
|
btSpinlock (SpinVariable* var)
|
|
: spinVariable (var)
|
|
{}
|
|
|
|
void Init ()
|
|
{
|
|
}
|
|
|
|
void Lock ()
|
|
{
|
|
}
|
|
|
|
void Unlock ()
|
|
{
|
|
}
|
|
|
|
private:
|
|
SpinVariable* spinVariable;
|
|
};
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif //BT_SPU_SYNC_H
|
|
|