#pragma once

class SyncEvent;

class SynchronousEventManager
{
public:
	SynchronousEventManager() : m_syncEventHead(NULL)
	{}
	~SynchronousEventManager(){}

	SyncEvent* GetHead(void) { return m_syncEventHead; }
	void SetHead(SyncEvent* head) { m_syncEventHead = head; }

	void Insert(SyncEvent* pNewEvent);
	bool Remove(int id);
	void Update(int cycles, ULONG uExecutedCycles);
	void Reset(void) { m_syncEventHead = NULL; }

private:
	SyncEvent* m_syncEventHead;
};

//

typedef int (*syncEventCB)(int id, int cycles, ULONG uExecutedCycles);

class SyncEvent
{
public:
	SyncEvent(int id, int initCycles, syncEventCB callback)
		: m_id(id),
		m_cyclesRemaining(initCycles),
		m_active(false),
		m_canAssertIRQ(true),
		m_callback(callback),
		m_next(NULL)
	{}
	~SyncEvent(){}

	void SetCycles(int cycles)
	{
		m_cyclesRemaining = cycles;
	}

	int m_id;
	int m_cyclesRemaining;
	bool m_active;
	bool m_canAssertIRQ;
	syncEventCB m_callback;
	SyncEvent* m_next;
};
