mirror of
				https://github.com/python/cpython.git
				synced 2025-11-01 06:01:29 +00:00 
			
		
		
		
	bpo-37146: Deactivate opcode cache only when using huntrleaks in the test suite (GH-24643)
This commit is contained in:
		
							parent
							
								
									e8f5ddd33e
								
							
						
					
					
						commit
						af5fa13ef6
					
				
					 5 changed files with 49 additions and 11 deletions
				
			
		|  | @ -28,3 +28,5 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); | |||
| 
 | ||||
| PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); | ||||
| PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); | ||||
| 
 | ||||
| PyAPI_FUNC(void) _PyEval_DeactivateOpCache(void); | ||||
|  |  | |||
|  | @ -62,6 +62,7 @@ def setup_tests(ns): | |||
| 
 | ||||
|     if ns.huntrleaks: | ||||
|         unittest.BaseTestSuite._cleanup = False | ||||
|         sys._deactivate_opcache() | ||||
| 
 | ||||
|     if ns.memlimit is not None: | ||||
|         support.set_memlimit(ns.memlimit) | ||||
|  |  | |||
|  | @ -107,17 +107,19 @@ static long dxp[256]; | |||
| #endif | ||||
| 
 | ||||
| /* per opcode cache */ | ||||
| #ifdef Py_DEBUG | ||||
| // --with-pydebug is used to find memory leak.  opcache makes it harder.
 | ||||
| // So we disable opcache when Py_DEBUG is defined.
 | ||||
| // See bpo-37146
 | ||||
| #define OPCACHE_MIN_RUNS 0  /* disable opcache */ | ||||
| #else | ||||
| #define OPCACHE_MIN_RUNS 1024  /* create opcache when code executed this time */ | ||||
| #endif | ||||
| static int opcache_min_runs = 1024;  /* create opcache when code executed this many times */ | ||||
| #define OPCODE_CACHE_MAX_TRIES 20 | ||||
| #define OPCACHE_STATS 0  /* Enable stats */ | ||||
| 
 | ||||
| // This function allows to deactivate the opcode cache. As different cache mechanisms may hold
 | ||||
| // references, this can mess with the reference leak detector functionality so the cache needs
 | ||||
| // to be deactivated in such scenarios to avoid false positives. See bpo-3714 for more information.
 | ||||
| void | ||||
| _PyEval_DeactivateOpCache(void) | ||||
| { | ||||
|     opcache_min_runs = 0; | ||||
| } | ||||
| 
 | ||||
| #if OPCACHE_STATS | ||||
| static size_t opcache_code_objects = 0; | ||||
| static size_t opcache_code_objects_extra_mem = 0; | ||||
|  | @ -1705,9 +1707,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |||
|     f->f_stackdepth = -1; | ||||
|     f->f_state = FRAME_EXECUTING; | ||||
| 
 | ||||
|     if (co->co_opcache_flag < OPCACHE_MIN_RUNS) { | ||||
|     if (co->co_opcache_flag < opcache_min_runs) { | ||||
|         co->co_opcache_flag++; | ||||
|         if (co->co_opcache_flag == OPCACHE_MIN_RUNS) { | ||||
|         if (co->co_opcache_flag == opcache_min_runs) { | ||||
|             if (_PyCode_InitOpcache(co) < 0) { | ||||
|                 goto exit_eval_frame; | ||||
|             } | ||||
|  |  | |||
							
								
								
									
										20
									
								
								Python/clinic/sysmodule.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										20
									
								
								Python/clinic/sysmodule.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -938,6 +938,24 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) | |||
| 
 | ||||
| #endif /* defined(ANDROID_API_LEVEL) */ | ||||
| 
 | ||||
| PyDoc_STRVAR(sys__deactivate_opcache__doc__, | ||||
| "_deactivate_opcache($module, /)\n" | ||||
| "--\n" | ||||
| "\n" | ||||
| "Deactivate the opcode cache permanently"); | ||||
| 
 | ||||
| #define SYS__DEACTIVATE_OPCACHE_METHODDEF    \ | ||||
|     {"_deactivate_opcache", (PyCFunction)sys__deactivate_opcache, METH_NOARGS, sys__deactivate_opcache__doc__}, | ||||
| 
 | ||||
| static PyObject * | ||||
| sys__deactivate_opcache_impl(PyObject *module); | ||||
| 
 | ||||
| static PyObject * | ||||
| sys__deactivate_opcache(PyObject *module, PyObject *Py_UNUSED(ignored)) | ||||
| { | ||||
|     return sys__deactivate_opcache_impl(module); | ||||
| } | ||||
| 
 | ||||
| #ifndef SYS_GETWINDOWSVERSION_METHODDEF | ||||
|     #define SYS_GETWINDOWSVERSION_METHODDEF | ||||
| #endif /* !defined(SYS_GETWINDOWSVERSION_METHODDEF) */ | ||||
|  | @ -965,4 +983,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) | |||
| #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF | ||||
|     #define SYS_GETANDROIDAPILEVEL_METHODDEF | ||||
| #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ | ||||
| /*[clinic end generated code: output=bbc4963fe86a29d9 input=a9049054013a1b77]*/ | ||||
| /*[clinic end generated code: output=68c62b9ca317a0c8 input=a9049054013a1b77]*/ | ||||
|  |  | |||
|  | @ -1958,6 +1958,20 @@ sys_getandroidapilevel_impl(PyObject *module) | |||
| #endif   /* ANDROID_API_LEVEL */ | ||||
| 
 | ||||
| 
 | ||||
| /*[clinic input]
 | ||||
| sys._deactivate_opcache | ||||
| 
 | ||||
| Deactivate the opcode cache permanently | ||||
| [clinic start generated code]*/ | ||||
| 
 | ||||
| static PyObject * | ||||
| sys__deactivate_opcache_impl(PyObject *module) | ||||
| /*[clinic end generated code: output=00e20982bd012122 input=501eac146735ccf9]*/ | ||||
| { | ||||
|     _PyEval_DeactivateOpCache(); | ||||
|     Py_RETURN_NONE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static PyMethodDef sys_methods[] = { | ||||
|     /* Might as well keep this in alphabetic order */ | ||||
|  | @ -2011,6 +2025,7 @@ static PyMethodDef sys_methods[] = { | |||
|     SYS_GET_ASYNCGEN_HOOKS_METHODDEF | ||||
|     SYS_GETANDROIDAPILEVEL_METHODDEF | ||||
|     SYS_UNRAISABLEHOOK_METHODDEF | ||||
|     SYS__DEACTIVATE_OPCACHE_METHODDEF | ||||
|     {NULL,              NULL}           /* sentinel */ | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Pablo Galindo
						Pablo Galindo