mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-30 21:02:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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;
 | |
| } | 
