A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/python/cpython/commit/76d5abc8684bac4f2fc7cccfe2cd940923357351 below:

Consolidate stateful runtime globals. (#2594) · python/cpython@76d5abc · GitHub

File tree Expand file treeCollapse file tree 40 files changed

+2731

-1331

lines changed

Filter options

Expand file treeCollapse file tree 40 files changed

+2731

-1331

lines changed Original file line number Diff line number Diff line change

@@ -133,4 +133,8 @@

133 133

#include "fileutils.h"

134 134

#include "pyfpe.h"

135 135 136 +

#ifdef Py_BUILD_CORE

137 +

#include "internal/_Python.h"

138 +

#endif

139 + 136 140

#endif /* !Py_PYTHON_H */

Original file line number Diff line number Diff line change

@@ -93,7 +93,12 @@ PyAPI_FUNC(int) Py_GetRecursionLimit(void);

93 93

PyThreadState_GET()->overflowed = 0; \

94 94

} while(0)

95 95

PyAPI_FUNC(int) _Py_CheckRecursiveCall(const char *where);

96 -

PyAPI_DATA(int) _Py_CheckRecursionLimit;

96 +

#ifdef Py_BUILD_CORE

97 +

#define _Py_CheckRecursionLimit _PyRuntime.ceval.check_recursion_limit

98 +

#else

99 +

PyAPI_FUNC(int) _PyEval_CheckRecursionLimit(void);

100 +

#define _Py_CheckRecursionLimit _PyEval_CheckRecursionLimit()

101 +

#endif

97 102 98 103

#ifdef USE_STACKCHECK

99 104

/* With USE_STACKCHECK, we artificially decrement the recursion limit in order

Original file line number Diff line number Diff line change

@@ -0,0 +1,16 @@

1 +

#ifndef _Py_PYTHON_H

2 +

#define _Py_PYTHON_H

3 +

/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */

4 + 5 +

/* Include all internal Python header files */

6 + 7 +

#ifndef Py_BUILD_CORE

8 +

#error "Internal headers are not available externally."

9 +

#endif

10 + 11 +

#include "_mem.h"

12 +

#include "_ceval.h"

13 +

#include "_warnings.h"

14 +

#include "_pystate.h"

15 + 16 +

#endif /* !_Py_PYTHON_H */

Original file line number Diff line number Diff line change

@@ -0,0 +1,71 @@

1 +

#ifndef _Py_CEVAL_H

2 +

#define _Py_CEVAL_H

3 +

#ifdef __cplusplus

4 +

extern "C" {

5 +

#endif

6 + 7 +

#include "ceval.h"

8 +

#include "compile.h"

9 +

#include "pyatomic.h"

10 + 11 +

#ifdef WITH_THREAD

12 +

#include "pythread.h"

13 +

#endif

14 + 15 +

struct _pending_calls {

16 +

unsigned long main_thread;

17 +

#ifdef WITH_THREAD

18 +

PyThread_type_lock lock;

19 +

/* Request for running pending calls. */

20 +

_Py_atomic_int calls_to_do;

21 +

/* Request for looking at the `async_exc` field of the current

22 +

thread state.

23 +

Guarded by the GIL. */

24 +

int async_exc;

25 +

#define NPENDINGCALLS 32

26 +

struct {

27 +

int (*func)(void *);

28 +

void *arg;

29 +

} calls[NPENDINGCALLS];

30 +

int first;

31 +

int last;

32 +

#else /* ! WITH_THREAD */

33 +

_Py_atomic_int calls_to_do;

34 +

#define NPENDINGCALLS 32

35 +

struct {

36 +

int (*func)(void *);

37 +

void *arg;

38 +

} calls[NPENDINGCALLS];

39 +

volatile int first;

40 +

volatile int last;

41 +

#endif /* WITH_THREAD */

42 +

};

43 + 44 +

#include "_gil.h"

45 + 46 +

struct _ceval_runtime_state {

47 +

int recursion_limit;

48 +

int check_recursion_limit;

49 +

/* Records whether tracing is on for any thread. Counts the number

50 +

of threads for which tstate->c_tracefunc is non-NULL, so if the

51 +

value is 0, we know we don't have to check this thread's

52 +

c_tracefunc. This speeds up the if statement in

53 +

PyEval_EvalFrameEx() after fast_next_opcode. */

54 +

int tracing_possible;

55 +

/* This single variable consolidates all requests to break out of

56 +

the fast path in the eval loop. */

57 +

_Py_atomic_int eval_breaker;

58 +

#ifdef WITH_THREAD

59 +

/* Request for dropping the GIL */

60 +

_Py_atomic_int gil_drop_request;

61 +

#endif

62 +

struct _pending_calls pending;

63 +

struct _gil_runtime_state gil;

64 +

};

65 + 66 +

PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *);

67 + 68 +

#ifdef __cplusplus

69 +

}

70 +

#endif

71 +

#endif /* !_Py_CEVAL_H */

Original file line number Diff line number Diff line change

@@ -0,0 +1,91 @@

1 +

#ifndef _CONDVAR_H_

2 +

#define _CONDVAR_H_

3 + 4 +

#ifndef _POSIX_THREADS

5 +

/* This means pthreads are not implemented in libc headers, hence the macro

6 +

not present in unistd.h. But they still can be implemented as an external

7 +

library (e.g. gnu pth in pthread emulation) */

8 +

# ifdef HAVE_PTHREAD_H

9 +

# include <pthread.h> /* _POSIX_THREADS */

10 +

# endif

11 +

#endif

12 + 13 +

#ifdef _POSIX_THREADS

14 +

/*

15 +

* POSIX support

16 +

*/

17 +

#define Py_HAVE_CONDVAR

18 + 19 +

#include <pthread.h>

20 + 21 +

#define PyMUTEX_T pthread_mutex_t

22 +

#define PyCOND_T pthread_cond_t

23 + 24 +

#elif defined(NT_THREADS)

25 +

/*

26 +

* Windows (XP, 2003 server and later, as well as (hopefully) CE) support

27 +

*

28 +

* Emulated condition variables ones that work with XP and later, plus

29 +

* example native support on VISTA and onwards.

30 +

*/

31 +

#define Py_HAVE_CONDVAR

32 + 33 +

/* include windows if it hasn't been done before */

34 +

#define WIN32_LEAN_AND_MEAN

35 +

#include <windows.h>

36 + 37 +

/* options */

38 +

/* non-emulated condition variables are provided for those that want

39 +

* to target Windows Vista. Modify this macro to enable them.

40 +

*/

41 +

#ifndef _PY_EMULATED_WIN_CV

42 +

#define _PY_EMULATED_WIN_CV 1 /* use emulated condition variables */

43 +

#endif

44 + 45 +

/* fall back to emulation if not targeting Vista */

46 +

#if !defined NTDDI_VISTA || NTDDI_VERSION < NTDDI_VISTA

47 +

#undef _PY_EMULATED_WIN_CV

48 +

#define _PY_EMULATED_WIN_CV 1

49 +

#endif

50 + 51 +

#if _PY_EMULATED_WIN_CV

52 + 53 +

typedef CRITICAL_SECTION PyMUTEX_T;

54 + 55 +

/* The ConditionVariable object. From XP onwards it is easily emulated

56 +

with a Semaphore.

57 +

Semaphores are available on Windows XP (2003 server) and later.

58 +

We use a Semaphore rather than an auto-reset event, because although

59 +

an auto-resent event might appear to solve the lost-wakeup bug (race

60 +

condition between releasing the outer lock and waiting) because it

61 +

maintains state even though a wait hasn't happened, there is still

62 +

a lost wakeup problem if more than one thread are interrupted in the

63 +

critical place. A semaphore solves that, because its state is

64 +

counted, not Boolean.

65 +

Because it is ok to signal a condition variable with no one

66 +

waiting, we need to keep track of the number of

67 +

waiting threads. Otherwise, the semaphore's state could rise

68 +

without bound. This also helps reduce the number of "spurious wakeups"

69 +

that would otherwise happen.

70 +

*/

71 + 72 +

typedef struct _PyCOND_T

73 +

{

74 +

HANDLE sem;

75 +

int waiting; /* to allow PyCOND_SIGNAL to be a no-op */

76 +

} PyCOND_T;

77 + 78 +

#else /* !_PY_EMULATED_WIN_CV */

79 + 80 +

/* Use native Win7 primitives if build target is Win7 or higher */

81 + 82 +

/* SRWLOCK is faster and better than CriticalSection */

83 +

typedef SRWLOCK PyMUTEX_T;

84 + 85 +

typedef CONDITION_VARIABLE PyCOND_T;

86 + 87 +

#endif /* _PY_EMULATED_WIN_CV */

88 + 89 +

#endif /* _POSIX_THREADS, NT_THREADS */

90 + 91 +

#endif /* _CONDVAR_H_ */

Original file line number Diff line number Diff line change

@@ -0,0 +1,48 @@

1 +

#ifndef _Py_GIL_H

2 +

#define _Py_GIL_H

3 +

#ifdef __cplusplus

4 +

extern "C" {

5 +

#endif

6 + 7 +

#include "pyatomic.h"

8 + 9 +

#include "internal/_condvar.h"

10 +

#ifndef Py_HAVE_CONDVAR

11 +

#error You need either a POSIX-compatible or a Windows system!

12 +

#endif

13 + 14 +

/* Enable if you want to force the switching of threads at least

15 +

every `interval`. */

16 +

#undef FORCE_SWITCHING

17 +

#define FORCE_SWITCHING

18 + 19 +

struct _gil_runtime_state {

20 +

/* microseconds (the Python API uses seconds, though) */

21 +

unsigned long interval;

22 +

/* Last PyThreadState holding / having held the GIL. This helps us

23 +

know whether anyone else was scheduled after we dropped the GIL. */

24 +

_Py_atomic_address last_holder;

25 +

/* Whether the GIL is already taken (-1 if uninitialized). This is

26 +

atomic because it can be read without any lock taken in ceval.c. */

27 +

_Py_atomic_int locked;

28 +

/* Number of GIL switches since the beginning. */

29 +

unsigned long switch_number;

30 +

#ifdef WITH_THREAD

31 +

/* This condition variable allows one or several threads to wait

32 +

until the GIL is released. In addition, the mutex also protects

33 +

the above variables. */

34 +

PyCOND_T cond;

35 +

PyMUTEX_T mutex;

36 +

#ifdef FORCE_SWITCHING

37 +

/* This condition variable helps the GIL-releasing thread wait for

38 +

a GIL-awaiting thread to be scheduled and take the GIL. */

39 +

PyCOND_T switch_cond;

40 +

PyMUTEX_T switch_mutex;

41 +

#endif

42 +

#endif /* WITH_THREAD */

43 +

};

44 + 45 +

#ifdef __cplusplus

46 +

}

47 +

#endif

48 +

#endif /* !_Py_GIL_H */

You can’t perform that action at this time.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4