[pypy-commit] pypy cffi-static-callback-embedding: Add missing files

arigo pypy.commits at gmail.com
Fri Jan 15 11:33:55 EST 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: cffi-static-callback-embedding
Changeset: r81808:41c7ca112116
Date: 2016-01-15 16:14 +0000
http://bitbucket.org/pypy/pypy/changeset/41c7ca112116/

Log:	Add missing files

diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/add1-test.c b/pypy/module/test_lib_pypy/cffi_tests/embedding/add1-test.c
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/add1-test.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+extern int add1(int, int);
+
+
+int main(void)
+{
+    int x, y;
+    x = add1(40, 2);
+    y = add1(100, -5);
+    printf("got: %d %d\n", x, y);
+    return 0;
+}
diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/add2-test.c b/pypy/module/test_lib_pypy/cffi_tests/embedding/add2-test.c
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/add2-test.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+extern int add1(int, int);
+extern int add2(int, int, int);
+
+
+int main(void)
+{
+    int x, y;
+    x = add1(40, 2);
+    y = add2(100, -5, -20);
+    printf("got: %d %d\n", x, y);
+    return 0;
+}
diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/add_recursive-test.c b/pypy/module/test_lib_pypy/cffi_tests/embedding/add_recursive-test.c
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/add_recursive-test.c
@@ -0,0 +1,27 @@
+#include <stdio.h>
+
+#ifdef _MSC_VER
+#  define DLLIMPORT  __declspec(dllimport)
+#else
+#  define DLLIMPORT  extern
+#endif
+
+DLLIMPORT int add_rec(int, int);
+DLLIMPORT int (*my_callback)(int);
+
+static int some_callback(int x)
+{
+    printf("some_callback(%d)\n", x);
+    fflush(stdout);
+    return add_rec(x, 9);
+}
+
+int main(void)
+{
+    int x, y;
+    my_callback = some_callback;
+    x = add_rec(40, 2);
+    y = add_rec(100, -5);
+    printf("got: %d %d\n", x, y);
+    return 0;
+}
diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/perf-test.c b/pypy/module/test_lib_pypy/cffi_tests/embedding/perf-test.c
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/perf-test.c
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <assert.h>
+#include <sys/time.h>
+#ifdef PTEST_USE_THREAD
+# include <pthread.h>
+# include <semaphore.h>
+static sem_t done;
+#endif
+
+
+extern int add1(int, int);
+
+
+static double time_delta(struct timeval *stop, struct timeval *start)
+{
+    return (stop->tv_sec - start->tv_sec) +
+        1e-6 * (stop->tv_usec - start->tv_usec);
+}
+
+static double measure(void)
+{
+    long long i, iterations;
+    int result;
+    struct timeval start, stop;
+    double elapsed;
+
+    add1(0, 0);   /* prepare off-line */
+
+    i = 0;
+    iterations = 1000;
+    result = gettimeofday(&start, NULL);
+    assert(result == 0);
+
+    while (1) {
+        for (; i < iterations; i++) {
+            add1(((int)i) & 0xaaaaaa, ((int)i) & 0x555555);
+        }
+        result = gettimeofday(&stop, NULL);
+        assert(result == 0);
+
+        elapsed = time_delta(&stop, &start);
+        assert(elapsed >= 0.0);
+        if (elapsed > 2.5)
+            break;
+        iterations = iterations * 3 / 2;
+    }
+
+    return elapsed / (double)iterations;
+}
+
+static void *start_routine(void *arg)
+{
+    double t = measure();
+    printf("time per call: %.3g\n", t);
+
+#ifdef PTEST_USE_THREAD
+    int status = sem_post(&done);
+    assert(status == 0);
+#endif
+
+    return arg;
+}
+
+
+int main(void)
+{
+#ifndef PTEST_USE_THREAD
+    start_routine(0);
+#else
+    pthread_t th;
+    int i, status = sem_init(&done, 0, 0);
+    assert(status == 0);
+
+    add1(0, 0);   /* this is the main thread */
+
+    for (i = 0; i < PTEST_USE_THREAD; i++) {
+        status = pthread_create(&th, NULL, start_routine, NULL);
+        assert(status == 0);
+    }
+    for (i = 0; i < PTEST_USE_THREAD; i++) {
+        status = sem_wait(&done);
+        assert(status == 0);
+    }
+#endif
+    return 0;
+}
diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/thread-test.h b/pypy/module/test_lib_pypy/cffi_tests/embedding/thread-test.h
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/thread-test.h
@@ -0,0 +1,62 @@
+/************************************************************/
+#ifndef _MSC_VER
+/************************************************************/
+
+
+#include <pthread.h>
+#include <semaphore.h>
+
+
+/************************************************************/
+#else
+/************************************************************/
+
+
+/* Very quick and dirty, just what I need for these tests.
+   Don't use directly in any real code! 
+*/
+
+#include <Windows.h>
+#include <assert.h>
+
+typedef HANDLE sem_t;
+typedef HANDLE pthread_t;
+
+int sem_init(sem_t *sem, int pshared, unsigned int value)
+{
+    assert(pshared == 0);
+    assert(value == 0);
+    *sem = CreateSemaphore(NULL, 0, 999, NULL);
+    return *sem ? 0 : -1;
+}
+
+int sem_post(sem_t *sem)
+{
+    return ReleaseSemaphore(*sem, 1, NULL) ? 0 : -1;
+}
+
+int sem_wait(sem_t *sem)
+{
+    WaitForSingleObject(*sem, INFINITE);
+    return 0;
+}
+
+DWORD WINAPI myThreadProc(LPVOID lpParameter)
+{
+    void *(* start_routine)(void *) = (void *(*)(void *))lpParameter;
+    start_routine(NULL);
+    return 0;
+}
+
+int pthread_create(pthread_t *thread, void *attr,
+                   void *start_routine(void *), void *arg)
+{
+    assert(arg == NULL);
+    *thread = CreateThread(NULL, 0, myThreadProc, start_routine, 0, NULL);
+    return *thread ? 0 : -1;
+}
+
+
+/************************************************************/
+#endif
+/************************************************************/
diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/thread1-test.c b/pypy/module/test_lib_pypy/cffi_tests/embedding/thread1-test.c
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/thread1-test.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <assert.h>
+#include "thread-test.h"
+
+#define NTHREADS 10
+
+
+extern int add1(int, int);
+
+static sem_t done;
+
+
+static void *start_routine(void *arg)
+{
+    int x, status;
+    x = add1(40, 2);
+    assert(x == 42);
+
+    status = sem_post(&done);
+    assert(status == 0);
+
+    return arg;
+}
+
+int main(void)
+{
+    pthread_t th;
+    int i, status = sem_init(&done, 0, 0);
+    assert(status == 0);
+
+    printf("starting\n");
+    fflush(stdout);
+    for (i = 0; i < NTHREADS; i++) {
+        status = pthread_create(&th, NULL, start_routine, NULL);
+        assert(status == 0);
+    }
+    for (i = 0; i < NTHREADS; i++) {
+        status = sem_wait(&done);
+        assert(status == 0);
+    }
+    printf("done\n");
+    return 0;
+}
diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/thread2-test.c b/pypy/module/test_lib_pypy/cffi_tests/embedding/thread2-test.c
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/thread2-test.c
@@ -0,0 +1,57 @@
+#include <stdio.h>
+#include <assert.h>
+#include "thread-test.h"
+
+extern int add1(int, int);
+extern int add2(int, int, int);
+
+static sem_t done;
+
+
+static void *start_routine_1(void *arg)
+{
+    int x, status;
+    x = add1(40, 2);
+    assert(x == 42);
+
+    status = sem_post(&done);
+    assert(status == 0);
+
+    return arg;
+}
+
+static void *start_routine_2(void *arg)
+{
+    int x, status;
+#ifdef T2TEST_AGAIN_ADD1
+    add1(-1, -1);
+#endif
+    x = add2(1000, 200, 30);
+    assert(x == 1230);
+
+    status = sem_post(&done);
+    assert(status == 0);
+
+    return arg;
+}
+
+int main(void)
+{
+    pthread_t th;
+    int i, status = sem_init(&done, 0, 0);
+    assert(status == 0);
+
+    printf("starting\n");
+    fflush(stdout);
+    status = pthread_create(&th, NULL, start_routine_1, NULL);
+    assert(status == 0);
+    status = pthread_create(&th, NULL, start_routine_2, NULL);
+    assert(status == 0);
+
+    for (i = 0; i < 2; i++) {
+        status = sem_wait(&done);
+        assert(status == 0);
+    }
+    printf("done\n");
+    return 0;
+}
diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/thread3-test.c b/pypy/module/test_lib_pypy/cffi_tests/embedding/thread3-test.c
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/thread3-test.c
@@ -0,0 +1,55 @@
+#include <stdio.h>
+#include <assert.h>
+#include "thread-test.h"
+
+extern int add2(int, int, int);
+extern int add3(int, int, int, int);
+
+static sem_t done;
+
+
+static void *start_routine_2(void *arg)
+{
+    int x, status;
+    x = add2(40, 2, 100);
+    assert(x == 142);
+
+    status = sem_post(&done);
+    assert(status == 0);
+
+    return arg;
+}
+
+static void *start_routine_3(void *arg)
+{
+    int x, status;
+    x = add3(1000, 200, 30, 4);
+    assert(x == 1234);
+
+    status = sem_post(&done);
+    assert(status == 0);
+
+    return arg;
+}
+
+int main(void)
+{
+    pthread_t th;
+    int i, status = sem_init(&done, 0, 0);
+    assert(status == 0);
+
+    printf("starting\n");
+    fflush(stdout);
+    for (i = 0; i < 10; i++) {
+        status = pthread_create(&th, NULL, start_routine_2, NULL);
+        assert(status == 0);
+        status = pthread_create(&th, NULL, start_routine_3, NULL);
+        assert(status == 0);
+    }
+    for (i = 0; i < 20; i++) {
+        status = sem_wait(&done);
+        assert(status == 0);
+    }
+    printf("done\n");
+    return 0;
+}
diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/tlocal-test.c b/pypy/module/test_lib_pypy/cffi_tests/embedding/tlocal-test.c
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/tlocal-test.c
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <assert.h>
+#include "thread-test.h"
+
+#define NTHREADS 10
+
+
+extern int add1(int, int);
+
+static sem_t done;
+
+
+static void *start_routine(void *arg)
+{
+    int i, x, expected, status;
+
+    expected = add1(40, 2);
+    assert((expected % 1000) == 42);
+
+    for (i=0; i<10; i++) {
+        x = add1(50, i);
+        assert(x == expected + 8 + i);
+    }
+
+    status = sem_post(&done);
+    assert(status == 0);
+
+    return arg;
+}
+
+int main(void)
+{
+    pthread_t th;
+    int i, status = sem_init(&done, 0, 0);
+    assert(status == 0);
+
+    for (i = 0; i < NTHREADS; i++) {
+        status = pthread_create(&th, NULL, start_routine, NULL);
+        assert(status == 0);
+    }
+    for (i = 0; i < NTHREADS; i++) {
+        status = sem_wait(&done);
+        assert(status == 0);
+    }
+    printf("done\n");
+    return 0;
+}


More information about the pypy-commit mailing list