| // 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 repetitions 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(); | |
| } |