@@ -125,7 +125,7 @@ static void NOINLINE save_stack(jl_ptls_t ptls, jl_task_t *lastt, jl_task_t **pt
125125 else {
126126 buf = lastt -> stkbuf ;
127127 }
128- * pt = lastt ; // clear the gc-root for the target task before copying the stack for saving
128+ * pt = NULL ; // clear the gc-root for the target task before copying the stack for saving
129129 lastt -> copy_stack = nb ;
130130 lastt -> sticky = 1 ;
131131 memcpy_a16 ((uint64_t * )buf , (uint64_t * )frame_addr , nb );
@@ -248,10 +248,21 @@ JL_DLLEXPORT void julia_init(JL_IMAGE_SEARCH rel)
248248 _julia_init (rel );
249249}
250250
251+ JL_DLLEXPORT void jl_set_next_task (jl_task_t * task )
252+ {
253+ jl_get_ptls_states ()-> next_task = task ;
254+ }
255+
256+ JL_DLLEXPORT jl_task_t * jl_get_next_task (void )
257+ {
258+ return jl_get_ptls_states ()-> next_task ;
259+ }
260+
251261void jl_release_task_stack (jl_ptls_t ptls , jl_task_t * task );
252262
253- static void ctx_switch (jl_ptls_t ptls , jl_task_t * * pt )
263+ static void ctx_switch (jl_ptls_t ptls )
254264{
265+ jl_task_t * * pt = & ptls -> next_task ;
255266 jl_task_t * t = * pt ;
256267 assert (t != ptls -> current_task );
257268 jl_task_t * lastt = ptls -> current_task ;
@@ -283,7 +294,7 @@ static void ctx_switch(jl_ptls_t ptls, jl_task_t **pt)
283294 }
284295
285296 if (killed ) {
286- * pt = lastt ; // can't fail after here: clear the gc-root for the target task now
297+ * pt = NULL ; // can't fail after here: clear the gc-root for the target task now
287298 lastt -> gcstack = NULL ;
288299 if (!lastt -> copy_stack && lastt -> stkbuf ) {
289300 // early free of stkbuf back to the pool
@@ -302,7 +313,7 @@ static void ctx_switch(jl_ptls_t ptls, jl_task_t **pt)
302313 }
303314 else
304315#endif
305- * pt = lastt ; // can't fail after here: clear the gc-root for the target task now
316+ * pt = NULL ; // can't fail after here: clear the gc-root for the target task now
306317 lastt -> gcstack = ptls -> pgcstack ;
307318 }
308319
@@ -366,10 +377,10 @@ static jl_ptls_t NOINLINE refetch_ptls(void)
366377 return jl_get_ptls_states ();
367378}
368379
369- JL_DLLEXPORT void jl_switchto ( jl_task_t * * pt )
380+ JL_DLLEXPORT void jl_switch ( void )
370381{
371382 jl_ptls_t ptls = jl_get_ptls_states ();
372- jl_task_t * t = * pt ;
383+ jl_task_t * t = ptls -> next_task ;
373384 jl_task_t * ct = ptls -> current_task ;
374385 if (t == ct ) {
375386 return ;
@@ -401,7 +412,7 @@ JL_DLLEXPORT void jl_switchto(jl_task_t **pt)
401412 jl_timing_block_stop (blk );
402413#endif
403414
404- ctx_switch (ptls , pt );
415+ ctx_switch (ptls );
405416
406417#ifdef MIGRATE_TASKS
407418 ptls = refetch_ptls ();
@@ -432,6 +443,12 @@ JL_DLLEXPORT void jl_switchto(jl_task_t **pt)
432443 jl_sigint_safepoint (ptls );
433444}
434445
446+ JL_DLLEXPORT void jl_switchto (jl_task_t * * pt )
447+ {
448+ jl_set_next_task (* pt );
449+ jl_switch ();
450+ }
451+
435452JL_DLLEXPORT JL_NORETURN void jl_no_exc_handler (jl_value_t * e )
436453{
437454 jl_printf (JL_STDERR , "fatal: error thrown and no exception handler available.\n" );
0 commit comments