aboutsummaryrefslogtreecommitdiff
path: root/engines/tony/sched.h
diff options
context:
space:
mode:
authorPaul Gilbert2012-05-08 08:25:33 +1000
committerPaul Gilbert2012-05-08 08:25:33 +1000
commit8527302057052e784c3ea32ca8eebb0220bf15e6 (patch)
tree6de91ecaacd51a1182bd44f21c94edfac4daa4b1 /engines/tony/sched.h
parent0b8974ec4ab37ef056ac50c098d3fe8045ec172b (diff)
downloadscummvm-rg350-8527302057052e784c3ea32ca8eebb0220bf15e6.tar.gz
scummvm-rg350-8527302057052e784c3ea32ca8eebb0220bf15e6.tar.bz2
scummvm-rg350-8527302057052e784c3ea32ca8eebb0220bf15e6.zip
TONY: Added support for threading events to scheduler, converted more procs to coroutines
Diffstat (limited to 'engines/tony/sched.h')
-rw-r--r--engines/tony/sched.h25
1 files changed, 21 insertions, 4 deletions
diff --git a/engines/tony/sched.h b/engines/tony/sched.h
index 54f44aa5fd..80df1eb942 100644
--- a/engines/tony/sched.h
+++ b/engines/tony/sched.h
@@ -24,6 +24,7 @@
#ifndef TONY_SCHED_H
#define TONY_SCHED_H
+#include "common/list.h"
#include "tony/coroutine.h"
namespace Tony {
@@ -48,13 +49,20 @@ struct PROCESS {
CORO_ADDR coroAddr; ///< the entry point of the coroutine
int sleepTime; ///< number of scheduler cycles to sleep
- int pid; ///< process ID
+ uint32 pid; ///< process ID
char param[PARAM_SIZE]; ///< process specific info
};
typedef PROCESS *PPROCESS;
struct INT_CONTEXT;
+/** Event structure */
+struct EVENT {
+ uint32 pid;
+ bool manualReset;
+ bool signalled;
+};
+
/**
* Create and manage "processes" (really coroutines).
*/
@@ -80,6 +88,8 @@ private:
/** Auto-incrementing process Id */
int pidCounter;
+ /** Event list */
+ Common::List<EVENT *> _events;
#ifdef DEBUG
// diagnostic process counters
@@ -95,7 +105,8 @@ private:
*/
VFPTRPP pRCfunction;
-
+ PROCESS *getProcess(uint32 pid);
+ EVENT *getEvent(uint32 pid);
public:
Scheduler();
@@ -111,7 +122,9 @@ public:
void rescheduleAll();
void reschedule(PPROCESS pReSchedProc = NULL);
void giveWay(PPROCESS pReSchedProc = NULL);
- void waitForSingleObject(CORO_PARAM, int pid, int duration, bool *delay = NULL);
+ void waitForSingleObject(CORO_PARAM, int pid, uint32 duration, bool *expired = NULL);
+ void waitForMultipleObjects(CORO_PARAM, int nCount, uint32 *pidList, bool bWaitAll,
+ uint32 duration, bool *expired = NULL);
uint32 createProcess(CORO_ADDR coroAddr, const void *pParam, int sizeParam);
uint32 createProcess(CORO_ADDR coroAddr, const void *pParam) {
@@ -123,9 +136,13 @@ public:
int getCurrentPID() const;
int killMatchingProcess(int pidKill, int pidMask = -1);
-
void setResourceCallback(VFPTRPP pFunc);
+ /* Event methods */
+ uint32 createEvent(bool bManualReset, bool bInitialState);
+ void closeEvent(uint32 pidEvent);
+ void setEvent(uint32 pidEvent);
+ void resetEvent(uint32 pidEvent);
};
extern Scheduler *g_scheduler; // FIXME: Temporary global var, to be used until everything has been OOifyied