Changeset 25350
- Timestamp:
- 05/07/08 10:42:10 (1 week ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
haiku/trunk/src/tests/system/libroot/posix/realtime_sem_test1.cpp
r25347 r25350 12 12 #include <unistd.h> 13 13 #include <semaphore.h> 14 #include <sys/mman.h> 14 15 #include <sys/stat.h> 15 16 #include <sys/time.h> … … 125 126 126 127 static void 128 test_set(const char* testSet) 129 { 130 printf("\nTEST SET: %s\n", testSet); 131 } 132 133 134 static void 127 135 test_ok(const char* test) 128 136 { … … 139 147 _assert_posix_bool_success(test, result >= 0, lineNumber); 140 148 _assert_equals(test, child, result, lineNumber); 141 } 142 143 144 #define TEST(test) test_ok(currentTest); currentTest = (test); 149 _assert_equals(test, 0, status, lineNumber); 150 } 151 152 153 #if 0 154 static void 155 dump_sem(const char* name, sem_t* sem) 156 { 157 printf("%s, %p: ", name, sem); 158 for (size_t i = 0; i < sizeof(sem_t); i++) 159 printf("%02x", ((char*)sem)[i]); 160 printf("\n"); 161 } 162 #endif 163 164 165 #define TEST_SET(testSet) test_set(testSet) 166 #define TEST(test) test_ok(currentTest); currentTest = (test) 145 167 146 168 #define assert_equals(expected, actual) \ … … 176 198 test_open_close_unlink() 177 199 { 200 TEST_SET("sem_{open,close,unlink}()"); 201 178 202 const char* currentTest = NULL; 179 203 … … 258 282 test_init_destroy() 259 283 { 284 TEST_SET("sem_{init,destroy}()"); 285 260 286 const char* currentTest = NULL; 261 287 … … 293 319 test_open_close_fork() 294 320 { 321 TEST_SET("sem_{open,close}() with fork()"); 322 295 323 const char* currentTest = NULL; 296 324 … … 337 365 test_init_destroy_fork() 338 366 { 367 TEST_SET("sem_{init,destroy}() with fork()"); 368 339 369 const char* currentTest = NULL; 340 370 … … 366 396 test_post_wait_named() 367 397 { 398 TEST_SET("sem_{post,wait,trywait,timedwait}() named semaphore"); 399 368 400 const char* currentTest = NULL; 369 401 … … 514 546 test_post_wait_unnamed() 515 547 { 548 TEST_SET("sem_{post,wait,trywait,timedwait}() unnamed semaphore"); 549 516 550 const char* currentTest = NULL; 517 551 … … 647 681 test_post_wait_named_fork() 648 682 { 683 TEST_SET("sem_{post,wait,trywait,timedwait}() named semaphore with fork()"); 684 649 685 const char* currentTest = NULL; 650 686 … … 770 806 test_post_wait_named_fork2() 771 807 { 808 TEST_SET("sem_{post,wait,trywait,timedwait}() named semaphore open after " 809 "fork"); 810 772 811 const char* currentTest = NULL; 773 812 … … 899 938 900 939 901 #ifdef __HAIKU__902 903 940 static void 904 941 test_post_wait_unnamed_fork() 905 942 { 943 TEST_SET("sem_{post,wait,trywait,timedwait}() unnamed semaphore with " 944 "fork()"); 945 906 946 const char* currentTest = NULL; 907 947 … … 909 949 TEST("sem_init()"); 910 950 sem_t _sem; 911 assert_posix_success(sem_init(&_sem, 1, 0));951 assert_posix_success(sem_init(&_sem, 1, 1)); 912 952 sem_t* sem = &_sem; 953 954 TEST("sem_getvalue()"); 955 int value; 956 assert_posix_success(sem_getvalue(sem, &value)); 957 assert_equals(1, value); 958 959 TEST("sem_wait() on fork()ed unnamed sem in parent and child"); 960 pid_t child = fork(); 961 assert_posix_bool_success(child >= 0); 962 963 if (child == 0) { 964 // child 965 sleep(1); 966 assert_posix_success(sem_wait(sem)); 967 968 assert_posix_success(sem_getvalue(sem, &value)); 969 assert_equals(0, value); 970 971 exit(0); 972 } else { 973 // parent 974 assert_posix_success(sem_wait(sem)); 975 assert_posix_success(sem_getvalue(sem, &value)); 976 assert_equals(0, value); 977 978 wait_for_child(child); 979 } 980 981 TEST("sem_getvalue()"); 982 assert_posix_success(sem_getvalue(sem, &value)); 983 assert_equals(0, value); 984 985 TEST("sem_post() on fork()ed unnamed sem in parent and child"); 986 child = fork(); 987 assert_posix_bool_success(child >= 0); 988 989 if (child == 0) { 990 // child 991 assert_posix_success(sem_post(sem)); 992 993 assert_posix_success(sem_getvalue(sem, &value)); 994 assert_equals(1, value); 995 996 exit(0); 997 } else { 998 // parent 999 assert_posix_success(sem_post(sem)); 1000 assert_posix_success(sem_getvalue(sem, &value)); 1001 assert_equals(1, value); 1002 1003 wait_for_child(child); 1004 } 1005 1006 TEST("sem_getvalue()"); 1007 assert_posix_success(sem_getvalue(sem, &value)); 1008 assert_equals(1, value); 1009 1010 // destroy 1011 TEST("sem_destroy()"); 1012 assert_posix_success(sem_destroy(sem)); 1013 1014 TEST("done"); 1015 } 1016 1017 1018 static void 1019 test_post_wait_unnamed_fork_shared() 1020 { 1021 TEST_SET("sem_{post,wait,trywait,timedwait}() unnamed semaphore with " 1022 "fork() in shared memory"); 1023 1024 const char* currentTest = NULL; 1025 1026 // create shared memory area 1027 void* address = mmap(NULL, 4096, PROT_READ | PROT_WRITE, 1028 MAP_SHARED | MAP_ANON, -1, 0); 1029 assert_posix_bool_success(address != MAP_FAILED); 1030 1031 // init 1032 TEST("sem_init()"); 1033 sem_t* sem = (sem_t*)address; 1034 assert_posix_success(sem_init(sem, 1, 0)); 913 1035 914 1036 TEST("sem_getvalue()"); … … 1018 1140 assert_posix_success(sem_destroy(sem)); 1019 1141 1142 // unmap memory 1143 assert_posix_success(munmap(address, 4096)); 1144 1020 1145 TEST("done"); 1021 1146 } 1022 1023 #endif // __HAIKU__1024 1147 1025 1148 … … 1035 1158 test_post_wait_named_fork(); 1036 1159 test_post_wait_named_fork2(); 1037 #ifdef __HAIKU__1038 1160 test_post_wait_unnamed_fork(); 1039 // TODO: Check whether Linux and Solaris actually create an 1040 // independent clone of an unnamed semaphore on fork(). Check what happens when 1041 // putting the semaphore in anonymously mmap()ed memory. 1042 #endif 1043 } 1161 test_post_wait_unnamed_fork_shared(); 1162 1163 printf("\nall tests OK\n"); 1164 }
