@@ -26,9 +26,9 @@ extern "C" {
2626#endif
2727
2828// 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
3030// 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
3232
3333htable_t jl_current_modules ;
3434jl_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
619619 * toplevel_filename = jl_symbol_name ((jl_sym_t * )file );
620620 }
621621 // 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 ) ;
624624 return jl_nothing ;
625625 }
626626 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
780780
781781JL_DLLEXPORT jl_value_t * jl_toplevel_eval (jl_module_t * m , jl_value_t * v )
782782{
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 ) ;
785785 return jl_toplevel_eval_flex (m , v , 1 , 0 , & filename , & lineno );
786786}
787787
@@ -819,23 +819,23 @@ JL_DLLEXPORT jl_value_t *jl_toplevel_eval_in(jl_module_t *m, jl_value_t *ex)
819819{
820820 jl_check_top_level_effect (m , "eval" );
821821 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 ) ;
824824 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" ) ;
827827 size_t last_age = ct -> world_age ;
828828 JL_TRY {
829829 ct -> world_age = jl_atomic_load_acquire (& jl_world_counter );
830830 v = jl_toplevel_eval (m , ex );
831831 }
832832 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 ) ;
835835 jl_rethrow ();
836836 }
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 ) ;
839839 ct -> world_age = last_age ;
840840 assert (v );
841841 return v ;
@@ -867,12 +867,12 @@ static jl_value_t *jl_parse_eval_all(jl_module_t *module, jl_value_t *text,
867867 }
868868
869869 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 ) ;
872872 int lineno = 0 ;
873- jl_lineno = 0 ;
873+ jl_atomic_store_relaxed ( & jl_lineno , 0 ) ;
874874 const char * filename_str = jl_string_data (filename );
875- jl_filename = filename_str ;
875+ jl_atomic_store_relaxed ( & jl_filename , filename_str ) ;
876876
877877 JL_TRY {
878878 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,
882882 if (jl_is_linenode (expression )) {
883883 // filename is already set above.
884884 lineno = jl_linenode_line (expression );
885- jl_lineno = lineno ;
885+ jl_atomic_store_relaxed ( & jl_lineno , lineno ) ;
886886 continue ;
887887 }
888888 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,
893893 }
894894 JL_CATCH {
895895 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 ) ;
898898 if (jl_loaderror_type == NULL )
899899 jl_rethrow ();
900900 else
901901 jl_rethrow_other (jl_new_struct (jl_loaderror_type , filename , result ,
902902 jl_current_exception (ct )));
903903 }
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 ) ;
906906 JL_GC_POP ();
907907 return result ;
908908}
0 commit comments