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