17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_CONTEXT_H
27db96d56Sopenharmony_ci#define Py_INTERNAL_CONTEXT_H
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE
57db96d56Sopenharmony_ci#  error "this header requires Py_BUILD_CORE define"
67db96d56Sopenharmony_ci#endif
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci#include "pycore_hamt.h"   /* PyHamtObject */
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciextern PyTypeObject _PyContextTokenMissing_Type;
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci/* runtime lifecycle */
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciPyStatus _PyContext_Init(PyInterpreterState *);
167db96d56Sopenharmony_civoid _PyContext_Fini(PyInterpreterState *);
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci/* other API */
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci#ifndef WITH_FREELISTS
227db96d56Sopenharmony_ci// without freelists
237db96d56Sopenharmony_ci#  define PyContext_MAXFREELIST 0
247db96d56Sopenharmony_ci#endif
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci#ifndef PyContext_MAXFREELIST
277db96d56Sopenharmony_ci#  define PyContext_MAXFREELIST 255
287db96d56Sopenharmony_ci#endif
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_cistruct _Py_context_state {
317db96d56Sopenharmony_ci#if PyContext_MAXFREELIST > 0
327db96d56Sopenharmony_ci    // List of free PyContext objects
337db96d56Sopenharmony_ci    PyContext *freelist;
347db96d56Sopenharmony_ci    int numfree;
357db96d56Sopenharmony_ci#endif
367db96d56Sopenharmony_ci};
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_cistruct _pycontextobject {
397db96d56Sopenharmony_ci    PyObject_HEAD
407db96d56Sopenharmony_ci    PyContext *ctx_prev;
417db96d56Sopenharmony_ci    PyHamtObject *ctx_vars;
427db96d56Sopenharmony_ci    PyObject *ctx_weakreflist;
437db96d56Sopenharmony_ci    int ctx_entered;
447db96d56Sopenharmony_ci};
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_cistruct _pycontextvarobject {
487db96d56Sopenharmony_ci    PyObject_HEAD
497db96d56Sopenharmony_ci    PyObject *var_name;
507db96d56Sopenharmony_ci    PyObject *var_default;
517db96d56Sopenharmony_ci    PyObject *var_cached;
527db96d56Sopenharmony_ci    uint64_t var_cached_tsid;
537db96d56Sopenharmony_ci    uint64_t var_cached_tsver;
547db96d56Sopenharmony_ci    Py_hash_t var_hash;
557db96d56Sopenharmony_ci};
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_cistruct _pycontexttokenobject {
597db96d56Sopenharmony_ci    PyObject_HEAD
607db96d56Sopenharmony_ci    PyContext *tok_ctx;
617db96d56Sopenharmony_ci    PyContextVar *tok_var;
627db96d56Sopenharmony_ci    PyObject *tok_oldval;
637db96d56Sopenharmony_ci    int tok_used;
647db96d56Sopenharmony_ci};
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci#endif /* !Py_INTERNAL_CONTEXT_H */
68