cellAudio, thread_t improvements, pause/resume callback

This commit is contained in:
Nekotekina 2015-01-17 19:14:58 +03:00
parent 4dae27c1d4
commit b897a5d20a
10 changed files with 478 additions and 259 deletions

View file

@ -537,16 +537,32 @@ bool ThreadBase::TestDestroy() const
return m_destroy;
}
thread_t::thread_t(const std::string& name, std::function<void()> func) : m_name(name), m_state(TS_NON_EXISTENT)
thread_t::thread_t(const std::string& name, bool autojoin, std::function<void()> func)
: m_name(name)
, m_state(TS_NON_EXISTENT)
, m_autojoin(autojoin)
{
start(func);
}
thread_t::thread_t(const std::string& name) : m_name(name), m_state(TS_NON_EXISTENT)
thread_t::thread_t(const std::string& name, std::function<void()> func)
: m_name(name)
, m_state(TS_NON_EXISTENT)
, m_autojoin(false)
{
start(func);
}
thread_t::thread_t(const std::string& name)
: m_name(name)
, m_state(TS_NON_EXISTENT)
, m_autojoin(false)
{
}
thread_t::thread_t() : m_state(TS_NON_EXISTENT)
thread_t::thread_t()
: m_state(TS_NON_EXISTENT)
, m_autojoin(false)
{
}
@ -559,7 +575,14 @@ thread_t::~thread_t()
{
if (m_state == TS_JOINABLE)
{
m_thr.detach();
if (m_autojoin)
{
m_thr.join();
}
else
{
m_thr.detach();
}
}
}
@ -717,6 +740,9 @@ void waiter_map_t::notify(u64 signal_id)
}
}
static const std::function<bool()> SQUEUE_ALWAYS_EXIT = [](){ return true; };
static const std::function<bool()> SQUEUE_NEVER_EXIT = [](){ return false; };
bool squeue_test_exit()
{
return Emu.IsStopped();

View file

@ -65,8 +65,10 @@ class thread_t
std::atomic<thread_state_t> m_state;
std::string m_name;
std::thread m_thr;
bool m_autojoin;
public:
thread_t(const std::string& name, bool autojoin, std::function<void()> func);
thread_t(const std::string& name, std::function<void()> func);
thread_t(const std::string& name);
thread_t();
@ -162,6 +164,9 @@ public:
void notify(u64 signal_id);
};
extern const std::function<bool()> SQUEUE_ALWAYS_EXIT;
extern const std::function<bool()> SQUEUE_NEVER_EXIT;
bool squeue_test_exit();
template<typename T, u32 sq_size = 256>
@ -266,14 +271,14 @@ public:
return push(data, [do_exit](){ return do_exit && *do_exit; });
}
bool push(const T& data)
__forceinline bool push(const T& data)
{
return push(data, [](){ return false; });
return push(data, SQUEUE_NEVER_EXIT);
}
bool try_push(const T& data)
__forceinline bool try_push(const T& data)
{
return push(data, [](){ return true; });
return push(data, SQUEUE_ALWAYS_EXIT);
}
bool pop(T& data, const std::function<bool()>& test_exit)
@ -334,14 +339,14 @@ public:
return pop(data, [do_exit](){ return do_exit && *do_exit; });
}
bool pop(T& data)
__forceinline bool pop(T& data)
{
return pop(data, [](){ return false; });
return pop(data, SQUEUE_NEVER_EXIT);
}
bool try_pop(T& data)
__forceinline bool try_pop(T& data)
{
return pop(data, [](){ return true; });
return pop(data, SQUEUE_ALWAYS_EXIT);
}
bool peek(T& data, u32 start_pos, const std::function<bool()>& test_exit)
@ -362,7 +367,7 @@ public:
{
return SQSVR_LOCKED;
}
sync.pop_lock = 1;
pos = sync.position + start_pos;
return SQSVR_OK;
@ -396,14 +401,14 @@ public:
return peek(data, start_pos, [do_exit](){ return do_exit && *do_exit; });
}
bool peek(T& data, u32 start_pos = 0)
__forceinline bool peek(T& data, u32 start_pos = 0)
{
return peek(data, start_pos, [](){ return false; });
return peek(data, start_pos, SQUEUE_NEVER_EXIT);
}
bool try_peek(T& data, u32 start_pos = 0)
__forceinline bool try_peek(T& data, u32 start_pos = 0)
{
return peek(data, start_pos, [](){ return true; });
return peek(data, start_pos, SQUEUE_ALWAYS_EXIT);
}
class squeue_data_t