Add ReadWriteLock to platform api
This commit is contained in:
15
Source/Engine/Platform/ReadWriteLock.h
Normal file
15
Source/Engine/Platform/ReadWriteLock.h
Normal file
@@ -0,0 +1,15 @@
|
||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#if PLATFORM_WINDOWS || PLATFORM_UWP || PLATFORM_XBOX_ONE || PLATFORM_XBOX_SCARLETT
|
||||
#include "Win32/Win32ReadWriteLock.h"
|
||||
#elif PLATFORM_LINUX || PLATFORM_ANDROID || PLATFORM_PS4 || PLATFORM_PS5 || PLATFORM_MAC || PLATFORM_IOS
|
||||
#include "Unix/UnixReadWriteLock.h"
|
||||
#elif PLATFORM_SWITCH
|
||||
#include "Platforms/Switch/Engine/Platform/SwitchReadWriteLock.h"
|
||||
#else
|
||||
#error Missing Read Write Lock implementation!
|
||||
#endif
|
||||
|
||||
#include "Types.h"
|
||||
@@ -8,6 +8,8 @@ class WindowsClipboard;
|
||||
typedef WindowsClipboard Clipboard;
|
||||
class Win32CriticalSection;
|
||||
typedef Win32CriticalSection CriticalSection;
|
||||
class Win32ReadWriteLock;
|
||||
typedef Win32ReadWriteLock ReadWriteLock;
|
||||
class Win32ConditionVariable;
|
||||
typedef Win32ConditionVariable ConditionVariable;
|
||||
class WindowsFileSystem;
|
||||
@@ -33,6 +35,8 @@ class ClipboardBase;
|
||||
typedef ClipboardBase Clipboard;
|
||||
class Win32CriticalSection;
|
||||
typedef Win32CriticalSection CriticalSection;
|
||||
class Win32ReadWriteLock;
|
||||
typedef Win32ReadWriteLock ReadWriteLock;
|
||||
class Win32ConditionVariable;
|
||||
typedef Win32ConditionVariable ConditionVariable;
|
||||
class UWPFileSystem;
|
||||
@@ -58,6 +62,8 @@ class LinuxClipboard;
|
||||
typedef LinuxClipboard Clipboard;
|
||||
class UnixCriticalSection;
|
||||
typedef UnixCriticalSection CriticalSection;
|
||||
class UnixReadWriteLock;
|
||||
typedef UnixReadWriteLock ReadWriteLock;
|
||||
class UnixConditionVariable;
|
||||
typedef UnixConditionVariable ConditionVariable;
|
||||
class LinuxFileSystem;
|
||||
@@ -83,6 +89,8 @@ class ClipboardBase;
|
||||
typedef ClipboardBase Clipboard;
|
||||
class UnixCriticalSection;
|
||||
typedef UnixCriticalSection CriticalSection;
|
||||
class UnixReadWriteLock;
|
||||
typedef UnixReadWriteLock ReadWriteLock;
|
||||
class UnixConditionVariable;
|
||||
typedef UnixConditionVariable ConditionVariable;
|
||||
class PS4FileSystem;
|
||||
@@ -108,6 +116,8 @@ class ClipboardBase;
|
||||
typedef ClipboardBase Clipboard;
|
||||
class UnixCriticalSection;
|
||||
typedef UnixCriticalSection CriticalSection;
|
||||
class UnixReadWriteLock;
|
||||
typedef UnixReadWriteLock ReadWriteLock;
|
||||
class UnixConditionVariable;
|
||||
typedef UnixConditionVariable ConditionVariable;
|
||||
class PS5FileSystem;
|
||||
@@ -133,6 +143,8 @@ class ClipboardBase;
|
||||
typedef ClipboardBase Clipboard;
|
||||
class Win32CriticalSection;
|
||||
typedef Win32CriticalSection CriticalSection;
|
||||
class Win32ReadWriteLock;
|
||||
typedef Win32ReadWriteLock ReadWriteLock;
|
||||
class Win32ConditionVariable;
|
||||
typedef Win32ConditionVariable ConditionVariable;
|
||||
class XboxOneFileSystem;
|
||||
@@ -158,6 +170,8 @@ class ClipboardBase;
|
||||
typedef ClipboardBase Clipboard;
|
||||
class Win32CriticalSection;
|
||||
typedef Win32CriticalSection CriticalSection;
|
||||
class Win32ReadWriteLock;
|
||||
typedef Win32ReadWriteLock ReadWriteLock;
|
||||
class Win32ConditionVariable;
|
||||
typedef Win32ConditionVariable ConditionVariable;
|
||||
class XboxScarlettFileSystem;
|
||||
@@ -183,6 +197,8 @@ class ClipboardBase;
|
||||
typedef ClipboardBase Clipboard;
|
||||
class UnixCriticalSection;
|
||||
typedef UnixCriticalSection CriticalSection;
|
||||
class UnixReadWriteLock;
|
||||
typedef UnixReadWriteLock ReadWriteLock;
|
||||
class UnixConditionVariable;
|
||||
typedef UnixConditionVariable ConditionVariable;
|
||||
class AndroidFileSystem;
|
||||
@@ -208,6 +224,8 @@ class ClipboardBase;
|
||||
typedef ClipboardBase Clipboard;
|
||||
class SwitchCriticalSection;
|
||||
typedef SwitchCriticalSection CriticalSection;
|
||||
class SwitchReadWriteLock;
|
||||
typedef SwitchReadWriteLock ReadWriteLock;
|
||||
class SwitchConditionVariable;
|
||||
typedef SwitchConditionVariable ConditionVariable;
|
||||
class SwitchFileSystem;
|
||||
@@ -233,6 +251,8 @@ class MacClipboard;
|
||||
typedef MacClipboard Clipboard;
|
||||
class UnixCriticalSection;
|
||||
typedef UnixCriticalSection CriticalSection;
|
||||
class UnixReadWriteLock;
|
||||
typedef UnixReadWriteLock ReadWriteLock;
|
||||
class UnixConditionVariable;
|
||||
typedef UnixConditionVariable ConditionVariable;
|
||||
class MacFileSystem;
|
||||
@@ -258,6 +278,8 @@ class ClipboardBase;
|
||||
typedef ClipboardBase Clipboard;
|
||||
class UnixCriticalSection;
|
||||
typedef UnixCriticalSection CriticalSection;
|
||||
class UnixReadWriteLock;
|
||||
typedef UnixReadWriteLock ReadWriteLock;
|
||||
class UnixConditionVariable;
|
||||
typedef UnixConditionVariable ConditionVariable;
|
||||
class iOSFileSystem;
|
||||
|
||||
71
Source/Engine/Platform/Unix/UnixReadWriteLock.h
Normal file
71
Source/Engine/Platform/Unix/UnixReadWriteLock.h
Normal file
@@ -0,0 +1,71 @@
|
||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#if PLATFORM_UNIX
|
||||
|
||||
#include "Engine/Platform/Platform.h"
|
||||
#include <pthread.h>
|
||||
|
||||
/// <summary>
|
||||
/// Unix implementation of a read/write lock that allows for shared reading by multiple threads and exclusive writing by a single thread.
|
||||
/// </summary>
|
||||
class FLAXENGINE_API UnixReadWriteLock
|
||||
{
|
||||
private:
|
||||
mutable pthread_rwlock_t _lock;
|
||||
|
||||
private:
|
||||
NON_COPYABLE(UnixReadWriteLock);
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="UnixReadWriteLock"/> class.
|
||||
/// </summary>
|
||||
UnixReadWriteLock()
|
||||
{
|
||||
pthread_rwlock_init(&_lock, nullptr);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finalizes an instance of the <see cref="UnixReadWriteLock"/> class.
|
||||
/// </summary>
|
||||
~UnixReadWriteLock()
|
||||
{
|
||||
pthread_rwlock_destroy(&_lock);
|
||||
}
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
/// Locks for shared reading.
|
||||
/// </summary>
|
||||
void ReadLock() const
|
||||
{
|
||||
pthread_rwlock_rdlock(&_lock);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Releases the lock after shared reading.
|
||||
/// </summary>
|
||||
void ReadUnlock() const
|
||||
{
|
||||
pthread_rwlock_unlock(&_lock);
|
||||
}
|
||||
/// <summary>
|
||||
/// Locks for exclusive writing.
|
||||
/// </summary>
|
||||
void WriteLock() const
|
||||
{
|
||||
pthread_rwlock_wrlock(&_lock);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Releases the lock after exclusive writing.
|
||||
/// </summary>
|
||||
void WriteUnlock() const
|
||||
{
|
||||
pthread_rwlock_unlock(&_lock);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
69
Source/Engine/Platform/Win32/Win32ReadWriteLock.h
Normal file
69
Source/Engine/Platform/Win32/Win32ReadWriteLock.h
Normal file
@@ -0,0 +1,69 @@
|
||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#if PLATFORM_WIN32
|
||||
|
||||
#include "WindowsMinimal.h"
|
||||
|
||||
/// <summary>
|
||||
/// Win32 implementation of a read/write lock that allows for shared reading by multiple threads and exclusive writing by a single thread.
|
||||
/// </summary>
|
||||
class FLAXENGINE_API Win32ReadWriteLock
|
||||
{
|
||||
private:
|
||||
mutable Windows::SRWLOCK _lock;
|
||||
|
||||
private:
|
||||
NON_COPYABLE(Win32ReadWriteLock);
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Win32ReadWriteLock"/> class.
|
||||
/// </summary>
|
||||
Win32ReadWriteLock()
|
||||
{
|
||||
Windows::InitializeSRWLock(&_lock);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finalizes an instance of the <see cref="Win32ReadWriteLock"/> class.
|
||||
/// </summary>
|
||||
~Win32ReadWriteLock()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
/// Locks for shared reading.
|
||||
/// </summary>
|
||||
__forceinline void ReadLock() const
|
||||
{
|
||||
Windows::AcquireSRWLockShared(&_lock);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Releases the lock after shared reading.
|
||||
/// </summary>
|
||||
__forceinline void ReadUnlock() const
|
||||
{
|
||||
Windows::ReleaseSRWLockShared(&_lock);
|
||||
}
|
||||
/// <summary>
|
||||
/// Locks for exclusive writing.
|
||||
/// </summary>
|
||||
__forceinline void WriteLock() const
|
||||
{
|
||||
Windows::AcquireSRWLockExclusive(&_lock);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Releases the lock after exclusive writing.
|
||||
/// </summary>
|
||||
__forceinline void WriteUnlock() const
|
||||
{
|
||||
Windows::ReleaseSRWLockExclusive(&_lock);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -65,6 +65,11 @@ namespace Windows
|
||||
void* Ptr;
|
||||
};
|
||||
|
||||
struct SRWLOCK
|
||||
{
|
||||
void* Ptr;
|
||||
};
|
||||
|
||||
struct OVERLAPPED
|
||||
{
|
||||
void* Data1[3];
|
||||
@@ -96,6 +101,12 @@ namespace Windows
|
||||
WIN_API void WIN_API_CALLCONV WakeConditionVariable(CONDITION_VARIABLE* ConditionVariable);
|
||||
WIN_API void WIN_API_CALLCONV WakeAllConditionVariable(CONDITION_VARIABLE* ConditionVariable);
|
||||
|
||||
WIN_API void WIN_API_CALLCONV InitializeSRWLock(SRWLOCK* SRWLock);
|
||||
WIN_API void WIN_API_CALLCONV AcquireSRWLockShared(SRWLOCK* SRWLock);
|
||||
WIN_API void WIN_API_CALLCONV ReleaseSRWLockShared(SRWLOCK* SRWLock);
|
||||
WIN_API void WIN_API_CALLCONV AcquireSRWLockExclusive(SRWLOCK* SRWLock);
|
||||
WIN_API void WIN_API_CALLCONV ReleaseSRWLockExclusive(SRWLOCK* SRWLock);
|
||||
|
||||
class IDataObject;
|
||||
typedef GUID IID;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user