Skip to content

Commit df6394f

Browse files
committed
Accessors for root_task, current_task, safe_restore in TLS
In code which may be compiled against one Julia version but then gets loaded in another (e.g. due to an update), it is problematic to directly access members of jl_ptls_t, as this structure frequently changes between Julia versions The accessor function `jl_get_current_task` and `jl_get_root_task` avoid this. Note that macros `jl_current_task` and `jl_root_task` exist, but since those are compiled into the code which includes `julia.h`, they do not deal with the situation described above. No alternatives exist for `jl_get_safe_restore` and `jl_set_safe_restore`.
1 parent acd0e83 commit df6394f

3 files changed

Lines changed: 23 additions & 6 deletions

File tree

src/julia.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2044,6 +2044,12 @@ typedef struct {
20442044
#define jl_current_task (jl_get_ptls_states()->current_task)
20452045
#define jl_root_task (jl_get_ptls_states()->root_task)
20462046

2047+
JL_DLLEXPORT jl_value_t *jl_get_current_task(void);
2048+
JL_DLLEXPORT jl_value_t *jl_get_root_task(void);
2049+
2050+
JL_DLLEXPORT jl_jmp_buf *jl_get_safe_restore(void);
2051+
JL_DLLEXPORT void jl_set_safe_restore(jl_jmp_buf *);
2052+
20472053
// codegen interface ----------------------------------------------------------
20482054

20492055
typedef struct {

src/julia_internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1018,7 +1018,6 @@ JL_DLLEXPORT jl_value_t *(jl_array_data_owner)(jl_array_t *a);
10181018
JL_DLLEXPORT int jl_array_isassigned(jl_array_t *a, size_t i);
10191019

10201020
JL_DLLEXPORT uintptr_t jl_object_id_(jl_value_t *tv, jl_value_t *v) JL_NOTSAFEPOINT;
1021-
JL_DLLEXPORT jl_value_t *jl_get_current_task(void);
10221021
JL_DLLEXPORT void jl_set_next_task(jl_task_t *task);
10231022

10241023
// -- synchronization utilities -- //

src/task.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -609,16 +609,28 @@ JL_DLLEXPORT jl_value_t *jl_get_current_task(void)
609609
return (jl_value_t*)ptls->current_task;
610610
}
611611

612-
#ifdef JL_HAVE_ASYNCIFY
613-
JL_DLLEXPORT jl_ucontext_t *task_ctx_ptr(jl_task_t *t)
612+
JL_DLLEXPORT jl_value_t *jl_get_root_task(void)
614613
{
615-
return &t->ctx;
614+
jl_ptls_t ptls = jl_get_ptls_states();
615+
return (jl_value_t*)ptls->root_task;
616616
}
617617

618-
JL_DLLEXPORT jl_value_t *jl_get_root_task(void)
618+
JL_DLLEXPORT jl_jmp_buf *jl_get_safe_restore(void)
619619
{
620620
jl_ptls_t ptls = jl_get_ptls_states();
621-
return (jl_value_t*)ptls->root_task;
621+
return (jl_value_t*)ptls->safe_restore;
622+
}
623+
624+
JL_DLLEXPORT void jl_set_safe_restore(jl_jmp_buf *sr)
625+
{
626+
jl_ptls_t ptls = jl_get_ptls_states();
627+
ptls->safe_restore = sr;
628+
}
629+
630+
#ifdef JL_HAVE_ASYNCIFY
631+
JL_DLLEXPORT jl_ucontext_t *task_ctx_ptr(jl_task_t *t)
632+
{
633+
return &t->ctx;
622634
}
623635

624636
void JL_DLLEXPORT jl_task_wait()

0 commit comments

Comments
 (0)