| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /*
- * Copyright (C) 2023 Intel Corporation. All rights reserved.
- * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- */
- #include <stdio.h>
- #include <pthread.h>
- #include <stdbool.h>
- // Peterson's algorithm for mutual exclusion
- #define ITERATIONS 15000000
- typedef struct {
- bool flag[2];
- int turn;
- } peterson_lock_t;
- static int counter = 0;
- static peterson_lock_t lock;
- void
- peterson_lock_acquire(peterson_lock_t *lock, int thread_id);
- void
- peterson_lock_release(peterson_lock_t *lock, int thread_id)
- {
- lock->flag[thread_id] = false;
- }
- void *
- test_peterson_lock_atomicity(void *arg)
- {
- int thread_id = (int)(long)arg;
- for (int i = 0; i < ITERATIONS; ++i) {
- peterson_lock_acquire(&lock, thread_id);
- counter++;
- peterson_lock_release(&lock, thread_id);
- }
- return NULL;
- }
- int
- run_test(pthread_t *thread1_ptr, pthread_t *thread2_ptr,
- void *(*start_routine)(void *))
- {
- lock.flag[0] = false;
- lock.flag[1] = false;
- lock.turn = 0;
- counter = 0;
- pthread_create(thread1_ptr, NULL, start_routine, (void *)0);
- pthread_create(thread2_ptr, NULL, start_routine, (void *)1);
- pthread_join(*thread1_ptr, NULL);
- pthread_join(*thread2_ptr, NULL);
- printf("Expected counter value: %d\n", ITERATIONS * 2);
- printf("Actual counter value: %d\n", counter);
- if (counter != ITERATIONS * 2)
- __builtin_trap();
- return 0;
- }
|