From 5b40951c05baa28ac43c84ffacfec6bd99692ed3 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Thu, 26 Feb 2015 00:07:12 -0800 Subject: [PATCH] GBA SIO: Build up lockstep driver a bit more --- src/gba/sio/lockstep.c | 19 +++++++++++++++++++ src/gba/sio/lockstep.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/src/gba/sio/lockstep.c b/src/gba/sio/lockstep.c index d7cfa268e..73d6a7b38 100644 --- a/src/gba/sio/lockstep.c +++ b/src/gba/sio/lockstep.c @@ -21,10 +21,12 @@ void GBASIOLockstepInit(struct GBASIOLockstep* lockstep) { lockstep->players[3] = 0; lockstep->attached = 0; ConditionInit(&lockstep->barrier); + MutexInit(&lockstep->mutex); } void GBASIOLockstepDeinit(struct GBASIOLockstep* lockstep) { ConditionDeinit(&lockstep->barrier); + MutexDeinit(&lockstep->mutex); } void GBASIOLockstepNodeCreate(struct GBASIOLockstepNode* node) { @@ -45,6 +47,23 @@ bool GBASIOLockstepAttachNode(struct GBASIOLockstep* lockstep, struct GBASIOLock return true; } +void GBASIOLockstepDetachNode(struct GBASIOLockstep* lockstep, struct GBASIOLockstepNode* node) { + if (lockstep->attached == 0) { + return; + } + int i; + for (i = 0; i < lockstep->attached; ++i) { + if (lockstep->players[i] != node) { + continue; + } + for (++i; i < lockstep->attached; ++i) { + lockstep->players[i - 1] = lockstep->players[i]; + } + --lockstep->attached; + break; + } +} + bool GBASIOLockstepNodeInit(struct GBASIODriver* driver) { UNUSED(driver); return true; diff --git a/src/gba/sio/lockstep.h b/src/gba/sio/lockstep.h index c25025db6..b9ca37ff5 100644 --- a/src/gba/sio/lockstep.h +++ b/src/gba/sio/lockstep.h @@ -15,6 +15,7 @@ struct GBASIOLockstep { int attached; uint16_t data[MAX_GBAS]; + Mutex mutex; Condition barrier; }; @@ -27,6 +28,8 @@ void GBASIOLockstepInit(struct GBASIOLockstep*); void GBASIOLockstepDeinit(struct GBASIOLockstep*); void GBASIOLockstepNodeCreate(struct GBASIOLockstepNode*); + bool GBASIOLockstepAttachNode(struct GBASIOLockstep*, struct GBASIOLockstepNode*); +void GBASIOLockstepDetachNode(struct GBASIOLockstep*, struct GBASIOLockstepNode*); #endif