mirror of https://github.com/python/cpython
57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
#ifndef Py_INTERNAL_INDEX_POOL_H
|
|
#define Py_INTERNAL_INDEX_POOL_H
|
|
|
|
#include "Python.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
#endif
|
|
|
|
#ifdef Py_GIL_DISABLED
|
|
|
|
// This contains code for allocating unique indices in an array. It is used by
|
|
// the free-threaded build to assign each thread a globally unique index into
|
|
// each code object's thread-local bytecode array.
|
|
|
|
// A min-heap of indices
|
|
typedef struct _PyIndexHeap {
|
|
int32_t *values;
|
|
|
|
// Number of items stored in values
|
|
Py_ssize_t size;
|
|
|
|
// Maximum number of items that can be stored in values
|
|
Py_ssize_t capacity;
|
|
} _PyIndexHeap;
|
|
|
|
// An unbounded pool of indices. Indices are allocated starting from 0. They
|
|
// may be released back to the pool once they are no longer in use.
|
|
typedef struct _PyIndexPool {
|
|
PyMutex mutex;
|
|
|
|
// Min heap of indices available for allocation
|
|
_PyIndexHeap free_indices;
|
|
|
|
// Next index to allocate if no free indices are available
|
|
int32_t next_index;
|
|
} _PyIndexPool;
|
|
|
|
// Allocate the smallest available index. Returns -1 on error.
|
|
extern int32_t _PyIndexPool_AllocIndex(_PyIndexPool *indices);
|
|
|
|
// Release `index` back to the pool
|
|
extern void _PyIndexPool_FreeIndex(_PyIndexPool *indices, int32_t index);
|
|
|
|
extern void _PyIndexPool_Fini(_PyIndexPool *indices);
|
|
|
|
#endif // Py_GIL_DISABLED
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif // !Py_INTERNAL_INDEX_POOL_H
|