this repo has no description
1
fork

Configure Feed

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

Add sys_semwait_signal() enabling sleep() to work

+70
+1
src/kernel/emulation/linux/CMakeLists.txt
··· 87 87 stat/mkdir.c 88 88 stat/rmdir.c 89 89 stat/common.c 90 + synch/semwait_signal.c 90 91 dirent/getdirentries.c 91 92 time/gettimeofday.c 92 93 time/utimes.c
+59
src/kernel/emulation/linux/synch/semwait_signal.c
··· 1 + #include "semwait_signal.h" 2 + #include "../base.h" 3 + #include "../../../../../platform-include/sys/errno.h" 4 + #include "../time/gettimeofday.h" 5 + #include <asm/unistd.h> 6 + #include <stddef.h> 7 + 8 + typedef int kern_return_t; 9 + extern kern_return_t semaphore_timedwait_signal_trap(int cond_sem, int mutex_sem, unsigned int tv_sec, unsigned int tv_nsec); 10 + extern kern_return_t semaphore_timedwait_trap(int cond_sem, unsigned int tv_sec, unsigned int tv_nsec); 11 + extern kern_return_t semaphore_wait_signal_trap(int cond_sem, int mutex_sem); 12 + extern kern_return_t semaphore_wait_trap(int cond_sem); 13 + 14 + #define KERN_SUCCESS 0 15 + #define KERN_ABORTED 14 16 + 17 + long sys_semwait_signal(int cond_sem, int mutex_sem, int timeout, int relative, int64_t tv_sec, int32_t tv_nsec) 18 + { 19 + kern_return_t kr; 20 + 21 + if (timeout) 22 + { 23 + if (!relative) 24 + { 25 + struct bsd_timeval tv; 26 + sys_gettimeofday(&tv, NULL); 27 + 28 + if (tv.tv_usec*1000 < tv_nsec) 29 + tv_nsec -= tv.tv_usec * 1000; 30 + else 31 + { 32 + tv_nsec = 1000000000ull + tv_nsec - (tv.tv_usec * 1000); 33 + tv_sec--; 34 + } 35 + tv_sec -= tv.tv_sec; 36 + 37 + } 38 + 39 + if (mutex_sem != 0) 40 + kr = semaphore_timedwait_signal_trap(cond_sem, mutex_sem, tv_sec, tv_nsec); 41 + else 42 + kr = semaphore_timedwait_trap(cond_sem, tv_sec, tv_nsec); 43 + } 44 + else 45 + { 46 + if (mutex_sem != 0) 47 + kr = semaphore_wait_signal_trap(cond_sem, mutex_sem); 48 + else 49 + kr = semaphore_wait_trap(cond_sem); 50 + } 51 + 52 + if (kr == KERN_ABORTED) 53 + return -EINTR; 54 + else if (kr != KERN_SUCCESS) 55 + return -EINVAL; 56 + 57 + return 0; 58 + } 59 +
+8
src/kernel/emulation/linux/synch/semwait_signal.h
··· 1 + #ifndef LINUX_SEMWAIT_SIGNAL_H 2 + #define LINUX_SEMWAIT_SIGNAL_H 3 + #include <stdint.h> 4 + 5 + long sys_semwait_signal(int cond_sem, int mutex_sem, int timeout, int relative, int64_t tv_sec, int32_t tv_nsec); 6 + 7 + #endif 8 +
+2
src/kernel/emulation/linux/syscalls.c
··· 52 52 #include "misc/thread_selfid.h" 53 53 #include "misc/sysctl.h" 54 54 #include "misc/gethostuuid.h" 55 + #include "synch/semwait_signal.h" 55 56 #include "fcntl/open.h" 56 57 #include "fcntl/fcntl.h" 57 58 #include "network/socket.h" ··· 155 156 [199] = sys_lseek, 156 157 [201] = sys_ftruncate, 157 158 [202] = sys_sysctl, 159 + [334] = sys_semwait_signal, 158 160 [338] = sys_stat64, 159 161 [339] = sys_fstat64, 160 162 [340] = sys_lstat64,