2014-01-19 22:19:37 +01:00
|
|
|
#pragma once
|
2014-02-05 12:55:32 +01:00
|
|
|
#include <Utilities/SMutex.h>
|
2014-01-19 22:19:37 +01:00
|
|
|
|
|
|
|
|
// attr_protocol (waiting scheduling policy)
|
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
// First In, First Out
|
|
|
|
|
SYS_SYNC_FIFO = 1,
|
2014-01-31 00:40:05 +01:00
|
|
|
// Priority Order
|
2014-01-19 22:19:37 +01:00
|
|
|
SYS_SYNC_PRIORITY = 2,
|
2014-02-14 12:40:41 +01:00
|
|
|
// Basic Priority Inheritance Protocol (probably not implemented)
|
2014-01-19 22:19:37 +01:00
|
|
|
SYS_SYNC_PRIORITY_INHERIT = 3,
|
2014-02-06 23:55:48 +01:00
|
|
|
// Not selected while unlocking
|
2014-01-19 22:19:37 +01:00
|
|
|
SYS_SYNC_RETRY = 4,
|
|
|
|
|
//
|
|
|
|
|
SYS_SYNC_ATTR_PROTOCOL_MASK = 0xF,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// attr_recursive (recursive locks policy)
|
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
// Recursive locks are allowed
|
|
|
|
|
SYS_SYNC_RECURSIVE = 0x10,
|
|
|
|
|
// Recursive locks are NOT allowed
|
|
|
|
|
SYS_SYNC_NOT_RECURSIVE = 0x20,
|
|
|
|
|
//
|
|
|
|
|
SYS_SYNC_ATTR_RECURSIVE_MASK = 0xF0, //???
|
|
|
|
|
};
|
|
|
|
|
|
2014-01-31 00:40:05 +01:00
|
|
|
struct sys_lwmutex_attribute_t
|
|
|
|
|
{
|
|
|
|
|
be_t<u32> attr_protocol;
|
|
|
|
|
be_t<u32> attr_recursive;
|
2014-02-09 12:11:48 +01:00
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
char name[8];
|
|
|
|
|
u64 name_u64;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2014-02-13 12:13:05 +01:00
|
|
|
struct SleepQueue
|
2014-02-09 12:11:48 +01:00
|
|
|
{
|
|
|
|
|
/* struct q_rec
|
|
|
|
|
{
|
|
|
|
|
u32 tid;
|
|
|
|
|
u64 prio;
|
|
|
|
|
q_rec(u32 tid, u64 prio): tid(tid), prio(prio) {}
|
|
|
|
|
}; */
|
|
|
|
|
Array<u32> list;
|
2014-02-13 12:13:05 +01:00
|
|
|
SMutex m_mutex;
|
2014-02-09 12:11:48 +01:00
|
|
|
u64 m_name;
|
|
|
|
|
|
2014-02-13 12:13:05 +01:00
|
|
|
SleepQueue(u64 name = 0)
|
2014-02-09 12:11:48 +01:00
|
|
|
: m_name(name)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-13 12:13:05 +01:00
|
|
|
void push(u32 tid);
|
|
|
|
|
u32 pop(); // SYS_SYNC_FIFO
|
|
|
|
|
u32 pop_prio(); // SYS_SYNC_PRIORITY
|
|
|
|
|
u32 pop_prio_inherit(); // (TODO)
|
2014-02-14 12:40:41 +01:00
|
|
|
bool invalidate(u32 tid);
|
|
|
|
|
bool finalize();
|
2014-01-31 00:40:05 +01:00
|
|
|
};
|
|
|
|
|
|
2014-01-19 22:19:37 +01:00
|
|
|
struct sys_lwmutex_t
|
|
|
|
|
{
|
|
|
|
|
union // sys_lwmutex_variable_t
|
|
|
|
|
{
|
|
|
|
|
struct // sys_lwmutex_lock_info_t
|
|
|
|
|
{
|
2014-02-05 12:55:32 +01:00
|
|
|
/* volatile */ SMutexBE owner;
|
|
|
|
|
/* volatile */ be_t<u32> waiter; // not used
|
2014-01-19 22:19:37 +01:00
|
|
|
};
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
/* volatile */ be_t<u64> all_info;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
be_t<u32> attribute;
|
|
|
|
|
be_t<u32> recursive_count;
|
|
|
|
|
be_t<u32> sleep_queue;
|
|
|
|
|
be_t<u32> pad;
|
2014-01-31 00:40:05 +01:00
|
|
|
|
2014-02-13 12:13:05 +01:00
|
|
|
int trylock(be_t<u32> tid);
|
|
|
|
|
int unlock(be_t<u32> tid);
|
|
|
|
|
int lock(be_t<u32> tid, u64 timeout);
|
2014-02-14 12:40:41 +01:00
|
|
|
};
|