+
+ yaz_mutex_destroy(&p); /* OK to "destroy" NULL handle */
+}
+
+static void tst_cond(void)
+{
+ YAZ_MUTEX p = 0;
+ YAZ_COND c;
+ struct timeval abstime;
+ int r;
+
+ yaz_mutex_create(&p);
+ YAZ_CHECK(p);
+ if (!p)
+ return;
+
+ yaz_cond_create(&c);
+ if (c)
+ {
+ r = yaz_gettimeofday(&abstime);
+ YAZ_CHECK_EQ(r, 0);
+
+ abstime.tv_sec += 1; /* wait 1 second */
+
+ r = yaz_cond_wait(c, p, &abstime);
+ YAZ_CHECK(r != 0);
+
+ }
+ yaz_cond_destroy(&c);
+ YAZ_CHECK(c == 0);
+ yaz_mutex_destroy(&p);
+ YAZ_CHECK(p == 0);
+}
+
+static void *my_handler(void *arg)
+{
+ int *mydata = (int*) arg;
+ (*mydata)++;
+ return mydata;
+}
+
+static void tst_create_thread(void)
+{
+ void *return_data;
+ int mydata = 42;
+ yaz_thread_t t[2];
+
+ t[0] = yaz_thread_create(my_handler, &mydata);
+ YAZ_CHECK(t[0]);
+ t[1] = yaz_thread_create(my_handler, &mydata);
+ YAZ_CHECK(t[1]);
+
+ return_data = 0;
+ yaz_thread_join(&t[0], &return_data);
+ YAZ_CHECK(!t[0]);
+ YAZ_CHECK(return_data == &mydata);
+
+ return_data = 0;
+ yaz_thread_join(&t[1], &return_data);
+ YAZ_CHECK(!t[1]);
+ YAZ_CHECK(return_data == &mydata);
+
+ YAZ_CHECK_EQ(mydata, 44);