@@ -125,7 +125,7 @@ static void NOINLINE save_stack(jl_ptls_t ptls, jl_task_t *lastt, jl_task_t **pt
125
125
else {
126
126
buf = lastt -> stkbuf ;
127
127
}
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
129
129
lastt -> copy_stack = nb ;
130
130
lastt -> sticky = 1 ;
131
131
memcpy_a16 ((uint64_t * )buf , (uint64_t * )frame_addr , nb );
@@ -248,10 +248,24 @@ JL_DLLEXPORT void julia_init(JL_IMAGE_SEARCH rel)
248
248
_julia_init (rel );
249
249
}
250
250
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
+
251
264
void jl_release_task_stack (jl_ptls_t ptls , jl_task_t * task );
252
265
253
- static void ctx_switch (jl_ptls_t ptls , jl_task_t * * pt )
266
+ static void ctx_switch (jl_ptls_t ptls )
254
267
{
268
+ jl_task_t * * pt = & ptls -> next_task ;
255
269
jl_task_t * t = * pt ;
256
270
assert (t != ptls -> current_task );
257
271
jl_task_t * lastt = ptls -> current_task ;
@@ -283,7 +297,7 @@ static void ctx_switch(jl_ptls_t ptls, jl_task_t **pt)
283
297
}
284
298
285
299
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
287
301
lastt -> gcstack = NULL ;
288
302
if (!lastt -> copy_stack && lastt -> stkbuf ) {
289
303
// early free of stkbuf back to the pool
@@ -302,7 +316,7 @@ static void ctx_switch(jl_ptls_t ptls, jl_task_t **pt)
302
316
}
303
317
else
304
318
#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
306
320
lastt -> gcstack = ptls -> pgcstack ;
307
321
}
308
322
@@ -366,10 +380,10 @@ static jl_ptls_t NOINLINE refetch_ptls(void)
366
380
return jl_get_ptls_states ();
367
381
}
368
382
369
- JL_DLLEXPORT void jl_switchto ( jl_task_t * * pt )
383
+ JL_DLLEXPORT void jl_switch ( void )
370
384
{
371
385
jl_ptls_t ptls = jl_get_ptls_states ();
372
- jl_task_t * t = * pt ;
386
+ jl_task_t * t = ptls -> next_task ;
373
387
jl_task_t * ct = ptls -> current_task ;
374
388
if (t == ct ) {
375
389
return ;
@@ -401,7 +415,7 @@ JL_DLLEXPORT void jl_switchto(jl_task_t **pt)
401
415
jl_timing_block_stop (blk );
402
416
#endif
403
417
404
- ctx_switch (ptls , pt );
418
+ ctx_switch (ptls );
405
419
406
420
#ifdef MIGRATE_TASKS
407
421
ptls = refetch_ptls ();
@@ -432,6 +446,12 @@ JL_DLLEXPORT void jl_switchto(jl_task_t **pt)
432
446
jl_sigint_safepoint (ptls );
433
447
}
434
448
449
+ JL_DLLEXPORT void jl_switchto (jl_task_t * * pt )
450
+ {
451
+ jl_set_next_task (* pt );
452
+ jl_switch ();
453
+ }
454
+
435
455
JL_DLLEXPORT JL_NORETURN void jl_no_exc_handler (jl_value_t * e )
436
456
{
437
457
jl_printf (JL_STDERR , "fatal: error thrown and no exception handler available.\n" );
0 commit comments