summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/gc.c11
-rw-r--r--py/mpconfig.h5
-rw-r--r--py/mpstate.h2
-rw-r--r--py/mpthread.h6
4 files changed, 18 insertions, 6 deletions
diff --git a/py/gc.c b/py/gc.c
index 3d48e06249..6a3f48ac3c 100644
--- a/py/gc.c
+++ b/py/gc.c
@@ -113,9 +113,12 @@
#endif
#if MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL
-#define GC_ENTER() mp_thread_mutex_lock(&MP_STATE_MEM(gc_mutex), 1)
-#define GC_EXIT() mp_thread_mutex_unlock(&MP_STATE_MEM(gc_mutex))
+#define GC_MUTEX_INIT() mp_thread_recursive_mutex_init(&MP_STATE_MEM(gc_mutex))
+#define GC_ENTER() mp_thread_recursive_mutex_lock(&MP_STATE_MEM(gc_mutex), 1)
+#define GC_EXIT() mp_thread_recursive_mutex_unlock(&MP_STATE_MEM(gc_mutex))
#else
+// Either no threading, or assume callers to gc_collect() hold the GIL
+#define GC_MUTEX_INIT()
#define GC_ENTER()
#define GC_EXIT()
#endif
@@ -210,9 +213,7 @@ void gc_init(void *start, void *end) {
MP_STATE_MEM(gc_alloc_amount) = 0;
#endif
- #if MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL
- mp_thread_mutex_init(&MP_STATE_MEM(gc_mutex));
- #endif
+ GC_MUTEX_INIT();
}
#if MICROPY_GC_SPLIT_HEAP
diff --git a/py/mpconfig.h b/py/mpconfig.h
index e84d258a12..64138a9ea7 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -1629,6 +1629,11 @@ typedef double mp_float_t;
#define MICROPY_PY_THREAD_GIL_VM_DIVISOR (32)
#endif
+// Is a recursive mutex type in use?
+#ifndef MICROPY_PY_THREAD_RECURSIVE_MUTEX
+#define MICROPY_PY_THREAD_RECURSIVE_MUTEX (MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL)
+#endif
+
// Extended modules
#ifndef MICROPY_PY_ASYNCIO
diff --git a/py/mpstate.h b/py/mpstate.h
index 51f290b55b..138c561730 100644
--- a/py/mpstate.h
+++ b/py/mpstate.h
@@ -145,7 +145,7 @@ typedef struct _mp_state_mem_t {
#if MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL
// This is a global mutex used to make the GC thread-safe.
- mp_thread_mutex_t gc_mutex;
+ mp_thread_recursive_mutex_t gc_mutex;
#endif
} mp_state_mem_t;
diff --git a/py/mpthread.h b/py/mpthread.h
index f335cc0291..795f230bb4 100644
--- a/py/mpthread.h
+++ b/py/mpthread.h
@@ -48,6 +48,12 @@ void mp_thread_mutex_init(mp_thread_mutex_t *mutex);
int mp_thread_mutex_lock(mp_thread_mutex_t *mutex, int wait);
void mp_thread_mutex_unlock(mp_thread_mutex_t *mutex);
+#if MICROPY_PY_THREAD_RECURSIVE_MUTEX
+void mp_thread_recursive_mutex_init(mp_thread_recursive_mutex_t *mutex);
+int mp_thread_recursive_mutex_lock(mp_thread_recursive_mutex_t *mutex, int wait);
+void mp_thread_recursive_mutex_unlock(mp_thread_recursive_mutex_t *mutex);
+#endif
+
#endif // MICROPY_PY_THREAD
#if MICROPY_PY_THREAD && MICROPY_PY_THREAD_GIL