semtest.c revision 201715
1139825Simp/* $FreeBSD: head/tools/regression/posixsem2/semtest.c 201715 2010-01-07 04:15:49Z davidxu $ */ 299657Sbenno 378342Sbenno#include <sys/types.h> 478342Sbenno#include <sys/wait.h> 578342Sbenno#include <sys/mman.h> 678342Sbenno#include <semaphore.h> 778342Sbenno#include <stdio.h> 878342Sbenno#include <stdlib.h> 999657Sbenno#include <err.h> 1099657Sbenno#include <fcntl.h> 1199657Sbenno#include <unistd.h> 1299657Sbenno 1378342Sbenno#define SEM_NAME "/semtst" 1499657Sbenno 1599657Sbennoint test_unnamed(void); 1699657Sbennoint test_named(void); 1799657Sbenno 1899657Sbennoint 1999657Sbennotest_unnamed(void) 2099657Sbenno{ 2199657Sbenno sem_t *s; 2299657Sbenno pid_t pid; 2399657Sbenno int status; 2499657Sbenno 2578342Sbenno printf("testing unnamed process-shared semaphore\n"); 2678342Sbenno s = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, 27209812Snwhitehorn -1, 0); 28209812Snwhitehorn if (s == MAP_FAILED) 29209812Snwhitehorn err(1, "mmap failed"); 30209812Snwhitehorn if (sem_init(s, 1, 0)) 31113038Sobrien err(2, "sem_init failed"); 32113038Sobrien if ((pid = fork()) == 0) { 3378342Sbenno printf("child: sem_wait()\n"); 3499657Sbenno if (sem_wait(s)) 3599657Sbenno err(3, "sem_wait failed"); 3699657Sbenno printf("child: sem_wait() returned\n"); 3799657Sbenno exit(0); 3899657Sbenno } else { 39209812Snwhitehorn sleep(1); 40209812Snwhitehorn printf("parent: sem_post()\n"); 4199657Sbenno if (sem_post(s)) 4299657Sbenno err(4, "sem_post failed"); 43246713Skib waitpid(pid, &status, 0); 4499657Sbenno if (WIFEXITED(status) && WEXITSTATUS(status) == 0) 45246713Skib printf("OK.\n"); 46108939Sgrehan else 4799657Sbenno printf("Failure."); 4899657Sbenno } 49239008Sjhb return (0); 50239008Sjhb} 5199657Sbenno 52108939Sgrehanint 5399657Sbennotest_named(void) 54112436Smux{ 5599657Sbenno sem_t *s, *s2; 56229967Snwhitehorn pid_t pid; 57209812Snwhitehorn int status; 5899657Sbenno 59216154Snwhitehorn printf("testing named process-shared semaphore\n"); 60209812Snwhitehorn sem_unlink(SEM_NAME); 61216154Snwhitehorn s = sem_open(SEM_NAME, O_CREAT, 0777, 0); 62216154Snwhitehorn if (s == SEM_FAILED) 63209812Snwhitehorn err(1, "sem_open failed"); 64209812Snwhitehorn s2 = sem_open(SEM_NAME, O_CREAT, 0777, 0); 6599657Sbenno if (s2 == SEM_FAILED) 66209812Snwhitehorn err(2, "second sem_open call failed"); 67209812Snwhitehorn if (s != s2) 68232356Sjhb err(3, "two sem_open calls for same semaphore do not returm same address."); 69209812Snwhitehorn if (sem_close(s2)) 70209812Snwhitehorn err(4, "sem_close failed"); 7199657Sbenno if ((pid = fork()) == 0) { 72209812Snwhitehorn printf("child: sem_wait()\n"); 73209812Snwhitehorn if (sem_wait(s)) 74209812Snwhitehorn err(5, "sem_wait failed"); 75209812Snwhitehorn printf("child: sem_wait() returned\n"); 76209812Snwhitehorn exit(0); 77209812Snwhitehorn } else { 78209812Snwhitehorn sleep(1); 79117126Sscottl printf("parent: sem_post()\n"); 80117126Sscottl if (sem_post(s)) 81209812Snwhitehorn err(6, "sem_post failed"); 82216154Snwhitehorn waitpid(pid, &status, 0); 83216154Snwhitehorn if (WIFEXITED(status) && WEXITSTATUS(status) == 0) 8499657Sbenno printf("OK.\n"); 8599657Sbenno else 86209812Snwhitehorn printf("Failure."); 87209812Snwhitehorn } 88209812Snwhitehorn 89209812Snwhitehorn if (sem_close(s)) 90246713Skib err(7, "sem_close failed"); 91209812Snwhitehorn 92209812Snwhitehorn return (0); 93209812Snwhitehorn} 94209812Snwhitehorn 95209812Snwhitehornint 96209812Snwhitehornmain(void) 97209812Snwhitehorn{ 98209812Snwhitehorn test_unnamed(); 99209812Snwhitehorn test_named(); 100209812Snwhitehorn return (0); 101209812Snwhitehorn} 102209812Snwhitehorn