[+] (Linux only) IPCEvent, IPCSemaphore
This commit is contained in:
parent
37cb35d997
commit
44839e6234
16
Include/Aurora/IPC/IExportableIPC.hpp
Executable file
16
Include/Aurora/IPC/IExportableIPC.hpp
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: IExportableIPC.hpp
|
||||||
|
Date: 2022-4-14
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Aurora::IPC
|
||||||
|
{
|
||||||
|
struct IExportableIPC
|
||||||
|
{
|
||||||
|
virtual AuString ExportToString() = 0;
|
||||||
|
};
|
||||||
|
}
|
16
Include/Aurora/IPC/IPC.hpp
Executable file
16
Include/Aurora/IPC/IPC.hpp
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: IPC.hpp
|
||||||
|
Date: 2022-4-14
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "IExportableIPC.hpp"
|
||||||
|
#include "Primitives.hpp"
|
||||||
|
|
||||||
|
namespace Aurora::IPC
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -1,7 +0,0 @@
|
|||||||
/***
|
|
||||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
||||||
|
|
||||||
File: IPCCV.hpp
|
|
||||||
Date: 2021-8-27
|
|
||||||
Author: Reece
|
|
||||||
***/
|
|
@ -1,7 +0,0 @@
|
|||||||
/***
|
|
||||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
||||||
|
|
||||||
File: IPCEvent.hpp
|
|
||||||
Date: 2021-8-28
|
|
||||||
Author: Reece
|
|
||||||
***/
|
|
@ -1,7 +0,0 @@
|
|||||||
/***
|
|
||||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
||||||
|
|
||||||
File: IPCMemory.hpp
|
|
||||||
Date: 2021-8-27
|
|
||||||
Author: Reece
|
|
||||||
***/
|
|
@ -1,7 +0,0 @@
|
|||||||
/***
|
|
||||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
||||||
|
|
||||||
File: IPCMutex.hpp
|
|
||||||
Date: 2021-8-27
|
|
||||||
Author: Reece
|
|
||||||
***/
|
|
@ -1,7 +0,0 @@
|
|||||||
/***
|
|
||||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
||||||
|
|
||||||
File: IPCPipeServer.hpp
|
|
||||||
Date: 2021-8-28
|
|
||||||
Author: Reece
|
|
||||||
***/
|
|
@ -1,7 +0,0 @@
|
|||||||
/***
|
|
||||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
||||||
|
|
||||||
File: IPCSemaphore.hpp
|
|
||||||
Date: 2021-8-27
|
|
||||||
Author: Reece
|
|
||||||
***/
|
|
43
Include/Aurora/IPC/Primitives.hpp
Executable file
43
Include/Aurora/IPC/Primitives.hpp
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: Primitives.hpp
|
||||||
|
Date: 2022-4-14
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Aurora::IPC
|
||||||
|
{
|
||||||
|
struct IPCEvent : Loop::ILSEvent, IExportableIPC
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IPCSemaphore : Loop::ILSSemaphore, IExportableIPC
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IPCMutex : Loop::ILSMutex, IExportableIPC
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IPCPipe : IExportableIPC
|
||||||
|
{
|
||||||
|
virtual AuSPtr<Loop::ILoopSource> ToLoopQueue() = 0;
|
||||||
|
virtual bool Read(const Memory::MemoryViewStreamWrite &write, bool nonblock = true) = 0;
|
||||||
|
virtual bool Write(const Memory::MemoryViewStreamRead &read, bool nonblock = true) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCEvent> NewEvent(bool triggered, bool atomicRelease);
|
||||||
|
AUKN_SYM AuSPtr<IPCEvent> ImportEvent(const AuString &handle);
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCSemaphore> NewSemaphore(int startingValue);
|
||||||
|
AUKN_SYM AuSPtr<IPCSemaphore> ImportSemaphore(const AuString &handle);
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCMutex> NewMutex();
|
||||||
|
AUKN_SYM AuSPtr<IPCMutex> ImportMutex(const AuString &handle);
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCPipe> NewPipe();
|
||||||
|
AUKN_SYM AuSPtr<IPCPipe> ImportPipe(const AuString &handle);
|
||||||
|
|
||||||
|
}
|
@ -9,8 +9,8 @@
|
|||||||
|
|
||||||
namespace Aurora::Loop
|
namespace Aurora::Loop
|
||||||
{
|
{
|
||||||
// This is like a CF RunLoop with the input parameters of NT's WaitMultipleObjects
|
// ILoopQueue's are comparable to a CoreFoundation RunLoop with the input parameters of NT's WaitMultipleObjects and RegisterWaitForSingleObject
|
||||||
// This shouldn't be too much heavier than CF's libevent/NT abstraction in the style of a kevent interface with objects
|
// This shouldn't be too much heavier than CF's libevent/NT abstraction
|
||||||
|
|
||||||
struct ILoopQueue
|
struct ILoopQueue
|
||||||
{
|
{
|
||||||
@ -25,6 +25,7 @@ namespace Aurora::Loop
|
|||||||
* @param source
|
* @param source
|
||||||
* @return
|
* @return
|
||||||
* @note thread safe / nonblocking | can be called alongside any other function marked as such
|
* @note thread safe / nonblocking | can be called alongside any other function marked as such
|
||||||
|
* @warning it is unsafe to add an ILoopSource more than once.
|
||||||
*/
|
*/
|
||||||
virtual bool SourceAdd(const AuSPtr<ILoopSource> &source) = 0;
|
virtual bool SourceAdd(const AuSPtr<ILoopSource> &source) = 0;
|
||||||
|
|
||||||
@ -36,6 +37,7 @@ namespace Aurora::Loop
|
|||||||
* @param timeoutMS
|
* @param timeoutMS
|
||||||
* @return
|
* @return
|
||||||
* @note thread safe / nonblocking | can be called alongside any other function marked as such
|
* @note thread safe / nonblocking | can be called alongside any other function marked as such
|
||||||
|
* @warning it is unsafe to add an ILoopSource more than once.
|
||||||
*/
|
*/
|
||||||
virtual bool SourceAddWithTimeout(const AuSPtr<ILoopSource> &source, AuUInt32 timeoutMS) = 0;
|
virtual bool SourceAddWithTimeout(const AuSPtr<ILoopSource> &source, AuUInt32 timeoutMS) = 0;
|
||||||
|
|
||||||
@ -106,7 +108,6 @@ namespace Aurora::Loop
|
|||||||
*/
|
*/
|
||||||
virtual bool AddCallback(const AuSPtr<ILoopSourceSubscriber> &subscriber) = 0;
|
virtual bool AddCallback(const AuSPtr<ILoopSourceSubscriber> &subscriber) = 0;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Nonblocking check for alert objects in the loop queue
|
* @brief Nonblocking check for alert objects in the loop queue
|
||||||
* @return
|
* @return
|
||||||
@ -116,13 +117,19 @@ namespace Aurora::Loop
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Nonblocking wait-any for all objects in the loop queue
|
* @brief Nonblocking wait-any for all objects in the loop queue
|
||||||
* @warning (may yield to ILoopSourceSubscriber delegate on the current context)
|
* @warning may yield to ILoopSourceSubscriber delegate on the current context
|
||||||
* @warning (technically unsafe, use alloc-unsafe extended version to acknowledge unlocked sources)
|
* @warning (technically unsafe, use alloc-unsafe extended version to acknowledge unlocked sources)
|
||||||
* @return
|
* @return
|
||||||
* @note thread safe / nonblocking | can be called alongside any other function marked as such
|
* @note thread safe / nonblocking | can be called alongside any other function marked as such
|
||||||
*/
|
*/
|
||||||
virtual AuUInt32 PumpNonblocking() = 0;
|
virtual AuUInt32 PumpNonblocking() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Nonblocking wait-any for all objects in the loop queue
|
||||||
|
* @warning may yield to ILoopSourceSubscriber delegate on the current context
|
||||||
|
* @return
|
||||||
|
* @note thread safe / nonblocking | can be called alongside any other function marked as such
|
||||||
|
*/
|
||||||
virtual AuList<AuSPtr<ILoopSource>> PumpNonblockingEx() = 0;
|
virtual AuList<AuSPtr<ILoopSource>> PumpNonblockingEx() = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -205,8 +212,6 @@ namespace Aurora::Loop
|
|||||||
* @brief Hints that the calling program understands the kernel shouldnt schedule tne entire source list, and instead, we should long poll
|
* @brief Hints that the calling program understands the kernel shouldnt schedule tne entire source list, and instead, we should long poll
|
||||||
*/
|
*/
|
||||||
virtual void ChugHint(bool value) = 0;
|
virtual void ChugHint(bool value) = 0;
|
||||||
|
|
||||||
// TODO: once Win32 is finished and linux is looking alright, readd the removed functions
|
|
||||||
};
|
};
|
||||||
|
|
||||||
AUKN_SYM AuSPtr<ILoopQueue> NewLoopQueue();
|
AUKN_SYM AuSPtr<ILoopQueue> NewLoopQueue();
|
||||||
|
@ -23,7 +23,6 @@ namespace Aurora::Loop
|
|||||||
*/
|
*/
|
||||||
virtual ELoopSource GetType() = 0;
|
virtual ELoopSource GetType() = 0;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @breif Blocks the current thread for the kernel primitives
|
* @breif Blocks the current thread for the kernel primitives
|
||||||
* @warning Are you looking for LoopQueues? You can even reduce async threads down to kernel ILoopQueue's
|
* @warning Are you looking for LoopQueues? You can even reduce async threads down to kernel ILoopQueue's
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
#include "Async/Async.hpp"
|
#include "Async/Async.hpp"
|
||||||
#include "Processes/Processes.hpp"
|
#include "Processes/Processes.hpp"
|
||||||
#include "Loop/Loop.hpp"
|
#include "Loop/Loop.hpp"
|
||||||
|
#include "IPC/IPC.hpp"
|
||||||
#include "SWInfo/SWInfo.hpp"
|
#include "SWInfo/SWInfo.hpp"
|
||||||
#include "Exit/Exit.hpp"
|
#include "Exit/Exit.hpp"
|
||||||
#include "CmdLine/CmdLine.hpp"
|
#include "CmdLine/CmdLine.hpp"
|
||||||
|
323
Source/IPC/IPCPrimitives.Linux.cpp
Executable file
323
Source/IPC/IPCPrimitives.Linux.cpp
Executable file
@ -0,0 +1,323 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: IPCPrimitives.Linux.cpp
|
||||||
|
Date: 2022-4-13
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#include <Source/RuntimeInternal.hpp>
|
||||||
|
#include "IPC.hpp"
|
||||||
|
#include "IPCHandle.hpp"
|
||||||
|
#include "IPCPrimitives.Linux.hpp"
|
||||||
|
|
||||||
|
#include <Source/Loop/LSEvent.hpp>
|
||||||
|
#include <Source/Loop/LSSemaphore.hpp>
|
||||||
|
|
||||||
|
#include <Source/IPC/IPC.hpp>
|
||||||
|
#include <Source/IPC/IPCHandle.hpp>
|
||||||
|
|
||||||
|
#include <Source/IO/UNIX/FDIpcServer.hpp>
|
||||||
|
|
||||||
|
namespace Aurora::IPC
|
||||||
|
{
|
||||||
|
#define PROXY_INTERNAL_INTERFACE(Base)\
|
||||||
|
virtual void OnPresleep() override \
|
||||||
|
{ \
|
||||||
|
Base.OnPresleep(); \
|
||||||
|
}; \
|
||||||
|
virtual bool OnTrigger(AuUInt handle) override \
|
||||||
|
{ \
|
||||||
|
return Base.OnTrigger(handle); \
|
||||||
|
} \
|
||||||
|
virtual void OnFinishSleep() override \
|
||||||
|
{ \
|
||||||
|
Base.OnFinishSleep(); \
|
||||||
|
} \
|
||||||
|
virtual bool Singular() override \
|
||||||
|
{ \
|
||||||
|
return Base.Singular(); \
|
||||||
|
} \
|
||||||
|
virtual AuUInt GetHandle() override \
|
||||||
|
{ \
|
||||||
|
return Base.GetHandle(); \
|
||||||
|
} \
|
||||||
|
virtual AuList<AuUInt> GetHandles() override \
|
||||||
|
{ \
|
||||||
|
return Base.GetHandles(); \
|
||||||
|
} \
|
||||||
|
virtual AuList<AuUInt> GetWriteHandles() override \
|
||||||
|
{ \
|
||||||
|
return Base.GetWriteHandles(); \
|
||||||
|
} \
|
||||||
|
virtual AuUInt GetWriteHandle() override \
|
||||||
|
{ \
|
||||||
|
return Base.GetWriteHandle(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define IMPLEMENT_HANDLE \
|
||||||
|
IPC::IPCHandle handle_; \
|
||||||
|
AuString ExportToString() override \
|
||||||
|
{ \
|
||||||
|
return handle_.ToString(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Events
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
struct IPCEventProxy : IPCEvent, Loop::ILoopSourceEx
|
||||||
|
{
|
||||||
|
IPCEventProxy(bool triggered, bool atomicRelease);
|
||||||
|
IPCEventProxy(int handle, bool triggered, bool atomicRelease);
|
||||||
|
~IPCEventProxy();
|
||||||
|
|
||||||
|
PROXY_INTERNAL_INTERFACE(event_)
|
||||||
|
IMPLEMENT_HANDLE
|
||||||
|
|
||||||
|
bool Set() override;
|
||||||
|
bool Reset() override;
|
||||||
|
|
||||||
|
bool IsSignaled() override;
|
||||||
|
bool WaitOn(AuUInt32 timeout) override;
|
||||||
|
Loop::ELoopSource GetType() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Loop::LSEvent event_;
|
||||||
|
};
|
||||||
|
|
||||||
|
IPCEventProxy::IPCEventProxy(bool triggered, bool atomicRelease) : event_(triggered, atomicRelease, true)
|
||||||
|
{
|
||||||
|
if (this->event_.HasValidHandle())
|
||||||
|
{
|
||||||
|
if (!IO::UNIX::FDServe(triggered, atomicRelease, false, true, this->GetHandle(), this->handle_))
|
||||||
|
{
|
||||||
|
this->event_.~LSEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IPCEventProxy::IPCEventProxy(int handle, bool triggered, bool atomicRelease) : event_(handle, triggered, atomicRelease)
|
||||||
|
{
|
||||||
|
if (this->event_.HasValidHandle())
|
||||||
|
{
|
||||||
|
if (!IO::UNIX::FDServe(triggered, atomicRelease, false, true, this->GetHandle(), this->handle_))
|
||||||
|
{
|
||||||
|
this->event_.~LSEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IPCEventProxy::~IPCEventProxy()
|
||||||
|
{
|
||||||
|
IO::UNIX::FDServeEnd(this->handle_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPCEventProxy::Set()
|
||||||
|
{
|
||||||
|
return event_.Set();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPCEventProxy::Reset()
|
||||||
|
{
|
||||||
|
return event_.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPCEventProxy::IsSignaled()
|
||||||
|
{
|
||||||
|
return event_.IsSignaled();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPCEventProxy::WaitOn(AuUInt32 timeout)
|
||||||
|
{
|
||||||
|
return event_.WaitOn(timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
Loop::ELoopSource IPCEventProxy::GetType()
|
||||||
|
{
|
||||||
|
return event_.GetType();
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCEvent> NewEvent(bool triggered, bool atomicRelease)
|
||||||
|
{
|
||||||
|
auto object = AuMakeShared<IPCEventProxy>(triggered, atomicRelease);
|
||||||
|
if (!object)
|
||||||
|
{
|
||||||
|
SysPushErrorMem();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCEvent> ImportEvent(const AuString &handle)
|
||||||
|
{
|
||||||
|
IPC::IPCHandle decodedHandle;
|
||||||
|
|
||||||
|
if (!decodedHandle.FromString(handle))
|
||||||
|
{
|
||||||
|
SysPushErrorParseError("Invalid handle: {}", handle);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd {-1};
|
||||||
|
if (!IO::UNIX::FDAccept(decodedHandle, fd))
|
||||||
|
{
|
||||||
|
SysPushErrorNested();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto object = AuMakeShared<IPCEventProxy>(fd, decodedHandle.flags[0], decodedHandle.flags[1]);
|
||||||
|
if (!object)
|
||||||
|
{
|
||||||
|
SysPushErrorMem();
|
||||||
|
::close(fd);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Semaphores
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
struct IPCSemaphoreProxy : IPCSemaphore, Loop::ILoopSourceEx
|
||||||
|
{
|
||||||
|
IPCSemaphoreProxy(AuUInt32 initialCount);
|
||||||
|
IPCSemaphoreProxy(int handle, int tag);
|
||||||
|
~IPCSemaphoreProxy();
|
||||||
|
|
||||||
|
PROXY_INTERNAL_INTERFACE(semaphore_)
|
||||||
|
IMPLEMENT_HANDLE
|
||||||
|
|
||||||
|
bool AddOne() override;
|
||||||
|
|
||||||
|
bool IsSignaled() override;
|
||||||
|
bool WaitOn(AuUInt32 timeout) override;
|
||||||
|
Loop::ELoopSource GetType() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Loop::LSSemaphore semaphore_;
|
||||||
|
};
|
||||||
|
|
||||||
|
IPCSemaphoreProxy::IPCSemaphoreProxy(AuUInt32 initialCount) : semaphore_(initialCount)
|
||||||
|
{
|
||||||
|
if (this->semaphore_.HasValidHandle())
|
||||||
|
{
|
||||||
|
if (!IO::UNIX::FDServe(true, true, true, true, this->GetHandle(), this->handle_))
|
||||||
|
{
|
||||||
|
this->semaphore_.~LSSemaphore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IPCSemaphoreProxy::IPCSemaphoreProxy(int handle, int tag) : semaphore_(handle, tag)
|
||||||
|
{
|
||||||
|
if (this->semaphore_.HasValidHandle())
|
||||||
|
{
|
||||||
|
if (!IO::UNIX::FDServe(true, true, true, true, this->GetHandle(), this->handle_))
|
||||||
|
{
|
||||||
|
this->semaphore_.~LSSemaphore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IPCSemaphoreProxy::~IPCSemaphoreProxy()
|
||||||
|
{
|
||||||
|
IO::UNIX::FDServeEnd(this->handle_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPCSemaphoreProxy::AddOne()
|
||||||
|
{
|
||||||
|
return semaphore_.AddOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPCSemaphoreProxy::IsSignaled()
|
||||||
|
{
|
||||||
|
return semaphore_.IsSignaled();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPCSemaphoreProxy::WaitOn(AuUInt32 timeout)
|
||||||
|
{
|
||||||
|
return semaphore_.WaitOn(timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
Loop::ELoopSource IPCSemaphoreProxy::GetType()
|
||||||
|
{
|
||||||
|
return semaphore_.GetType();
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCSemaphore> NewSemaphore(int startingValue)
|
||||||
|
{
|
||||||
|
auto object = AuMakeShared<IPCSemaphoreProxy>(startingValue);
|
||||||
|
if (!object)
|
||||||
|
{
|
||||||
|
SysPushErrorMem();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCSemaphore> ImportSemaphore(const AuString &handle)
|
||||||
|
{
|
||||||
|
IPC::IPCHandle decodedHandle;
|
||||||
|
|
||||||
|
if (!decodedHandle.FromString(handle))
|
||||||
|
{
|
||||||
|
SysPushErrorParseError("Invalid handle: {}", handle);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd {-1};
|
||||||
|
if (!IO::UNIX::FDAccept(decodedHandle, fd))
|
||||||
|
{
|
||||||
|
SysPushErrorNested();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto object = AuMakeShared<IPCSemaphoreProxy>(fd, 0xC001C0DE);
|
||||||
|
if (!object)
|
||||||
|
{
|
||||||
|
SysPushErrorMem();
|
||||||
|
::close(fd);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Mutexes
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCMutex> NewMutex()
|
||||||
|
{
|
||||||
|
SysPushErrorUnimplemented();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCMutex> ImportMutex(const AuString &handle)
|
||||||
|
{
|
||||||
|
SysPushErrorUnimplemented();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Pipes
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCPipe> NewPipe()
|
||||||
|
{
|
||||||
|
SysPushErrorUnimplemented();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuSPtr<IPCPipe> ImportPipe(const AuString &handle)
|
||||||
|
{
|
||||||
|
SysPushErrorUnimplemented();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
13
Source/IPC/IPCPrimitives.Linux.hpp
Executable file
13
Source/IPC/IPCPrimitives.Linux.hpp
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: IPCPrimitives.Linux.hpp
|
||||||
|
Date: 2022-4-13
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Aurora::IPC
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
16
Source/IPC/IPCPrimitives.NT.cpp
Executable file
16
Source/IPC/IPCPrimitives.NT.cpp
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: IPCPrimitives.NT.cpp
|
||||||
|
Date: 2022-4-13
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#include <Source/RuntimeInternal.hpp>
|
||||||
|
#include "IPC.hpp"
|
||||||
|
#include "IPCHandle.hpp"
|
||||||
|
#include "IPCPrimitives.NT.hpp"
|
||||||
|
|
||||||
|
namespace Aurora::IPC
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
13
Source/IPC/IPCPrimitives.NT.hpp
Executable file
13
Source/IPC/IPCPrimitives.NT.hpp
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: IPCPrimitives.NT.hpp
|
||||||
|
Date: 2022-4-13
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Aurora::IPC
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -16,12 +16,17 @@ namespace Aurora::Loop
|
|||||||
Init(triggered);
|
Init(triggered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LSEvent::LSEvent(int handle, bool triggered, bool atomicRelease) : atomicRelease_(atomicRelease)
|
||||||
|
{
|
||||||
|
this->handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
LSEvent::~LSEvent()
|
LSEvent::~LSEvent()
|
||||||
{
|
{
|
||||||
if ((this->handle != 0) &&
|
if ((this->handle != 0) &&
|
||||||
(this->handle != -1))
|
(this->handle != -1))
|
||||||
{
|
{
|
||||||
close(this->handle);
|
close(AuExchange(this->handle, -1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,7 +44,7 @@ namespace Aurora::Loop
|
|||||||
|
|
||||||
void LSEvent::Init(bool init)
|
void LSEvent::Init(bool init)
|
||||||
{
|
{
|
||||||
handle = eventfd(init ? 1 : 0, EFD_NONBLOCK);
|
this->handle = eventfd(init ? 1 : 0, EFD_NONBLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LSEvent::Set()
|
bool LSEvent::Set()
|
||||||
|
@ -13,6 +13,7 @@ namespace Aurora::Loop
|
|||||||
struct LSEvent : public ILSEvent, public LSHandle
|
struct LSEvent : public ILSEvent, public LSHandle
|
||||||
{
|
{
|
||||||
LSEvent(bool triggered, bool atomicRelease, bool permitMultipleTriggers);
|
LSEvent(bool triggered, bool atomicRelease, bool permitMultipleTriggers);
|
||||||
|
LSEvent(int handle, bool triggered, bool atomicRelease);
|
||||||
~LSEvent();
|
~LSEvent();
|
||||||
|
|
||||||
bool Set() override;
|
bool Set() override;
|
||||||
|
@ -16,12 +16,17 @@ namespace Aurora::Loop
|
|||||||
Init(initialCount);
|
Init(initialCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LSSemaphore::LSSemaphore(int handle, int tag)
|
||||||
|
{
|
||||||
|
this->handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
LSSemaphore::~LSSemaphore()
|
LSSemaphore::~LSSemaphore()
|
||||||
{
|
{
|
||||||
if ((this->handle != 0) &&
|
if ((this->handle != 0) &&
|
||||||
(this->handle != -1))
|
(this->handle != -1))
|
||||||
{
|
{
|
||||||
::close(this->handle);
|
::close(AuExchange(this->handle, -1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ namespace Aurora::Loop
|
|||||||
struct LSSemaphore : public ILSSemaphore, public LSHandle
|
struct LSSemaphore : public ILSSemaphore, public LSHandle
|
||||||
{
|
{
|
||||||
LSSemaphore(AuUInt32 initialCount);
|
LSSemaphore(AuUInt32 initialCount);
|
||||||
|
LSSemaphore(int handle, int tag);
|
||||||
~LSSemaphore();
|
~LSSemaphore();
|
||||||
|
|
||||||
bool AddOne() override;
|
bool AddOne() override;
|
||||||
|
Loading…
Reference in New Issue
Block a user