From f1360327042f33f9f9cf223fc9724b5e6dfaadbf Mon Sep 17 00:00:00 2001 From: Quentin Renard Date: Sat, 1 Mar 2025 14:28:34 +0100 Subject: [PATCH] IOInterrupter actions are now atomic --- atomic.c | 11 +++++++++++ atomic.h | 4 ++++ io_interrupter.c | 5 +++-- io_interrupter.go | 9 +++++---- io_interrupter.h | 3 ++- 5 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 atomic.c create mode 100644 atomic.h diff --git a/atomic.c b/atomic.c new file mode 100644 index 0000000..25150b7 --- /dev/null +++ b/atomic.c @@ -0,0 +1,11 @@ +#include + +int astiavAtomicLoadInt(atomic_int* i) +{ + return atomic_load(i); +} + +void astiavAtomicStoreInt(atomic_int* i, int v) +{ + return atomic_store(i, v); +} \ No newline at end of file diff --git a/atomic.h b/atomic.h new file mode 100644 index 0000000..e04bb44 --- /dev/null +++ b/atomic.h @@ -0,0 +1,4 @@ +#include + +int astiavAtomicLoadInt(atomic_int* i); +void astiavAtomicStoreInt(atomic_int* i, int v); \ No newline at end of file diff --git a/io_interrupter.c b/io_interrupter.c index b14868e..13ce36d 100644 --- a/io_interrupter.c +++ b/io_interrupter.c @@ -1,13 +1,14 @@ #include #include +#include #include int astiavInterruptCallback(void *ret) { - return *((int*)ret); + return atomic_load((atomic_int*)ret); } -AVIOInterruptCB* astiavNewInterruptCallback(int *ret) +AVIOInterruptCB* astiavNewInterruptCallback(atomic_int *ret) { AVIOInterruptCB* c = av_malloc(sizeof(AVIOInterruptCB)); c->callback = astiavInterruptCallback; diff --git a/io_interrupter.go b/io_interrupter.go index 7fdccca..67bc359 100644 --- a/io_interrupter.go +++ b/io_interrupter.go @@ -1,5 +1,6 @@ package astiav +//#include "atomic.h" //#include "io_interrupter.h" //#include //#include @@ -8,7 +9,7 @@ import "unsafe" type IOInterrupter struct { c *C.AVIOInterruptCB - i C.int + i C.atomic_int } func NewIOInterrupter() *IOInterrupter { @@ -25,13 +26,13 @@ func (i *IOInterrupter) Free() { } func (i *IOInterrupter) Interrupt() { - i.i = 1 + C.astiavAtomicStoreInt(&i.i, 1) } func (i *IOInterrupter) Interrupted() bool { - return i.i == 1 + return C.astiavAtomicLoadInt(&i.i) == 1 } func (i *IOInterrupter) Resume() { - i.i = 0 + C.astiavAtomicStoreInt(&i.i, 0) } diff --git a/io_interrupter.h b/io_interrupter.h index 2361f3c..9597c2d 100644 --- a/io_interrupter.h +++ b/io_interrupter.h @@ -1,4 +1,5 @@ #include +#include int astiavInterruptCallback(void *ret); -AVIOInterruptCB* astiavNewInterruptCallback(int *ret); \ No newline at end of file +AVIOInterruptCB* astiavNewInterruptCallback(atomic_int *ret); \ No newline at end of file