Add tests for nosv_cond
This commit is contained in:
		
							parent
							
								
									b5fd438ce0
								
							
						
					
					
						commit
						a297adab7a
					
				| @ -22,6 +22,7 @@ test_emu(parallel-tasks.c) | |||||||
| test_emu(nest-to-parallel.c) | test_emu(nest-to-parallel.c) | ||||||
| test_emu(mutex.c) | test_emu(mutex.c) | ||||||
| test_emu(barrier.c) | test_emu(barrier.c) | ||||||
|  | test_emu(cond.c) | ||||||
| 
 | 
 | ||||||
| test_emu(bad-nest-same-task.c SHOULD_FAIL | test_emu(bad-nest-same-task.c SHOULD_FAIL | ||||||
|   REGEX "body_execute: refusing to run body(id=1,taskid=1) in Paused state, needs to resume intead") |   REGEX "body_execute: refusing to run body(id=1,taskid=1) in Paused state, needs to resume intead") | ||||||
|  | |||||||
							
								
								
									
										32
									
								
								test/emu/nosv/cond.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								test/emu/nosv/cond.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | /* Copyright (c) 2024 Barcelona Supercomputing Center (BSC)
 | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later */ | ||||||
|  | 
 | ||||||
|  | #include "compat.h" | ||||||
|  | #include "instr.h" | ||||||
|  | #include "instr_nosv.h" | ||||||
|  | 
 | ||||||
|  | /* Test the nosv_cond_wait(), nosv_cond_broadcast() and nosv_cond_signal() API
 | ||||||
|  |  * events, introduced in the nOS-V model 2.4.0 */ | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | main(void) | ||||||
|  | { | ||||||
|  | 	instr_start(0, 1); | ||||||
|  | 	instr_nosv_init(); | ||||||
|  | 
 | ||||||
|  | 	instr_nosv_cond_wait_enter(); | ||||||
|  | 	sleep_us(100); | ||||||
|  | 	instr_nosv_cond_wait_exit(); | ||||||
|  | 
 | ||||||
|  | 	instr_nosv_cond_broadcast_enter(); | ||||||
|  | 	sleep_us(100); | ||||||
|  | 	instr_nosv_cond_broadcast_exit(); | ||||||
|  | 
 | ||||||
|  | 	instr_nosv_cond_signal_enter(); | ||||||
|  | 	sleep_us(100); | ||||||
|  | 	instr_nosv_cond_signal_exit(); | ||||||
|  | 
 | ||||||
|  | 	instr_end(); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
| @ -59,6 +59,12 @@ INSTR_0ARG(instr_nosv_mutex_trylock_enter, "VAt") | |||||||
| INSTR_0ARG(instr_nosv_mutex_trylock_exit,  "VAT") | INSTR_0ARG(instr_nosv_mutex_trylock_exit,  "VAT") | ||||||
| INSTR_0ARG(instr_nosv_mutex_unlock_enter,  "VAu") | INSTR_0ARG(instr_nosv_mutex_unlock_enter,  "VAu") | ||||||
| INSTR_0ARG(instr_nosv_mutex_unlock_exit,   "VAU") | INSTR_0ARG(instr_nosv_mutex_unlock_exit,   "VAU") | ||||||
|  | INSTR_0ARG(instr_nosv_cond_wait_enter,      "VAo") | ||||||
|  | INSTR_0ARG(instr_nosv_cond_wait_exit,       "VAO") | ||||||
|  | INSTR_0ARG(instr_nosv_cond_signal_enter,    "VAg") | ||||||
|  | INSTR_0ARG(instr_nosv_cond_signal_exit,     "VAG") | ||||||
|  | INSTR_0ARG(instr_nosv_cond_broadcast_enter, "VAk") | ||||||
|  | INSTR_0ARG(instr_nosv_cond_broadcast_exit,  "VAK") | ||||||
| INSTR_0ARG(instr_nosv_attached, "VHa") /* deprecated */ | INSTR_0ARG(instr_nosv_attached, "VHa") /* deprecated */ | ||||||
| INSTR_0ARG(instr_nosv_detached, "VHA") /* deprecated */ | INSTR_0ARG(instr_nosv_detached, "VHA") /* deprecated */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -12,9 +12,9 @@ if(NOT NOSV_FOUND) | |||||||
|   return() |   return() | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| # Needed for breakdown and kernel fix | # Needed for nosv_cond | ||||||
| if("${NOSV_VERSION}" VERSION_LESS "2.3.1") | if("${NOSV_VERSION}" VERSION_LESS "3.1.0") | ||||||
|   message(FATAL_ERROR "nOS-V version ${NOSV_VERSION} too old, required at least 2.3.1") |   message(FATAL_ERROR "nOS-V version ${NOSV_VERSION} too old, required at least 3.1.0") | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| message(STATUS "Enabling nOS-V RT tests") | message(STATUS "Enabling nOS-V RT tests") | ||||||
| @ -44,6 +44,7 @@ nosv_test(parallel-tasks.c SORT) | |||||||
| nosv_test(inline.c SORT) | nosv_test(inline.c SORT) | ||||||
| nosv_test(mutex.c SORT LEVEL 3) | nosv_test(mutex.c SORT LEVEL 3) | ||||||
| nosv_test(barrier.c SORT LEVEL 3) | nosv_test(barrier.c SORT LEVEL 3) | ||||||
|  | nosv_test(cond.c SORT LEVEL 3) | ||||||
| 
 | 
 | ||||||
| # Test multiple instrumentation levels | # Test multiple instrumentation levels | ||||||
| nosv_test(several-tasks.c SORT NAME several-tasks-level-0 LEVEL 0) | nosv_test(several-tasks.c SORT NAME several-tasks-level-0 LEVEL 0) | ||||||
|  | |||||||
							
								
								
									
										123
									
								
								test/rt/nosv/cond.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								test/rt/nosv/cond.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,123 @@ | |||||||
|  | /* Copyright (c) 2024 Barcelona Supercomputing Center (BSC)
 | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later */ | ||||||
|  | 
 | ||||||
|  | #define _DEFAULT_SOURCE | ||||||
|  | 
 | ||||||
|  | #include <nosv.h> | ||||||
|  | #include <nosv/affinity.h> | ||||||
|  | #include <stdatomic.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | 
 | ||||||
|  | #include "common.h" | ||||||
|  | #include "compat.h" | ||||||
|  | 
 | ||||||
|  | #define NTASKS 200 | ||||||
|  | atomic_int nstarted = 0; | ||||||
|  | atomic_int ncompleted = 0; | ||||||
|  | atomic_int ready = 0; | ||||||
|  | 
 | ||||||
|  | nosv_task_t tasks[NTASKS]; | ||||||
|  | nosv_cond_t cond; | ||||||
|  | nosv_mutex_t mutex; | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | task_body(nosv_task_t task) | ||||||
|  | { | ||||||
|  | 	UNUSED(task); | ||||||
|  | 	atomic_fetch_add(&nstarted, 1); | ||||||
|  | 	if (nosv_mutex_lock(mutex) != 0) | ||||||
|  | 		die("nosv_mutex_lock failed"); | ||||||
|  | 
 | ||||||
|  | 	while (!ready) { | ||||||
|  | 		if (nosv_cond_wait(cond, mutex) != 0) | ||||||
|  | 			die("nosv_cond_wait failed"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (nosv_mutex_unlock(mutex) != 0) | ||||||
|  | 		die("nosv_mutex_unlock failed"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | task_done(nosv_task_t task) | ||||||
|  | { | ||||||
|  | 	UNUSED(task); | ||||||
|  | 	atomic_fetch_add(&ncompleted, 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | task_broadcast_run(nosv_task_t task) | ||||||
|  | { | ||||||
|  | 	UNUSED(task); | ||||||
|  | 	if (nosv_mutex_lock(mutex) != 0) | ||||||
|  | 		die("nosv_mutex_lock failed"); | ||||||
|  | 
 | ||||||
|  | 	atomic_store(&ready, 1); | ||||||
|  | 	if (nosv_cond_broadcast(cond) != 0) | ||||||
|  | 		die("nosv_cond_broadcast failed"); | ||||||
|  | 
 | ||||||
|  | 	if (nosv_mutex_unlock(mutex) != 0) | ||||||
|  | 		die("nosv_mutex_unlock failed"); | ||||||
|  | 
 | ||||||
|  | 	if (nosv_mutex_lock(mutex) != 0) | ||||||
|  | 		die("nosv_mutex_lock failed"); | ||||||
|  | 
 | ||||||
|  | 	if (nosv_cond_signal(cond) != 0) | ||||||
|  | 		die("nosv_cond_signal failed"); | ||||||
|  | 
 | ||||||
|  | 	if (nosv_mutex_unlock(mutex) != 0) | ||||||
|  | 		die("nosv_mutex_unlock failed"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | main(void) | ||||||
|  | { | ||||||
|  | 	nosv_init(); | ||||||
|  | 
 | ||||||
|  | 	nosv_task_type_t task_type; | ||||||
|  | 	nosv_type_init(&task_type, task_body, NULL, task_done, "task", NULL, NULL, NOSV_TYPE_INIT_NONE); | ||||||
|  | 
 | ||||||
|  | 	nosv_task_t task_broadcast; | ||||||
|  | 	nosv_task_type_t task_type_broadcast; | ||||||
|  | 	nosv_type_init(&task_type_broadcast, task_broadcast_run, NULL, NULL, "task_broadcast", NULL, NULL, NOSV_TYPE_INIT_NONE); | ||||||
|  | 
 | ||||||
|  | 	if (nosv_cond_init(&cond, NOSV_COND_NONE) != 0) | ||||||
|  | 		die("nosv_cond_init failed"); | ||||||
|  | 
 | ||||||
|  | 	if (nosv_mutex_init(&mutex, NOSV_MUTEX_NONE) != 0) | ||||||
|  | 		die("nosv_mutex_init failed"); | ||||||
|  | 
 | ||||||
|  | 	for (int i = 0; i < NTASKS; i++) | ||||||
|  | 		nosv_create(&tasks[i], task_type, 0, NOSV_CREATE_NONE); | ||||||
|  | 
 | ||||||
|  | 	nosv_create(&task_broadcast, task_type_broadcast, 0, NOSV_CREATE_NONE); | ||||||
|  | 
 | ||||||
|  | 	for (int i = 0; i < NTASKS; i++) | ||||||
|  | 		nosv_submit(tasks[i], NOSV_SUBMIT_NONE); | ||||||
|  | 
 | ||||||
|  | 	while (atomic_load(&nstarted) != NTASKS) | ||||||
|  | 		nosv_yield(NOSV_YIELD_NONE); | ||||||
|  | 
 | ||||||
|  | 	nosv_submit(task_broadcast, NOSV_SUBMIT_NONE); | ||||||
|  | 
 | ||||||
|  | 	while (atomic_load(&ncompleted) != NTASKS) | ||||||
|  | 		sleep_us(1000); | ||||||
|  | 
 | ||||||
|  | 	for (int i = 0; i < NTASKS; i++) | ||||||
|  | 		nosv_destroy(tasks[i], NOSV_DESTROY_NONE); | ||||||
|  | 
 | ||||||
|  | 	nosv_destroy(task_broadcast, NOSV_DESTROY_NONE); | ||||||
|  | 
 | ||||||
|  | 	if (nosv_cond_destroy(cond) != 0) | ||||||
|  | 		die("nosv_cond_destroy failed"); | ||||||
|  | 
 | ||||||
|  | 	if (nosv_mutex_destroy(mutex) != 0) | ||||||
|  | 		die("nosv_mutex_destroy failed"); | ||||||
|  | 
 | ||||||
|  | 	nosv_type_destroy(task_type, NOSV_TYPE_DESTROY_NONE); | ||||||
|  | 	nosv_type_destroy(task_type_broadcast, NOSV_TYPE_DESTROY_NONE); | ||||||
|  | 
 | ||||||
|  | 	nosv_shutdown(); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user