IOInterrupter actions are now atomic

This commit is contained in:
Quentin Renard
2025-03-01 14:28:34 +01:00
parent 948d39059d
commit f136032704
5 changed files with 25 additions and 7 deletions

11
atomic.c Normal file
View File

@@ -0,0 +1,11 @@
#include <stdatomic.h>
int astiavAtomicLoadInt(atomic_int* i)
{
return atomic_load(i);
}
void astiavAtomicStoreInt(atomic_int* i, int v)
{
return atomic_store(i, v);
}

4
atomic.h Normal file
View File

@@ -0,0 +1,4 @@
#include <stdatomic.h>
int astiavAtomicLoadInt(atomic_int* i);
void astiavAtomicStoreInt(atomic_int* i, int v);

View File

@@ -1,13 +1,14 @@
#include <libavformat/avio.h>
#include <libavutil/mem.h>
#include <stdatomic.h>
#include <stdlib.h>
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;

View File

@@ -1,5 +1,6 @@
package astiav
//#include "atomic.h"
//#include "io_interrupter.h"
//#include <libavutil/mem.h>
//#include <stdlib.h>
@@ -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)
}

View File

@@ -1,4 +1,5 @@
#include <libavformat/avio.h>
#include <stdatomic.h>
int astiavInterruptCallback(void *ret);
AVIOInterruptCB* astiavNewInterruptCallback(int *ret);
AVIOInterruptCB* astiavNewInterruptCallback(atomic_int *ret);