From owner-svn-src-all@FreeBSD.ORG Tue Jan 5 12:34:14 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 091BD1065670; Tue, 5 Jan 2010 12:34:14 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E14DA8FC12; Tue, 5 Jan 2010 12:34:13 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o05CYDN3096997; Tue, 5 Jan 2010 12:34:13 GMT (envelope-from davidxu@svn.freebsd.org) Received: (from davidxu@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o05CYDlR096994; Tue, 5 Jan 2010 12:34:13 GMT (envelope-from davidxu@svn.freebsd.org) Message-Id: <201001051234.o05CYDlR096994@svn.freebsd.org> From: David Xu Date: Tue, 5 Jan 2010 12:34:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r201575 - head/tools/regression/posixsem2 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Jan 2010 12:34:14 -0000 Author: davidxu Date: Tue Jan 5 12:34:13 2010 New Revision: 201575 URL: http://svn.freebsd.org/changeset/base/201575 Log: Add test code for POSIX semaphore implementation. Added: head/tools/regression/posixsem2/ head/tools/regression/posixsem2/Makefile (contents, props changed) head/tools/regression/posixsem2/semtest.c (contents, props changed) Added: head/tools/regression/posixsem2/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/tools/regression/posixsem2/Makefile Tue Jan 5 12:34:13 2010 (r201575) @@ -0,0 +1,9 @@ +# $FreeBSD$ + +PROG= semtest +SRCS= semtest.c +NO_MAN= + +WARNS?= 3 + +.include Added: head/tools/regression/posixsem2/semtest.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/tools/regression/posixsem2/semtest.c Tue Jan 5 12:34:13 2010 (r201575) @@ -0,0 +1,101 @@ +/* $FreeBSD$ */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SEM_NAME "/semtst" + +int test_unnamed(void); +int test_named(void); + +int +test_unnamed(void) +{ + sem_t *s; + pid_t pid; + int status; + + printf("testing unnamed process-shared semaphore\n"); + s = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, + -1, 0); + if (s == MAP_FAILED) + err(1, "mmap failed"); + if (sem_init(s, 1, 0)) + err(2, "sem_init failed"); + if ((pid = fork()) == 0) { + printf("child: sem_wait()\n"); + if (sem_wait(s)) + err(3, "sem_wait failed"); + printf("child: sem_wait() returned\n"); + exit(0); + } else { + sleep(1); + printf("parent: sem_post()\n"); + if (sem_post(s)) + err(4, "sem_post failed"); + waitpid(pid, &status, 0); + if (WIFEXITED(status) && WEXITSTATUS(status) == 0) + printf("OK.\n"); + else + printf("Failure."); + } + return (0); +} + +int +test_named(void) +{ + sem_t *s, *s2; + pid_t pid; + int status; + + printf("testing named process-shared semaphore\n"); + sem_unlink(SEM_NAME); + s = sem_open(SEM_NAME, O_CREAT, 0777); + if (s == SEM_FAILED) + err(1, "sem_open failed"); + s2 = sem_open(SEM_NAME, O_CREAT, 0777); + if (s2 == SEM_FAILED) + err(2, "second sem_open call failed"); + if (s != s2) + err(3, "two sem_open calls for same semaphore do not returm same address."); + if (sem_close(s2)) + err(4, "sem_close failed"); + if ((pid = fork()) == 0) { + printf("child: sem_wait()\n"); + if (sem_wait(s)) + err(5, "sem_wait failed"); + printf("child: sem_wait() returned\n"); + exit(0); + } else { + sleep(1); + printf("parent: sem_post()\n"); + if (sem_post(s)) + err(6, "sem_post failed"); + waitpid(pid, &status, 0); + if (WIFEXITED(status) && WEXITSTATUS(status) == 0) + printf("OK.\n"); + else + printf("Failure."); + } + + if (sem_close(s)) + err(7, "sem_close failed"); + + return (0); +} + +int +main(void) +{ + test_unnamed(); + test_named(); + return (0); +}