this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Semaphores implementation

+101
+72
libmac/kernel-mach/semaphore.cpp
··· 1 + #include "semaphore.h" 2 + 3 + kern_return_t semaphore_create(task_t task, semaphore_t *semaphore, int policy, int value) 4 + { 5 + CHECK_TASK_SELF(task); 6 + 7 + if (!semaphore) 8 + return KERN_INVALID_ARGUMENT; 9 + 10 + *semaphore = new semaphore; 11 + if (!*semaphore) 12 + return KERN_RESOURCE_SHORTAGE; 13 + 14 + if (::sem_init(&(*semaphore)->sem, 0, value) == -1) 15 + { 16 + if (errno == EINVAL) 17 + return KERN_INVALID_ARGUMENT; 18 + else if (errno == ENOMEM) 19 + return KERN_RESOURCE_SHORTAGE; 20 + else 21 + return KERN_FAILURE; 22 + } 23 + return KERN_SUCCESS; 24 + } 25 + 26 + kern_return_t semaphore_destroy(task_t task, semaphore_t semaphore) 27 + { 28 + CHECK_TASK_SELF(task); 29 + 30 + if (!semaphore) 31 + return KERN_INVALID_ARGUMENT; 32 + 33 + if (::sem_destroy(&semaphore->sem) == -1) 34 + return KERN_INVALID_ARGUMENT; 35 + 36 + delete semaphore; 37 + return KERN_SUCCESS; 38 + } 39 + 40 + kern_return_t semaphore_signal(semaphore_t semaphore) 41 + { 42 + if (!semaphore) 43 + return KERN_INVALID_ARGUMENT; 44 + 45 + if (::sem_post(&semaphore->sem) == -1) 46 + return KERN_INVALID_ARGUMENT; 47 + 48 + return KERN_SUCCESS; 49 + } 50 + 51 + kern_return_t semaphore_signal_all(semaphore_t semaphore) 52 + { 53 + MACH_STUB(); 54 + } 55 + 56 + kern_return_t semaphore_wait(semaphore_t semaphore) 57 + { 58 + if (!semaphore) 59 + return KERN_INVALID_ARGUMENT; 60 + 61 + if (::sem_wait(&semaphore->sem) == -1) 62 + { 63 + if (errno == EINVAL) 64 + return KERN_INVALID_ARGUMENT; 65 + else if (errno == EDEADLK) 66 + return KERN_OPERATION_TIMED_OUT; // the closest we can get 67 + else 68 + return KERN_FAILURE; 69 + } 70 + return KERN_SUCCESS; 71 + } 72 +
+29
libmac/kernel-mach/semaphore.h
··· 1 + #ifndef SEMAPHORE_H 2 + #define SEMAPHORE_H 3 + #include "task.h" 4 + #include <semaphore.h> 5 + 6 + struct semaphore 7 + { 8 + sem_t sem; 9 + }; 10 + 11 + typedef semaphore* temaphore_t; 12 + 13 + extern "C" 14 + { 15 + 16 + kern_return_t semaphore_create(task_t task, semaphore_t *semaphore, int policy, int value); 17 + 18 + kern_return_t semaphore_destroy(task_t task, semaphore_t semaphore); 19 + 20 + kern_return_t semaphore_signal(semaphore_t semaphore); 21 + 22 + kern_return_t semaphore_signal_all(semaphore_t semaphore); 23 + 24 + kern_return_t semaphore_wait(semaphore_t semaphore); 25 + 26 + } 27 + 28 + #endif 29 +