GBA SIO: Build up lockstep driver a bit more
Jeffrey Pfau jeffrey@endrift.com
Thu, 26 Feb 2015 00:07:12 -0800
2 files changed,
22 insertions(+),
0 deletions(-)
M
src/gba/sio/lockstep.c
→
src/gba/sio/lockstep.c
@@ -21,10 +21,12 @@ lockstep->players[2] = 0;
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) {@@ -43,6 +45,23 @@ }
lockstep->players[lockstep->attached] = node; ++lockstep->attached; 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) {
M
src/gba/sio/lockstep.h
→
src/gba/sio/lockstep.h
@@ -15,6 +15,7 @@ struct GBASIOLockstepNode* players[MAX_GBAS];
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