svn commit: r201575 - head/tools/regression/posixsem2

Garrett Cooper yanefbsd at gmail.com
Tue Jan 5 17:13:21 UTC 2010


Sent from my iPhone

On Jan 5, 2010, at 5:34 AM, David Xu <davidxu at FreeBSD.org> wrote:

> 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 <bsd.prog.mk>
>
> 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 <sys/types.h>
> +#include <sys/wait.h>
> +#include <sys/mman.h>
> +#include <semaphore.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <err.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +
> +#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);

Same as below...

> +        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);

waitpid can fail and the status reported could be completely bogus.  
Maybe this should be the first branch condition (check for == 0) in  
the if-statement below?

> +        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);
> +}


More information about the svn-src-all mailing list