// SDK location: /user/pspthreadman.h:515 // SDK declaration: SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option); public int sceKernelCreateSema(int name, int attr, int initVal, int maxVal, int option) { string sname = _kernel.ReadString(( uint )name); KSemaphore sema = new KSemaphore(_kernel, sname, ( uint )attr, initVal, maxVal); _kernel.AddHandle(sema); return(( int )sema.UID); }
// SDK location: /user/pspthreadman.h:539 // SDK declaration: int sceKernelSignalSema(SceUID semaid, int signal); public int sceKernelSignalSema(int semaid, int signal) { KSemaphore sema = _kernel.GetHandleOrNull <KSemaphore>(semaid); if (sema == null) { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceKernelSignalSema: could not find semaphore with ID {0}", semaid); return(-1); } sema.Signal(signal); return(0); }
// SDK location: /user/pspthreadman.h:523 // SDK declaration: int sceKernelDeleteSema(SceUID semaid); public int sceKernelDeleteSema(int semaid) { KSemaphore sema = _kernel.GetHandle <KSemaphore>(semaid); if (sema == null) { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceKernelDeleteSema: could not find semaphore with ID {0}", semaid); return(-1); } // Wake waiting threads??? _kernel.RemoveHandle(sema.UID); return(0); }
// SDK location: /user/pspthreadman.h:581 // SDK declaration: int sceKernelPollSema(SceUID semaid, int signal); public int sceKernelPollSema(int semaid, int signal) { KSemaphore sema = _kernel.GetHandle <KSemaphore>(semaid); if (sema == null) { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceKernelPollSema: could not find semaphore with ID {0}", semaid); return(-1); } // Is this right? if (sema.CurrentCount >= signal) { return(0); } else { return(unchecked (( int )KThread.SCE_KERNEL_ERROR_WAIT_TIMEOUT)); } }
// SDK location: /user/pspthreadman.h:555 // SDK declaration: int sceKernelWaitSema(SceUID semaid, int signal, SceUInt *timeout); public int sceKernelWaitSema(int semaid, int signal, int timeout) { KSemaphore sema = _kernel.GetHandleOrNull <KSemaphore>(semaid); if (sema == null) { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceKernelWaitSema: could not find semaphore with ID {0}", semaid); return(-1); } uint timeoutUs = 0; unsafe { if (timeout != 0) { timeoutUs = *(( uint * )_memorySystem.Translate(( uint )timeout)); } } sema.Wait(false, signal, timeoutUs); return(0); }
// SDK location: /user/pspthreadman.h:591 // SDK declaration: int sceKernelReferSemaStatus(SceUID semaid, SceKernelSemaInfo *info); public unsafe int sceKernelReferSemaStatus(int semaid, int info) { KSemaphore sema = _kernel.GetHandle <KSemaphore>(semaid); if (sema == null) { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceKernelReferSemaStatus: could not find semaphore with ID {0}", semaid); return(-1); } uint *p = ( uint * )_memorySystem.Translate(( uint )info); Debug.Assert(*p == 56); *(p++) = 56; _kernel.WriteString(( uint )info + 4, sema.Name); p += 8; *(p++) = sema.Attributes; *(p++) = ( uint )sema.InitialCount; *(p++) = ( uint )sema.CurrentCount; *(p++) = ( uint )sema.MaximumCount; *(p++) = ( uint )sema.WaitingThreads.Count; return(0); }