mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 835f4add60
			
		
	
	
		835f4add60
		
			
		
	
	
	
	
		
			
			See6b98b274b6for an explanation of the problem and solution. Here I've applied the solution to channels. (cherry picked from commit8b209fd4f8, AKA gh-121805) Co-authored-by: Eric Snow <ericsnowcurrently@gmail.com>
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #define _RESOLVE_MODINIT_FUNC_NAME(NAME) \
 | |
|     PyInit_ ## NAME
 | |
| #define RESOLVE_MODINIT_FUNC_NAME(NAME) \
 | |
|     _RESOLVE_MODINIT_FUNC_NAME(NAME)
 | |
| 
 | |
| 
 | |
| static int
 | |
| ensure_xid_class(PyTypeObject *cls, crossinterpdatafunc getdata)
 | |
| {
 | |
|     //assert(cls->tp_flags & Py_TPFLAGS_HEAPTYPE);
 | |
|     return _PyCrossInterpreterData_RegisterClass(cls, getdata);
 | |
| }
 | |
| 
 | |
| #ifdef REGISTERS_HEAP_TYPES
 | |
| static int
 | |
| clear_xid_class(PyTypeObject *cls)
 | |
| {
 | |
|     return _PyCrossInterpreterData_UnregisterClass(cls);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| 
 | |
| static inline int64_t
 | |
| _get_interpid(_PyCrossInterpreterData *data)
 | |
| {
 | |
|     int64_t interpid;
 | |
|     if (data != NULL) {
 | |
|         interpid = _PyCrossInterpreterData_INTERPID(data);
 | |
|         assert(!PyErr_Occurred());
 | |
|     }
 | |
|     else {
 | |
|         interpid = PyInterpreterState_GetID(PyInterpreterState_Get());
 | |
|     }
 | |
|     return interpid;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* unbound items ************************************************************/
 | |
| 
 | |
| #ifdef HAS_UNBOUND_ITEMS
 | |
| 
 | |
| #define UNBOUND_REMOVE 1
 | |
| #define UNBOUND_ERROR 2
 | |
| #define UNBOUND_REPLACE 3
 | |
| 
 | |
| // It would also be possible to add UNBOUND_REPLACE where the replacement
 | |
| // value is user-provided.  There would be some limitations there, though.
 | |
| // Another possibility would be something like UNBOUND_COPY, where the
 | |
| // object is released but the underlying data is copied (with the "raw"
 | |
| // allocator) and used when the item is popped off the queue.
 | |
| 
 | |
| static int
 | |
| check_unbound(int unboundop)
 | |
| {
 | |
|     switch (unboundop) {
 | |
|     case UNBOUND_REMOVE:
 | |
|     case UNBOUND_ERROR:
 | |
|     case UNBOUND_REPLACE:
 | |
|         return 1;
 | |
|     default:
 | |
|         return 0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| #endif
 |