@@ -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,24 @@ 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+ jl_ptls_t ptls = jl_get_ptls_states ();
259+ if (ptls -> next_task )
260+ return ptls -> next_task ;
261+ return ptls -> current_task ;
262+ }
263+
251264void jl_release_task_stack (jl_ptls_t ptls , jl_task_t * task );
252265
253- static void ctx_switch (jl_ptls_t ptls , jl_task_t * * pt )
266+ static void ctx_switch (jl_ptls_t ptls )
254267{
268+ jl_task_t * * pt = & ptls -> next_task ;
255269 jl_task_t * t = * pt ;
256270 assert (t != ptls -> current_task );
257271 jl_task_t * lastt = ptls -> current_task ;
@@ -283,7 +297,7 @@ static void ctx_switch(jl_ptls_t ptls, jl_task_t **pt)
283297 }
284298
285299 if (killed ) {
286- * pt = lastt ; // can't fail after here: clear the gc-root for the target task now
300+ * pt = NULL ; // can't fail after here: clear the gc-root for the target task now
287301 lastt -> gcstack = NULL ;
288302 if (!lastt -> copy_stack && lastt -> stkbuf ) {
289303 // early free of stkbuf back to the pool
@@ -302,7 +316,7 @@ static void ctx_switch(jl_ptls_t ptls, jl_task_t **pt)
302316 }
303317 else
304318#endif
305- * pt = lastt ; // can't fail after here: clear the gc-root for the target task now
319+ * pt = NULL ; // can't fail after here: clear the gc-root for the target task now
306320 lastt -> gcstack = ptls -> pgcstack ;
307321 }
308322
@@ -366,10 +380,10 @@ static jl_ptls_t NOINLINE refetch_ptls(void)
366380 return jl_get_ptls_states ();
367381}
368382
369- JL_DLLEXPORT void jl_switchto ( jl_task_t * * pt )
383+ JL_DLLEXPORT void jl_switch ( void )
370384{
371385 jl_ptls_t ptls = jl_get_ptls_states ();
372- jl_task_t * t = * pt ;
386+ jl_task_t * t = ptls -> next_task ;
373387 jl_task_t * ct = ptls -> current_task ;
374388 if (t == ct ) {
375389 return ;
@@ -401,7 +415,7 @@ JL_DLLEXPORT void jl_switchto(jl_task_t **pt)
401415 jl_timing_block_stop (blk );
402416#endif
403417
404- ctx_switch (ptls , pt );
418+ ctx_switch (ptls );
405419
406420#ifdef MIGRATE_TASKS
407421 ptls = refetch_ptls ();
@@ -432,6 +446,12 @@ JL_DLLEXPORT void jl_switchto(jl_task_t **pt)
432446 jl_sigint_safepoint (ptls );
433447}
434448
449+ JL_DLLEXPORT void jl_switchto (jl_task_t * * pt )
450+ {
451+ jl_set_next_task (* pt );
452+ jl_switch ();
453+ }
454+
435455JL_DLLEXPORT JL_NORETURN void jl_no_exc_handler (jl_value_t * e )
436456{
437457 jl_printf (JL_STDERR , "fatal: error thrown and no exception handler available.\n" );
0 commit comments