mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	This is strictly about moving the "obmalloc" runtime state from `_PyRuntimeState` to `PyInterpreterState`. Doing so improves isolation between interpreters, specifically most of the memory (incl. objects) allocated for each interpreter's use. This is important for a per-interpreter GIL, but such isolation is valuable even without it. FWIW, a per-interpreter obmalloc is the proverbial canary-in-the-coalmine when it comes to the isolation of objects between interpreters. Any object that leaks (unintentionally) to another interpreter is highly likely to cause a crash (on debug builds at least). That's a useful thing to know, relative to interpreter isolation.
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef Py_INTERNAL_OBMALLOC_INIT_H
 | 
						|
#define Py_INTERNAL_OBMALLOC_INIT_H
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef Py_BUILD_CORE
 | 
						|
#  error "this header requires Py_BUILD_CORE define"
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
/****************************************************/
 | 
						|
/* the default object allocator's state initializer */
 | 
						|
 | 
						|
#define PTA(pools, x) \
 | 
						|
    ((poolp )((uint8_t *)&(pools.used[2*(x)]) - 2*sizeof(pymem_block *)))
 | 
						|
#define PT(p, x)   PTA(p, x), PTA(p, x)
 | 
						|
 | 
						|
#define PT_8(p, start) \
 | 
						|
    PT(p, start), \
 | 
						|
    PT(p, start+1), \
 | 
						|
    PT(p, start+2), \
 | 
						|
    PT(p, start+3), \
 | 
						|
    PT(p, start+4), \
 | 
						|
    PT(p, start+5), \
 | 
						|
    PT(p, start+6), \
 | 
						|
    PT(p, start+7)
 | 
						|
 | 
						|
#if NB_SMALL_SIZE_CLASSES <= 8
 | 
						|
#  define _obmalloc_pools_INIT(p) \
 | 
						|
    { PT_8(p, 0) }
 | 
						|
#elif NB_SMALL_SIZE_CLASSES <= 16
 | 
						|
#  define _obmalloc_pools_INIT(p) \
 | 
						|
    { PT_8(p, 0), PT_8(p, 8) }
 | 
						|
#elif NB_SMALL_SIZE_CLASSES <= 24
 | 
						|
#  define _obmalloc_pools_INIT(p) \
 | 
						|
    { PT_8(p, 0), PT_8(p, 8), PT_8(p, 16) }
 | 
						|
#elif NB_SMALL_SIZE_CLASSES <= 32
 | 
						|
#  define _obmalloc_pools_INIT(p) \
 | 
						|
    { PT_8(p, 0), PT_8(p, 8), PT_8(p, 16), PT_8(p, 24) }
 | 
						|
#elif NB_SMALL_SIZE_CLASSES <= 40
 | 
						|
#  define _obmalloc_pools_INIT(p) \
 | 
						|
    { PT_8(p, 0), PT_8(p, 8), PT_8(p, 16), PT_8(p, 24), PT_8(p, 32) }
 | 
						|
#elif NB_SMALL_SIZE_CLASSES <= 48
 | 
						|
#  define _obmalloc_pools_INIT(p) \
 | 
						|
    { PT_8(p, 0), PT_8(p, 8), PT_8(p, 16), PT_8(p, 24), PT_8(p, 32), PT_8(p, 40) }
 | 
						|
#elif NB_SMALL_SIZE_CLASSES <= 56
 | 
						|
#  define _obmalloc_pools_INIT(p) \
 | 
						|
    { PT_8(p, 0), PT_8(p, 8), PT_8(p, 16), PT_8(p, 24), PT_8(p, 32), PT_8(p, 40), PT_8(p, 48) }
 | 
						|
#elif NB_SMALL_SIZE_CLASSES <= 64
 | 
						|
#  define _obmalloc_pools_INIT(p) \
 | 
						|
    { PT_8(p, 0), PT_8(p, 8), PT_8(p, 16), PT_8(p, 24), PT_8(p, 32), PT_8(p, 40), PT_8(p, 48), PT_8(p, 56) }
 | 
						|
#else
 | 
						|
#  error "NB_SMALL_SIZE_CLASSES should be less than 64"
 | 
						|
#endif
 | 
						|
 | 
						|
#define _obmalloc_global_state_INIT \
 | 
						|
    { \
 | 
						|
        .dump_debug_stats = -1, \
 | 
						|
    }
 | 
						|
 | 
						|
#define _obmalloc_state_INIT(obmalloc) \
 | 
						|
    { \
 | 
						|
        .pools = { \
 | 
						|
            .used = _obmalloc_pools_INIT(obmalloc.pools), \
 | 
						|
        }, \
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
#endif  // !Py_INTERNAL_OBMALLOC_INIT_H
 |