304304mod memory {
305305 use super :: * ;
306306
307- async fn get_memory_executor ( ) -> MemoryExecutor {
308- let executor = MemoryExecutor ;
309- let system_info = SystemInfo :: new ( ) . unwrap ( ) ;
310- executor. setup ( & system_info, None ) . await . unwrap ( ) ;
311- executor
307+ async fn get_memory_executor ( ) -> ( SemaphorePermit < ' static > , MemoryExecutor ) {
308+ static MEMORY_INIT : OnceCell < ( ) > = OnceCell :: const_new ( ) ;
309+ static MEMORY_SEMAPHORE : OnceCell < Semaphore > = OnceCell :: const_new ( ) ;
310+
311+ MEMORY_INIT
312+ . get_or_init ( || async {
313+ let executor = MemoryExecutor ;
314+ let system_info = SystemInfo :: new ( ) . unwrap ( ) ;
315+ executor. setup ( & system_info, None ) . await . unwrap ( ) ;
316+ } )
317+ . await ;
318+
319+ let semaphore = MEMORY_SEMAPHORE
320+ . get_or_init ( || async { Semaphore :: new ( 1 ) } )
321+ . await ;
322+ let permit = semaphore. acquire ( ) . await . unwrap ( ) ;
323+
324+ ( permit, MemoryExecutor )
312325 }
313326
314327 #[ cfg( test) ]
@@ -324,7 +337,7 @@ mod memory {
324337 #[ tokio:: test]
325338 async fn test_memory_executor ( #[ case] cmd : & str ) {
326339 let ( system_info, run_data, _temp_dir) = create_test_setup ( ) . await ;
327- let executor = get_memory_executor ( ) . await ;
340+ let ( _permit , executor) = get_memory_executor ( ) . await ;
328341
329342 let config = memory_config ( cmd) ;
330343 executor
@@ -337,7 +350,7 @@ mod memory {
337350 #[ tokio:: test]
338351 async fn test_memory_executor_with_env ( #[ case] env_case : ( & str , & str ) ) {
339352 let ( system_info, run_data, _temp_dir) = create_test_setup ( ) . await ;
340- let executor = get_memory_executor ( ) . await ;
353+ let ( _permit , executor) = get_memory_executor ( ) . await ;
341354
342355 let ( env_var, env_value) = env_case;
343356 temp_env:: async_with_vars ( & [ ( env_var, Some ( env_value) ) ] , async {
0 commit comments