|  | // RUN: %libomp-compile-and-run | 
|  | #include "omp_testsuite.h" | 
|  | #include <stdio.h> | 
|  |  | 
|  | // This should be slightly less than KMP_I_LOCK_CHUNK, which is 1024 | 
|  | #define LOCKS_PER_ITER 1000 | 
|  | #define ITERATIONS (REPETITIONS + 1) | 
|  |  | 
|  | // This tests concurrently using locks on one thread while initializing new | 
|  | // ones on another thread.  This exercises the global lock pool. | 
|  | int test_omp_init_lock() { | 
|  | int i; | 
|  | omp_lock_t lcks[ITERATIONS * LOCKS_PER_ITER]; | 
|  | #pragma omp parallel for schedule(static) num_threads(NUM_TASKS) | 
|  | for (i = 0; i < ITERATIONS; i++) { | 
|  | int j; | 
|  | omp_lock_t *my_lcks = &lcks[i * LOCKS_PER_ITER]; | 
|  | for (j = 0; j < LOCKS_PER_ITER; j++) { | 
|  | omp_init_lock(&my_lcks[j]); | 
|  | } | 
|  | for (j = 0; j < LOCKS_PER_ITER * 100; j++) { | 
|  | omp_set_lock(&my_lcks[j % LOCKS_PER_ITER]); | 
|  | omp_unset_lock(&my_lcks[j % LOCKS_PER_ITER]); | 
|  | } | 
|  | } | 
|  | // Wait until all repititions are done.  The test is exercising growth of | 
|  | // the global lock pool, which does not shrink when no locks are allocated. | 
|  | { | 
|  | int j; | 
|  | for (j = 0; j < ITERATIONS * LOCKS_PER_ITER; j++) { | 
|  | omp_destroy_lock(&lcks[j]); | 
|  | } | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int main() { | 
|  | // No use repeating this test, since it's exercising a private global pool | 
|  | // which is not reset between test iterations. | 
|  | return test_omp_init_lock(); | 
|  | } |