@@ -26,9 +26,9 @@ extern "C" {
26
26
#endif
27
27
28
28
// current line number in a file
29
- JL_DLLEXPORT int jl_lineno = 0 ; // need to update jl_critical_error if this is TLS
29
+ JL_DLLEXPORT _Atomic( int ) jl_lineno = 0 ; // need to update jl_critical_error if this is TLS
30
30
// current file name
31
- JL_DLLEXPORT const char * jl_filename = "none" ; // need to update jl_critical_error if this is TLS
31
+ JL_DLLEXPORT _Atomic( const char * ) jl_filename = "none" ; // need to update jl_critical_error if this is TLS
32
32
33
33
htable_t jl_current_modules ;
34
34
jl_mutex_t jl_modules_mutex ;
@@ -619,8 +619,8 @@ JL_DLLEXPORT jl_value_t *jl_toplevel_eval_flex(jl_module_t *JL_NONNULL m, jl_val
619
619
* toplevel_filename = jl_symbol_name ((jl_sym_t * )file );
620
620
}
621
621
// Not thread safe. For debugging and last resort error messages (jl_critical_error) only.
622
- jl_filename = * toplevel_filename ;
623
- jl_lineno = * toplevel_lineno ;
622
+ jl_atomic_store_relaxed ( & jl_filename , * toplevel_filename ) ;
623
+ jl_atomic_store_relaxed ( & jl_lineno , * toplevel_lineno ) ;
624
624
return jl_nothing ;
625
625
}
626
626
return jl_interpret_toplevel_expr_in (m , e , NULL , NULL );
@@ -780,8 +780,8 @@ JL_DLLEXPORT jl_value_t *jl_toplevel_eval_flex(jl_module_t *JL_NONNULL m, jl_val
780
780
781
781
JL_DLLEXPORT jl_value_t * jl_toplevel_eval (jl_module_t * m , jl_value_t * v )
782
782
{
783
- const char * filename = jl_filename ;
784
- int lineno = jl_lineno ;
783
+ const char * filename = jl_atomic_load_relaxed ( & jl_filename ) ;
784
+ int lineno = jl_atomic_load_relaxed ( & jl_lineno ) ;
785
785
return jl_toplevel_eval_flex (m , v , 1 , 0 , & filename , & lineno );
786
786
}
787
787
@@ -819,23 +819,23 @@ JL_DLLEXPORT jl_value_t *jl_toplevel_eval_in(jl_module_t *m, jl_value_t *ex)
819
819
{
820
820
jl_check_top_level_effect (m , "eval" );
821
821
jl_value_t * v = NULL ;
822
- int last_lineno = jl_lineno ;
823
- const char * last_filename = jl_filename ;
822
+ int last_lineno = jl_atomic_load_relaxed ( & jl_lineno ) ;
823
+ const char * last_filename = jl_atomic_load_relaxed ( & jl_filename ) ;
824
824
jl_task_t * ct = jl_current_task ;
825
- jl_lineno = 1 ;
826
- jl_filename = "none" ;
825
+ jl_atomic_store_relaxed ( & jl_lineno , 1 ) ;
826
+ jl_atomic_store_relaxed ( & jl_filename , "none" ) ;
827
827
size_t last_age = ct -> world_age ;
828
828
JL_TRY {
829
829
ct -> world_age = jl_atomic_load_acquire (& jl_world_counter );
830
830
v = jl_toplevel_eval (m , ex );
831
831
}
832
832
JL_CATCH {
833
- jl_lineno = last_lineno ;
834
- jl_filename = last_filename ;
833
+ jl_atomic_store_relaxed ( & jl_lineno , last_lineno ) ;
834
+ jl_atomic_store_relaxed ( & jl_filename , last_filename ) ;
835
835
jl_rethrow ();
836
836
}
837
- jl_lineno = last_lineno ;
838
- jl_filename = last_filename ;
837
+ jl_atomic_store_relaxed ( & jl_lineno , last_lineno ) ;
838
+ jl_atomic_store_relaxed ( & jl_filename , last_filename ) ;
839
839
ct -> world_age = last_age ;
840
840
assert (v );
841
841
return v ;
@@ -867,12 +867,12 @@ static jl_value_t *jl_parse_eval_all(jl_module_t *module, jl_value_t *text,
867
867
}
868
868
869
869
jl_task_t * ct = jl_current_task ;
870
- int last_lineno = jl_lineno ;
871
- const char * last_filename = jl_filename ;
870
+ int last_lineno = jl_atomic_load_relaxed ( & jl_lineno ) ;
871
+ const char * last_filename = jl_atomic_load_relaxed ( & jl_filename ) ;
872
872
int lineno = 0 ;
873
- jl_lineno = 0 ;
873
+ jl_atomic_store_relaxed ( & jl_lineno , 0 ) ;
874
874
const char * filename_str = jl_string_data (filename );
875
- jl_filename = filename_str ;
875
+ jl_atomic_store_relaxed ( & jl_filename , filename_str ) ;
876
876
877
877
JL_TRY {
878
878
size_t last_age = ct -> world_age ;
@@ -882,7 +882,7 @@ static jl_value_t *jl_parse_eval_all(jl_module_t *module, jl_value_t *text,
882
882
if (jl_is_linenode (expression )) {
883
883
// filename is already set above.
884
884
lineno = jl_linenode_line (expression );
885
- jl_lineno = lineno ;
885
+ jl_atomic_store_relaxed ( & jl_lineno , lineno ) ;
886
886
continue ;
887
887
}
888
888
expression = jl_svecref (jl_lower (expression , module , jl_string_data (filename ), lineno , ~(size_t )0 , 1 ), 0 );
@@ -893,16 +893,16 @@ static jl_value_t *jl_parse_eval_all(jl_module_t *module, jl_value_t *text,
893
893
}
894
894
JL_CATCH {
895
895
result = jl_box_long (lineno ); // (ab)use result to root error line
896
- jl_lineno = last_lineno ;
897
- jl_filename = last_filename ;
896
+ jl_atomic_store_relaxed ( & jl_lineno , last_lineno ) ;
897
+ jl_atomic_store_relaxed ( & jl_filename , last_filename ) ;
898
898
if (jl_loaderror_type == NULL )
899
899
jl_rethrow ();
900
900
else
901
901
jl_rethrow_other (jl_new_struct (jl_loaderror_type , filename , result ,
902
902
jl_current_exception (ct )));
903
903
}
904
- jl_lineno = last_lineno ;
905
- jl_filename = last_filename ;
904
+ jl_atomic_store_relaxed ( & jl_lineno , last_lineno ) ;
905
+ jl_atomic_store_relaxed ( & jl_filename , last_filename ) ;
906
906
JL_GC_POP ();
907
907
return result ;
908
908
}
0 commit comments