diff options
-rw-r--r-- | libusb/version_nano.h | 2 | ||||
-rw-r--r-- | tests/Makefile.am | 6 | ||||
-rw-r--r-- | tests/stress_mt.c | 45 |
3 files changed, 52 insertions, 1 deletions
diff --git a/libusb/version_nano.h b/libusb/version_nano.h index fe58632..4bdd50e 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h @@ -1 +1 @@ -#define LIBUSB_NANO 11751 +#define LIBUSB_NANO 11752 diff --git a/tests/Makefile.am b/tests/Makefile.am index cf6237e..d47d4ed 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -6,6 +6,12 @@ stress_SOURCES = stress.c libusb_testlib.h testlib.c noinst_PROGRAMS = stress +if PLATFORM_POSIX +stress_mt_SOURCES = stress_mt.c + +noinst_PROGRAMS += stress_mt +endif + if BUILD_UMOCKDEV_TEST # NOTE: We add libumockdev-preload.so so that we can run tests in-process # We also use -Wl,-lxxx as the compiler doesn't need it and libtool diff --git a/tests/stress_mt.c b/tests/stress_mt.c new file mode 100644 index 0000000..0299bfc --- /dev/null +++ b/tests/stress_mt.c @@ -0,0 +1,45 @@ +#include <libusb.h> +#include <stdio.h> +#include <pthread.h> + +/* Test that creates and destroys contexts repeatedly */ + +#define NTHREADS 8 +#define ITERS 64 + +static void *test_init_and_exit(void * arg) +{ + long int threadno = (long int) arg; + + printf("Thread %ld started\n", threadno); + for (int i = 0; i < ITERS; ++i) { + libusb_context *ctx = NULL; + int r; + + r = libusb_init(&ctx); + if (r != LIBUSB_SUCCESS) { + printf("Failed to init libusb on iteration %d: %d", i, r); + return NULL; + } + libusb_exit(ctx); + } + printf("Thread %ld done\n", threadno); + return NULL; +} + +int main(void) +{ + pthread_t threadId[NTHREADS]; + long int t; + + printf("Starting multithreaded init and exit test...\n"); + for(t = 0; t < NTHREADS; t++) + pthread_create(&threadId[t], NULL, &test_init_and_exit, (void *) t); + + for(t = 0; t < NTHREADS; t++) + pthread_join(threadId[t], NULL); + + printf("All Done\n"); + + return 0; +} |