Commits

Armin Rigo  committed 5e05b29

Added a test for caae153920ef.

  • Participants
  • Parent commits caae153

Comments (0)

Files changed (2)

File testing/callback_in_thread.py

+import time
+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):
+        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'

File testing/test_verify.py

     assert res2.x == 32
     assert res2.y == 18
     py.test.raises(TypeError, lib.sum_coord, res2)
+
+def test_callback_in_thread():
+    if sys.platform == 'win32':
+        py.test.skip("pthread only")
+    import subprocess
+    g = subprocess.Popen([sys.executable, 'callback_in_thread.py'])
+    result = g.wait()
+    assert result == 0