]>
Commit | Line | Data |
---|---|---|
31f18b77 FG |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | /* | |
4 | * Ceph - scalable distributed file system | |
5 | * | |
6 | * Copyright (C) 2017 SUSE LLC | |
7 | * | |
8 | * This is free software; you can redistribute it and/or | |
9 | * modify it under the terms of the GNU Lesser General Public | |
10 | * License version 2.1, as published by the Free Software | |
11 | * Foundation. See file COPYING. | |
12 | * | |
13 | */ | |
14 | ||
3efd9988 | 15 | #pragma once |
31f18b77 | 16 | |
3efd9988 FG |
17 | struct _ts; |
18 | typedef struct _ts PyThreadState; | |
31f18b77 | 19 | |
3efd9988 | 20 | #include <pthread.h> |
31f18b77 | 21 | |
3efd9988 FG |
22 | |
23 | /** | |
24 | * Wrap PyThreadState to carry a record of which POSIX thread | |
25 | * the thread state relates to. This allows the Gil class to | |
26 | * validate that we're being used from the right thread. | |
27 | */ | |
28 | class SafeThreadState | |
29 | { | |
30 | public: | |
31 | SafeThreadState(PyThreadState *ts_); | |
32 | ||
33 | SafeThreadState() | |
34 | : ts(nullptr), thread(0) | |
35 | { | |
36 | } | |
37 | ||
38 | PyThreadState *ts; | |
39 | pthread_t thread; | |
40 | ||
41 | void set(PyThreadState *ts_) | |
42 | { | |
43 | ts = ts_; | |
44 | thread = pthread_self(); | |
45 | } | |
46 | }; | |
31f18b77 FG |
47 | |
48 | // | |
49 | // Use one of these in any scope in which you need to hold Python's | |
50 | // Global Interpreter Lock. | |
51 | // | |
52 | // Do *not* nest these, as a second GIL acquire will deadlock (see | |
53 | // https://docs.python.org/2/c-api/init.html#c.PyEval_RestoreThread) | |
54 | // | |
55 | // If in doubt, explicitly put a scope around the block of code you | |
56 | // know you need the GIL in. | |
57 | // | |
3efd9988 | 58 | // See the comment in Gil::Gil for when to set new_thread == true |
31f18b77 FG |
59 | // |
60 | class Gil { | |
61 | public: | |
62 | Gil(const Gil&) = delete; | |
63 | Gil& operator=(const Gil&) = delete; | |
64 | ||
3efd9988 FG |
65 | Gil(SafeThreadState &ts, bool new_thread = false); |
66 | ~Gil(); | |
31f18b77 FG |
67 | |
68 | private: | |
3efd9988 | 69 | SafeThreadState &pThreadState; |
31f18b77 FG |
70 | PyThreadState *pNewThreadState = nullptr; |
71 | }; | |
72 |