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