summaryrefslogtreecommitdiffstats
path: root/Include/cpython
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2023-10-23 13:49:09 (GMT)
committerGitHub <noreply@github.com>2023-10-23 13:49:09 (GMT)
commit52e902ccf0178d7a3f26de4bba7922b01c0d4d3c (patch)
tree1f5924ef032ba13f1115c4c88541d293f6331875 /Include/cpython
parent32c37fe1ba708b8290cfa971e130bcfc29f1ead3 (diff)
downloadcpython-52e902ccf0178d7a3f26de4bba7922b01c0d4d3c.zip
cpython-52e902ccf0178d7a3f26de4bba7922b01c0d4d3c.tar.gz
cpython-52e902ccf0178d7a3f26de4bba7922b01c0d4d3c.tar.bz2
GH-109369: Add machinery for deoptimizing tier2 executors, both individually and globally. (GH-110384)
Diffstat (limited to 'Include/cpython')
-rw-r--r--Include/cpython/optimizer.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/Include/cpython/optimizer.h b/Include/cpython/optimizer.h
index 4753610..2a5251b 100644
--- a/Include/cpython/optimizer.h
+++ b/Include/cpython/optimizer.h
@@ -6,9 +6,27 @@
extern "C" {
#endif
+typedef struct _PyExecutorLinkListNode {
+ struct _PyExecutorObject *next;
+ struct _PyExecutorObject *previous;
+} _PyExecutorLinkListNode;
+
+
+/* Bloom filter with m = 256
+ * https://en.wikipedia.org/wiki/Bloom_filter */
+#define BLOOM_FILTER_WORDS 8
+
+typedef struct _bloom_filter {
+ uint32_t bits[BLOOM_FILTER_WORDS];
+} _PyBloomFilter;
+
typedef struct {
uint8_t opcode;
uint8_t oparg;
+ uint8_t valid;
+ uint8_t linked;
+ _PyBloomFilter bloom;
+ _PyExecutorLinkListNode links;
} _PyVMData;
typedef struct _PyExecutorObject {
@@ -45,6 +63,14 @@ _PyOptimizer_BackEdge(struct _PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_
extern _PyOptimizerObject _PyOptimizer_Default;
+void _Py_ExecutorInit(_PyExecutorObject *, _PyBloomFilter *);
+void _Py_ExecutorClear(_PyExecutorObject *);
+void _Py_BloomFilter_Init(_PyBloomFilter *);
+void _Py_BloomFilter_Add(_PyBloomFilter *bloom, void *obj);
+PyAPI_FUNC(void) _Py_Executor_DependsOn(_PyExecutorObject *executor, void *obj);
+PyAPI_FUNC(void) _Py_Executors_InvalidateDependency(PyInterpreterState *interp, void *obj);
+extern void _Py_Executors_InvalidateAll(PyInterpreterState *interp);
+
/* For testing */
PyAPI_FUNC(PyObject *)PyUnstable_Optimizer_NewCounter(void);
PyAPI_FUNC(PyObject *)PyUnstable_Optimizer_NewUOpOptimizer(void);