You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.2 KiB
43 lines
1.2 KiB
import sys, time
|
|
sys.path.insert(0, sys.argv[1])
|
|
from cffi import FFI
|
|
|
|
def _run_callback_in_thread():
|
|
ffi = FFI()
|
|
ffi.cdef("""
|
|
typedef int (*mycallback_func_t)(int, int);
|
|
int threaded_ballback_test(mycallback_func_t mycb);
|
|
""")
|
|
lib = ffi.verify("""
|
|
#include <pthread.h>
|
|
typedef int (*mycallback_func_t)(int, int);
|
|
void *my_wait_function(void *ptr) {
|
|
mycallback_func_t cbfunc = (mycallback_func_t)ptr;
|
|
cbfunc(10, 10);
|
|
cbfunc(12, 15);
|
|
return NULL;
|
|
}
|
|
int threaded_ballback_test(mycallback_func_t mycb) {
|
|
pthread_t thread;
|
|
pthread_create(&thread, NULL, my_wait_function, (void*)mycb);
|
|
return 0;
|
|
}
|
|
""", extra_compile_args=['-pthread'])
|
|
seen = []
|
|
@ffi.callback('int(*)(int,int)')
|
|
def mycallback(x, y):
|
|
time.sleep(0.022)
|
|
seen.append((x, y))
|
|
return 0
|
|
lib.threaded_ballback_test(mycallback)
|
|
count = 300
|
|
while len(seen) != 2:
|
|
time.sleep(0.01)
|
|
count -= 1
|
|
assert count > 0, "timeout"
|
|
assert seen == [(10, 10), (12, 15)]
|
|
|
|
print('STARTING')
|
|
_run_callback_in_thread()
|
|
print('DONE')
|