1c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee/**************************************************************************
2c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *
3c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * Copyright 2009-2010 VMware, Inc.
4c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * All Rights Reserved.
5c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *
6c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * Permission is hereby granted, free of charge, to any person obtaining a
7c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * copy of this software and associated documentation files (the
8c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * "Software"), to deal in the Software without restriction, including
9c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * without limitation the rights to use, copy, modify, merge, publish,
10c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * distribute, sub license, and/or sell copies of the Software, and to
11c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * permit persons to whom the Software is furnished to do so, subject to
12c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * the following conditions:
13c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *
14c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * The above copyright notice and this permission notice (including the
15c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * next paragraph) shall be included in all copies or substantial portions
16c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * of the Software.
17c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *
18c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *
26c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee **************************************************************************/
27c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
28c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
29c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee/*
30c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *  Test case for pipe_barrier.
31c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *
32c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *  The test succeeds if no thread exits before all the other threads reach
33c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee *  the barrier.
34c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee */
35c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
36c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
37c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee#include <stdio.h>
38c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
39c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee#include "os/os_thread.h"
40c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee#include "os/os_time.h"
41c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
42c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
43c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee#define NUM_THREADS 10
44c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
45c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Leestatic pipe_thread threads[NUM_THREADS];
46c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Leestatic pipe_barrier barrier;
47c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Leestatic int thread_ids[NUM_THREADS];
48c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
49c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
50c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Leestatic PIPE_THREAD_ROUTINE(thread_function, thread_data)
51c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee{
52c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   int thread_id = *((int *) thread_data);
53c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
54c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   printf("thread %d starting\n", thread_id);
55c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   os_time_sleep(thread_id * 1000 * 1000);
56c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   printf("thread %d before barrier\n", thread_id);
57c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   pipe_barrier_wait(&barrier);
58c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   printf("thread %d exiting\n", thread_id);
59c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
60c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   return NULL;
61c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee}
62c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
63c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
64c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Leeint main()
65c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee{
66c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   int i;
67c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
68c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   printf("pipe_barrier_test starting\n");
69c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
70c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   pipe_barrier_init(&barrier, NUM_THREADS);
71c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
72c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   for (i = 0; i < NUM_THREADS; i++) {
73c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee      thread_ids[i] = i;
74c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee      threads[i] = pipe_thread_create(thread_function, (void *) &thread_ids[i]);
75c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   }
76c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
77c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   for (i = 0; i < NUM_THREADS; i++ ) {
78c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee      pipe_thread_wait(threads[i]);
79c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   }
80c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
81c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   pipe_barrier_destroy(&barrier);
82c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
83c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   printf("pipe_barrier_test exiting\n");
84c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee
85c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee   return 0;
86c8efed89ba740fe06a8207ae17520a4db38c96a7Vinson Lee}
87