esp32/mpthreadport: Use binary semaphore instead of mutex.

So a lock can be acquired on one Python thread and then released on
another.  A test for this is added.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George 2021-05-08 18:17:27 +10:00
parent 31e0b8c71c
commit 864e4ecc47
2 changed files with 20 additions and 1 deletions

View File

@ -192,7 +192,10 @@ void vPortCleanUpTCB(void *tcb) {
} }
void mp_thread_mutex_init(mp_thread_mutex_t *mutex) { void mp_thread_mutex_init(mp_thread_mutex_t *mutex) {
mutex->handle = xSemaphoreCreateMutexStatic(&mutex->buffer); // Need a binary semaphore so a lock can be acquired on one Python thread
// and then released on another.
mutex->handle = xSemaphoreCreateBinaryStatic(&mutex->buffer);
xSemaphoreGive(mutex->handle);
} }
int mp_thread_mutex_lock(mp_thread_mutex_t *mutex, int wait) { int mp_thread_mutex_lock(mp_thread_mutex_t *mutex, int wait) {

View File

@ -0,0 +1,16 @@
# test _thread lock objects where a lock is acquired/released by a different thread
import _thread
def thread_entry():
print("thread about to release lock")
lock.release()
lock = _thread.allocate_lock()
lock.acquire()
_thread.start_new_thread(thread_entry, ())
lock.acquire()
print("main has lock")
lock.release()