rpcsx/rpcs3/Emu/Cell/lv2/sys_timer.h

58 lines
1.3 KiB
C
Raw Normal View History

#pragma once
#include "sys_event.h"
#include "Utilities/Thread.h"
#include "Emu/Memory/vm_ptr.h"
2015-03-08 16:25:31 +01:00
// Timer State
enum : u32
{
2015-03-08 16:25:31 +01:00
SYS_TIMER_STATE_STOP = 0,
SYS_TIMER_STATE_RUN = 1,
};
struct sys_timer_information_t
{
2017-02-04 15:00:02 +01:00
be_t<s64> next_expire;
2015-03-08 16:25:31 +01:00
be_t<u64> period;
be_t<u32> timer_state;
be_t<u32> pad;
};
struct lv2_timer_context : lv2_obj
{
2017-01-25 18:50:30 +01:00
static const u32 id_base = 0x11000000;
void operator()();
void on_abort();
2015-11-26 09:06:29 +01:00
shared_mutex mutex;
2017-07-22 01:03:27 +02:00
atomic_t<u32> state{SYS_TIMER_STATE_STOP};
2015-11-26 09:06:29 +01:00
2017-02-04 15:00:02 +01:00
std::weak_ptr<lv2_event_queue> port;
u64 source;
u64 data1;
u64 data2;
2018-02-09 15:49:37 +01:00
2017-02-04 15:00:02 +01:00
atomic_t<u64> expire{0}; // Next expiration time
atomic_t<u64> period{0}; // Period (oneshot if 0)
};
using lv2_timer = named_thread<lv2_timer_context>;
2017-02-05 13:48:11 +01:00
class ppu_thread;
2017-02-04 15:00:02 +01:00
// Syscalls
2018-02-09 15:49:37 +01:00
error_code sys_timer_create(vm::ptr<u32> timer_id);
2017-02-04 15:00:02 +01:00
error_code sys_timer_destroy(u32 timer_id);
2018-02-09 15:49:37 +01:00
error_code sys_timer_get_information(u32 timer_id, vm::ptr<sys_timer_information_t> info);
2017-02-04 15:00:02 +01:00
error_code _sys_timer_start(u32 timer_id, u64 basetime, u64 period); // basetime type changed from s64
error_code sys_timer_stop(u32 timer_id);
error_code sys_timer_connect_event_queue(u32 timer_id, u32 queue_id, u64 name, u64 data1, u64 data2);
error_code sys_timer_disconnect_event_queue(u32 timer_id);
2017-02-05 13:48:11 +01:00
error_code sys_timer_sleep(ppu_thread&, u32 sleep_time);
error_code sys_timer_usleep(ppu_thread&, u64 sleep_time);