xref: /haiku/src/system/libroot/posix/pthread/pthread_condattr.c (revision 10b4fed24fc5c2ad8f53145e91ca6caa6a3950ce)
1 /*
2  * Copyright 2007, Ryan Leavengood, leavengood@gmail.com.
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <pthread.h>
8 #include "pthread_private.h"
9 
10 #include <stdlib.h>
11 
12 
13 int
pthread_condattr_init(pthread_condattr_t * _condAttr)14 pthread_condattr_init(pthread_condattr_t *_condAttr)
15 {
16 	pthread_condattr *attr;
17 
18 	if (_condAttr == NULL)
19 		return B_BAD_VALUE;
20 
21 	attr = (pthread_condattr *)malloc(sizeof(pthread_condattr));
22 	if (attr == NULL)
23 		return B_NO_MEMORY;
24 
25 	attr->process_shared = false;
26 	attr->clock_id = CLOCK_REALTIME;
27 
28 	*_condAttr = attr;
29 	return B_OK;
30 }
31 
32 
33 int
pthread_condattr_destroy(pthread_condattr_t * _condAttr)34 pthread_condattr_destroy(pthread_condattr_t *_condAttr)
35 {
36 	pthread_condattr *attr;
37 
38 	if (_condAttr == NULL || (attr = *_condAttr) == NULL)
39 		return B_BAD_VALUE;
40 
41 	*_condAttr = NULL;
42 	free(attr);
43 
44 	return B_OK;
45 }
46 
47 
48 int
pthread_condattr_getpshared(const pthread_condattr_t * _condAttr,int * _processShared)49 pthread_condattr_getpshared(const pthread_condattr_t *_condAttr, int *_processShared)
50 {
51 	pthread_condattr *attr;
52 
53 	if (_condAttr == NULL || (attr = *_condAttr) == NULL || _processShared == NULL)
54 		return B_BAD_VALUE;
55 
56 	*_processShared = attr->process_shared ? PTHREAD_PROCESS_SHARED : PTHREAD_PROCESS_PRIVATE;
57 	return B_OK;
58 }
59 
60 
61 int
pthread_condattr_setpshared(pthread_condattr_t * _condAttr,int processShared)62 pthread_condattr_setpshared(pthread_condattr_t *_condAttr, int processShared)
63 {
64 	pthread_condattr *attr;
65 
66 	if (_condAttr == NULL || (attr = *_condAttr) == NULL
67 		|| processShared < PTHREAD_PROCESS_PRIVATE
68 		|| processShared > PTHREAD_PROCESS_SHARED)
69 		return B_BAD_VALUE;
70 
71 	attr->process_shared = processShared == PTHREAD_PROCESS_SHARED ? true : false;
72 	return B_OK;
73 }
74 
75 
76 int
pthread_condattr_getclock(const pthread_condattr_t * _condAttr,clockid_t * _clockID)77 pthread_condattr_getclock(const pthread_condattr_t *_condAttr, clockid_t *_clockID)
78 {
79 	pthread_condattr *attr;
80 
81 	if (_condAttr == NULL || (attr = *_condAttr) == NULL || _clockID == NULL)
82 		return B_BAD_VALUE;
83 
84 	*_clockID = attr->clock_id;
85 	return B_OK;
86 }
87 
88 
89 int
pthread_condattr_setclock(pthread_condattr_t * _condAttr,clockid_t clockID)90 pthread_condattr_setclock(pthread_condattr_t *_condAttr, clockid_t clockID)
91 {
92 	pthread_condattr *attr;
93 
94 	if (_condAttr == NULL || (attr = *_condAttr) == NULL
95 		|| (clockID != CLOCK_REALTIME && clockID != CLOCK_MONOTONIC))
96 		return B_BAD_VALUE;
97 
98 	attr->clock_id = clockID;
99 	return B_OK;
100 }
101