2014-01-19 22:19:37 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
2014-01-31 00:40:05 +01:00
|
|
|
struct sys_lwmutex_attribute_t
|
|
|
|
|
{
|
2014-09-19 02:19:22 +02:00
|
|
|
be_t<u32> protocol;
|
|
|
|
|
be_t<u32> recursive;
|
2014-02-09 12:11:48 +01:00
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
char name[8];
|
|
|
|
|
u64 name_u64;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2014-01-19 22:19:37 +01:00
|
|
|
struct sys_lwmutex_t
|
|
|
|
|
{
|
2014-12-23 00:31:11 +01:00
|
|
|
atomic_t<u32> owner;
|
2014-12-22 01:56:04 +01:00
|
|
|
atomic_t<u32> waiter; // currently not used
|
2014-01-19 22:19:37 +01:00
|
|
|
be_t<u32> attribute;
|
2014-12-24 00:38:13 +01:00
|
|
|
atomic_t<u32> recursive_count;
|
2014-01-19 22:19:37 +01:00
|
|
|
be_t<u32> sleep_queue;
|
|
|
|
|
be_t<u32> pad;
|
2014-01-31 00:40:05 +01:00
|
|
|
|
2014-09-19 02:19:22 +02:00
|
|
|
u64& all_info()
|
|
|
|
|
{
|
|
|
|
|
return *(reinterpret_cast<u64*>(this));
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-22 01:56:04 +01:00
|
|
|
s32 trylock(be_t<u32> tid);
|
|
|
|
|
s32 unlock(be_t<u32> tid);
|
|
|
|
|
s32 lock(be_t<u32> tid, u64 timeout);
|
2014-02-23 17:52:52 +01:00
|
|
|
};
|
2014-06-25 00:38:34 +02:00
|
|
|
|
2014-09-19 02:19:22 +02:00
|
|
|
// Aux
|
|
|
|
|
s32 lwmutex_create(sys_lwmutex_t& lwmutex, u32 protocol, u32 recursive, u64 name_u64);
|
|
|
|
|
|
2014-12-23 00:31:11 +01:00
|
|
|
class PPUThread;
|
|
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
// SysCalls
|
2014-12-23 00:31:11 +01:00
|
|
|
s32 sys_lwmutex_create(PPUThread& CPU, vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwmutex_attribute_t> attr);
|
|
|
|
|
s32 sys_lwmutex_destroy(PPUThread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
|
|
|
|
|
s32 sys_lwmutex_lock(PPUThread& CPU, vm::ptr<sys_lwmutex_t> lwmutex, u64 timeout);
|
|
|
|
|
s32 sys_lwmutex_trylock(PPUThread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
|
|
|
|
|
s32 sys_lwmutex_unlock(PPUThread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
|