@@ -1439,6 +1439,22 @@ decref_threadstate(_PyThreadStateImpl *tstate)
14391439 }
14401440}
14411441
1442+ #ifdef _Py_TIER2
1443+ static inline void
1444+ init_jit_metric (uint16_t * target , const char * env_name , uint16_t default_value ,
1445+ long min_value , long max_value )
1446+ {
1447+ * target = default_value ;
1448+ char * env = Py_GETENV (env_name );
1449+ if (env && * env != '\0' ) {
1450+ long value = atol (env );
1451+ if (value >= min_value && value <= max_value ) {
1452+ * target = (uint16_t )value ;
1453+ }
1454+ }
1455+ }
1456+ #endif
1457+
14421458/* Get the thread state to a minimal consistent state.
14431459 Further init happens in pylifecycle.c before it can be used.
14441460 All fields not initialized here are expected to be zeroed out,
@@ -1526,42 +1542,18 @@ init_threadstate(_PyThreadStateImpl *_tstate,
15261542 _tstate -> asyncio_running_task = NULL ;
15271543#ifdef _Py_TIER2
15281544 // Initialize JIT metrics from environment variables
1529- _tstate -> jit_metrics .jump_backward_initial_value = JUMP_BACKWARD_INITIAL_VALUE ;
1530- _tstate -> jit_metrics .jump_backward_initial_backoff = JUMP_BACKWARD_INITIAL_BACKOFF ;
1531- _tstate -> jit_metrics .side_exit_initial_value = SIDE_EXIT_INITIAL_VALUE ;
1532- _tstate -> jit_metrics .side_exit_initial_backoff = SIDE_EXIT_INITIAL_BACKOFF ;
1533-
1534- char * env = Py_GETENV ("PYTHON_JIT_JUMP_BACKWARD_INITIAL_VALUE" );
1535- if (env && * env != '\0' ) {
1536- long value = atol (env );
1537- if (value > 0 && value <= MAX_VALUE ) {
1538- _tstate -> jit_metrics .jump_backward_initial_value = (uint16_t )value ;
1539- }
1540- }
1541-
1542- env = Py_GETENV ("PYTHON_JIT_JUMP_BACKWARD_INITIAL_BACKOFF" );
1543- if (env && * env != '\0' ) {
1544- long value = atol (env );
1545- if (value >= 0 && value <= MAX_BACKOFF ) {
1546- _tstate -> jit_metrics .jump_backward_initial_backoff = (uint16_t )value ;
1547- }
1548- }
1549-
1550- env = Py_GETENV ("PYTHON_JIT_SIDE_EXIT_INITIAL_VALUE" );
1551- if (env && * env != '\0' ) {
1552- long value = atol (env );
1553- if (value > 0 && value <= MAX_VALUE ) {
1554- _tstate -> jit_metrics .side_exit_initial_value = (uint16_t )value ;
1555- }
1556- }
1557-
1558- env = Py_GETENV ("PYTHON_JIT_SIDE_EXIT_INITIAL_BACKOFF" );
1559- if (env && * env != '\0' ) {
1560- long value = atol (env );
1561- if (value >= 0 && value <= MAX_BACKOFF ) {
1562- _tstate -> jit_metrics .side_exit_initial_backoff = (uint16_t )value ;
1563- }
1564- }
1545+ init_jit_metric (& _tstate -> jit_metrics .jump_backward_initial_value ,
1546+ "PYTHON_JIT_JUMP_BACKWARD_INITIAL_VALUE" ,
1547+ JUMP_BACKWARD_INITIAL_VALUE , 1 , MAX_VALUE );
1548+ init_jit_metric (& _tstate -> jit_metrics .jump_backward_initial_backoff ,
1549+ "PYTHON_JIT_JUMP_BACKWARD_INITIAL_BACKOFF" ,
1550+ JUMP_BACKWARD_INITIAL_BACKOFF , 0 , MAX_BACKOFF );
1551+ init_jit_metric (& _tstate -> jit_metrics .side_exit_initial_value ,
1552+ "PYTHON_JIT_SIDE_EXIT_INITIAL_VALUE" ,
1553+ SIDE_EXIT_INITIAL_VALUE , 1 , MAX_VALUE );
1554+ init_jit_metric (& _tstate -> jit_metrics .side_exit_initial_backoff ,
1555+ "PYTHON_JIT_SIDE_EXIT_INITIAL_BACKOFF" ,
1556+ SIDE_EXIT_INITIAL_BACKOFF , 0 , MAX_BACKOFF );
15651557 _tstate -> jit_tracer_state .code_buffer = NULL ;
15661558#endif
15671559 tstate -> delete_later = NULL ;
0 commit comments