Viewing file: gil-1.c (2.16 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do compile } */ /* { dg-options "-fanalyzer" } */ /* { dg-require-effective-target analyzer } */
#include "gil.h"
void test_1 (void) { Py_BEGIN_ALLOW_THREADS Py_END_ALLOW_THREADS }
void test_2 (PyObject *obj) { Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */
Py_INCREF (obj); /* { dg-warning "use of PyObject '\\*obj' without the GIL" } */ Py_DECREF (obj);
Py_END_ALLOW_THREADS }
void test_3 (PyObject *obj) { Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */
Py_BEGIN_ALLOW_THREADS /* { dg-warning "nested usage of 'Py_BEGIN_ALLOW_THREADS'" } */ Py_END_ALLOW_THREADS
Py_END_ALLOW_THREADS }
void test_4 (PyObject *obj) { /* These aren't nested, so should be OK. */ Py_BEGIN_ALLOW_THREADS Py_END_ALLOW_THREADS
Py_BEGIN_ALLOW_THREADS Py_END_ALLOW_THREADS }
/* Interprocedural example of erroneously nested usage. */
static void __attribute__((noinline)) called_by_test_5 (void) { Py_BEGIN_ALLOW_THREADS /* { dg-warning "nested usage of 'Py_BEGIN_ALLOW_THREADS'" } */ Py_END_ALLOW_THREADS }
void test_5 (PyObject *obj) { Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */ called_by_test_5 (); Py_END_ALLOW_THREADS }
/* Interprocedural example of bogusly using a PyObject outside of GIL. */
static void __attribute__((noinline)) called_by_test_6 (PyObject *obj) { Py_INCREF (obj); /* { dg-warning "use of PyObject '\\*obj' without the GIL" } */ Py_DECREF (obj); }
void test_6 (PyObject *obj) { Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */ called_by_test_6 (obj); Py_END_ALLOW_THREADS }
extern void called_by_test_7 (PyObject *obj);
void test_7 (PyObject *obj) { Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */ called_by_test_7 (obj); /* { dg-warning "use of PyObject as argument 1 of 'called_by_test_7' without the GIL" } */ Py_END_ALLOW_THREADS }
typedef void (*callback_t) (PyObject *);
void test_8 (PyObject *obj, callback_t cb) { Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */ cb (obj); /* { dg-warning "use of PyObject as argument 1 of call without the GIL" } */ Py_END_ALLOW_THREADS }
|