1570af302Sopenharmony_ci// commit: 9d5251f72b627974bcf438501e07ad42c24d94be 2011-03-08
2570af302Sopenharmony_ci// disallow cpu time clocks in condattr
3570af302Sopenharmony_ci#include <pthread.h>
4570af302Sopenharmony_ci#include <time.h>
5570af302Sopenharmony_ci#include <string.h>
6570af302Sopenharmony_ci#include <errno.h>
7570af302Sopenharmony_ci#include "test.h"
8570af302Sopenharmony_ci
9570af302Sopenharmony_ci#define T(r,f) if ((r=(f))) t_error(#f " failed: %s\n", strerror(r))
10570af302Sopenharmony_ci
11570af302Sopenharmony_ciint main(void)
12570af302Sopenharmony_ci{
13570af302Sopenharmony_ci	pthread_cond_t c;
14570af302Sopenharmony_ci	pthread_condattr_t a;
15570af302Sopenharmony_ci	pthread_mutex_t m;
16570af302Sopenharmony_ci	clockid_t clk;
17570af302Sopenharmony_ci	struct timespec ts;
18570af302Sopenharmony_ci	void *p;
19570af302Sopenharmony_ci	int r;
20570af302Sopenharmony_ci
21570af302Sopenharmony_ci	T(r,pthread_condattr_init(&a));
22570af302Sopenharmony_ci	r = pthread_condattr_setclock(&a, CLOCK_PROCESS_CPUTIME_ID);
23570af302Sopenharmony_ci	if (r != EINVAL)
24570af302Sopenharmony_ci		t_error("pthread_condattr_setclock CLOCK_PROCESS_CPUTIME_ID should fail with EINVAL, got %s\n", strerror(r));
25570af302Sopenharmony_ci	r = pthread_condattr_setclock(&a, CLOCK_THREAD_CPUTIME_ID);
26570af302Sopenharmony_ci	if (r != EINVAL)
27570af302Sopenharmony_ci		t_error("pthread_condattr_setclock CLOCK_THREAD_CPUTIME_ID should fail with EINVAL, got %s\n", strerror(r));
28570af302Sopenharmony_ci	T(r,pthread_condattr_getclock(&a, &clk));
29570af302Sopenharmony_ci	if (clk != CLOCK_REALTIME)
30570af302Sopenharmony_ci		t_error("condattr default clock is %d, wanted CLOCK_REALTIME (%d)\n", (int)clk, (int)CLOCK_REALTIME);
31570af302Sopenharmony_ci
32570af302Sopenharmony_ci	T(r,pthread_cond_init(&c, &a));
33570af302Sopenharmony_ci	T(r,pthread_mutex_init(&m, 0));
34570af302Sopenharmony_ci	T(r,pthread_mutex_lock(&m));
35570af302Sopenharmony_ci	r = clock_gettime(CLOCK_REALTIME, &ts);
36570af302Sopenharmony_ci	if (r)
37570af302Sopenharmony_ci		t_error("clock_gettime failed: %s\n", strerror(errno));
38570af302Sopenharmony_ci	/* wait 10ms */
39570af302Sopenharmony_ci	ts.tv_nsec += 10*1000*1000;
40570af302Sopenharmony_ci	if (ts.tv_nsec >= 1000*1000*1000) {
41570af302Sopenharmony_ci		ts.tv_nsec -= 1000*1000*1000;
42570af302Sopenharmony_ci		ts.tv_sec += 1;
43570af302Sopenharmony_ci	}
44570af302Sopenharmony_ci	r = pthread_cond_timedwait(&c, &m, &ts);
45570af302Sopenharmony_ci	if (r != ETIMEDOUT)
46570af302Sopenharmony_ci		t_error("pthread_cond_timedwait did not timeout, returned %s\n", strerror(r));
47570af302Sopenharmony_ci	T(r,pthread_mutex_unlock(&m));
48570af302Sopenharmony_ci
49570af302Sopenharmony_ci	T(r,pthread_mutex_destroy(&m));
50570af302Sopenharmony_ci	T(r,pthread_cond_destroy(&c));
51570af302Sopenharmony_ci	T(r,pthread_condattr_destroy(&a));
52570af302Sopenharmony_ci	return t_status;
53570af302Sopenharmony_ci}
54