00001 00006 #include <PalmOS.h> 00007 #include <StringMgr.h> 00008 #include <globals.h> 00009 #include <locking.h> 00010 #include <mem_compat.h> 00011 00013 static struct tag_lockers { 00014 MemHandle handle; 00015 int lockcount; 00016 void **destVar; 00017 } lockZones[lz_end] = { 00018 { NULL, 0, &worldPtr }, 00019 { NULL, 0, &flagPtr }, 00020 { NULL, 0, &growablePtr } 00021 }; 00022 00023 void 00024 LockZone(lockZone zone) 00025 { 00026 struct tag_lockers *lock = lockZones + zone; 00027 00028 lock->lockcount += 1; 00029 if (lock->lockcount == 1) { 00030 if (lock->handle) { 00031 MemPtr mp = MemHandleLock(lock->handle); 00032 *(lock->destVar) = mp; 00033 } 00034 lock->handle = NULL; 00035 } 00036 } 00037 00038 void 00039 ReleaseZone(lockZone zone) 00040 { 00041 struct tag_lockers *lock = lockZones + zone; 00042 00043 LockZone(zone); 00044 if (*lock->destVar != NULL) { 00045 MemPtrFree(*lock->destVar); 00046 } 00047 lock->handle = NULL; 00048 lock->destVar = NULL; 00049 lock->lockcount = 0; 00050 } 00051 00052 void 00053 UnlockZone(lockZone zone) 00054 { 00055 struct tag_lockers *lock = lockZones + zone; 00056 MemPtr mp = *lock->destVar; 00057 00058 if (mp != NULL) { 00059 lock->handle = MemPtrRecoverHandle(mp); 00060 } 00061 lock->lockcount -= 1; 00062 if (lock->lockcount == 0) { 00063 if (mp != NULL) 00064 MemHandleUnlock(lock->handle); 00065 *lock->destVar = NULL; 00066 } 00067 00068 ErrFatalDisplayIf(lock->lockcount < 0, 00069 "Too many unlock calls"); 00070 } 00071