@@ -49,19 +49,21 @@ int fossil_threads_cond_init(fossil_threads_cond_t *c) {
4949
5050#if defined(_WIN32 )
5151 CONDITION_VARIABLE * cv = (CONDITION_VARIABLE * )malloc (sizeof (CONDITION_VARIABLE ));
52- if (!cv ) return FOSSIL_THREADS_COND_EINTERNAL ;
52+ if (!cv ) return FOSSIL_THREADS_COND_ENOMEM ;
5353 InitializeConditionVariable (cv );
5454 c -> handle = cv ;
5555#else
5656 pthread_cond_t * pc = (pthread_cond_t * )malloc (sizeof (pthread_cond_t ));
57- if (!pc ) return FOSSIL_THREADS_COND_EINTERNAL ;
57+ if (!pc ) return FOSSIL_THREADS_COND_ENOMEM ;
5858 if (pthread_cond_init (pc , NULL ) != 0 ) {
5959 free (pc );
6060 return FOSSIL_THREADS_COND_EINTERNAL ;
6161 }
6262 c -> handle = pc ;
6363#endif
6464 c -> valid = 1 ;
65+ c -> is_broadcast = 0 ;
66+ c -> waiters = 0 ;
6567 return FOSSIL_THREADS_COND_OK ;
6668}
6769
@@ -86,19 +88,32 @@ void fossil_threads_cond_dispose(fossil_threads_cond_t *c) {
8688int fossil_threads_cond_wait (fossil_threads_cond_t * c , fossil_threads_mutex_t * m ) {
8789 if (!c || !m || !c -> valid || !m -> valid ) return FOSSIL_THREADS_COND_EINVAL ;
8890
91+ c -> waiters ++ ;
8992#if defined(_WIN32 )
9093 if (!SleepConditionVariableCS (
9194 (CONDITION_VARIABLE * )c -> handle ,
9295 (CRITICAL_SECTION * )m -> handle ,
9396 INFINITE ))
9497 {
98+ c -> waiters -- ;
9599 return FOSSIL_THREADS_COND_EINTERNAL ;
96100 }
101+ c -> waiters -- ;
97102 return FOSSIL_THREADS_COND_OK ;
98103#else
99104 int rc = pthread_cond_wait ((pthread_cond_t * )c -> handle ,
100105 (pthread_mutex_t * )m -> handle );
101- return rc == 0 ? FOSSIL_THREADS_COND_OK : rc ;
106+ c -> waiters -- ;
107+ if (rc == 0 ) return FOSSIL_THREADS_COND_OK ;
108+ if (rc == EINVAL ) return FOSSIL_THREADS_COND_EINVAL ;
109+ if (rc == EAGAIN ) return FOSSIL_THREADS_COND_EAGAIN ;
110+ if (rc == ENOMEM ) return FOSSIL_THREADS_COND_ENOMEM ;
111+ if (rc == EPERM ) return FOSSIL_THREADS_COND_EPERM ;
112+ if (rc == EBUSY ) return FOSSIL_THREADS_COND_EBUSY ;
113+ if (rc == EDEADLK ) return FOSSIL_THREADS_COND_EDEADLK ;
114+ if (rc == ENOENT ) return FOSSIL_THREADS_COND_ENOENT ;
115+ if (rc == ENOSYS ) return FOSSIL_THREADS_COND_ENOSYS ;
116+ return FOSSIL_THREADS_COND_EINTERNAL ;
102117#endif
103118}
104119
@@ -107,12 +122,14 @@ int fossil_threads_cond_timedwait(fossil_threads_cond_t *c,
107122 unsigned int ms ) {
108123 if (!c || !m || !c -> valid || !m -> valid ) return FOSSIL_THREADS_COND_EINVAL ;
109124
125+ c -> waiters ++ ;
110126#if defined(_WIN32 )
111127 BOOL ok = SleepConditionVariableCS (
112128 (CONDITION_VARIABLE * )c -> handle ,
113129 (CRITICAL_SECTION * )m -> handle ,
114130 ms
115131 );
132+ c -> waiters -- ;
116133 if (ok ) return FOSSIL_THREADS_COND_OK ;
117134 if (GetLastError () == ERROR_TIMEOUT ) return FOSSIL_THREADS_COND_ETIMEDOUT ;
118135 return FOSSIL_THREADS_COND_EINTERNAL ;
@@ -130,30 +147,77 @@ int fossil_threads_cond_timedwait(fossil_threads_cond_t *c,
130147 int rc = pthread_cond_timedwait ((pthread_cond_t * )c -> handle ,
131148 (pthread_mutex_t * )m -> handle ,
132149 & ts );
150+ c -> waiters -- ;
133151 if (rc == 0 ) return FOSSIL_THREADS_COND_OK ;
134152 if (rc == ETIMEDOUT ) return FOSSIL_THREADS_COND_ETIMEDOUT ;
135- return rc ;
153+ if (rc == EINVAL ) return FOSSIL_THREADS_COND_EINVAL ;
154+ if (rc == EAGAIN ) return FOSSIL_THREADS_COND_EAGAIN ;
155+ if (rc == ENOMEM ) return FOSSIL_THREADS_COND_ENOMEM ;
156+ if (rc == EPERM ) return FOSSIL_THREADS_COND_EPERM ;
157+ if (rc == EBUSY ) return FOSSIL_THREADS_COND_EBUSY ;
158+ if (rc == EDEADLK ) return FOSSIL_THREADS_COND_EDEADLK ;
159+ if (rc == ENOENT ) return FOSSIL_THREADS_COND_ENOENT ;
160+ if (rc == ENOSYS ) return FOSSIL_THREADS_COND_ENOSYS ;
161+ return FOSSIL_THREADS_COND_EINTERNAL ;
136162#endif
137163}
138164
139165int fossil_threads_cond_signal (fossil_threads_cond_t * c ) {
140166 if (!c || !c -> valid ) return FOSSIL_THREADS_COND_EINVAL ;
141167
168+ c -> is_broadcast = 0 ;
142169#if defined(_WIN32 )
143170 WakeConditionVariable ((CONDITION_VARIABLE * )c -> handle );
144171 return FOSSIL_THREADS_COND_OK ;
145172#else
146- return pthread_cond_signal ((pthread_cond_t * )c -> handle );
173+ int rc = pthread_cond_signal ((pthread_cond_t * )c -> handle );
174+ if (rc == 0 ) return FOSSIL_THREADS_COND_OK ;
175+ if (rc == EINVAL ) return FOSSIL_THREADS_COND_EINVAL ;
176+ if (rc == ENOMEM ) return FOSSIL_THREADS_COND_ENOMEM ;
177+ if (rc == EBUSY ) return FOSSIL_THREADS_COND_EBUSY ;
178+ if (rc == EPERM ) return FOSSIL_THREADS_COND_EPERM ;
179+ if (rc == EDEADLK ) return FOSSIL_THREADS_COND_EDEADLK ;
180+ if (rc == ENOENT ) return FOSSIL_THREADS_COND_ENOENT ;
181+ if (rc == EAGAIN ) return FOSSIL_THREADS_COND_EAGAIN ;
182+ if (rc == ENOSYS ) return FOSSIL_THREADS_COND_ENOSYS ;
183+ return FOSSIL_THREADS_COND_EINTERNAL ;
147184#endif
148185}
149186
150187int fossil_threads_cond_broadcast (fossil_threads_cond_t * c ) {
151188 if (!c || !c -> valid ) return FOSSIL_THREADS_COND_EINVAL ;
152189
190+ c -> is_broadcast = 1 ;
153191#if defined(_WIN32 )
154192 WakeAllConditionVariable ((CONDITION_VARIABLE * )c -> handle );
155193 return FOSSIL_THREADS_COND_OK ;
156194#else
157- return pthread_cond_broadcast ((pthread_cond_t * )c -> handle );
195+ int rc = pthread_cond_broadcast ((pthread_cond_t * )c -> handle );
196+ if (rc == 0 ) return FOSSIL_THREADS_COND_OK ;
197+ if (rc == EINVAL ) return FOSSIL_THREADS_COND_EINVAL ;
198+ if (rc == ENOMEM ) return FOSSIL_THREADS_COND_ENOMEM ;
199+ if (rc == EBUSY ) return FOSSIL_THREADS_COND_EBUSY ;
200+ if (rc == EPERM ) return FOSSIL_THREADS_COND_EPERM ;
201+ if (rc == EDEADLK ) return FOSSIL_THREADS_COND_EDEADLK ;
202+ if (rc == ENOENT ) return FOSSIL_THREADS_COND_ENOENT ;
203+ if (rc == EAGAIN ) return FOSSIL_THREADS_COND_EAGAIN ;
204+ if (rc == ENOSYS ) return FOSSIL_THREADS_COND_ENOSYS ;
205+ return FOSSIL_THREADS_COND_EINTERNAL ;
158206#endif
159207}
208+
209+ int fossil_threads_cond_is_valid (const fossil_threads_cond_t * c ) {
210+ if (!c ) return 0 ;
211+ return c -> valid ? 1 : 0 ;
212+ }
213+
214+ int fossil_threads_cond_waiter_count (const fossil_threads_cond_t * c ) {
215+ if (!c || !c -> valid ) return -1 ;
216+ return c -> waiters ;
217+ }
218+
219+ int fossil_threads_cond_reset (fossil_threads_cond_t * c ) {
220+ if (!c ) return FOSSIL_THREADS_COND_EINVAL ;
221+ fossil_threads_cond_dispose (c );
222+ return fossil_threads_cond_init (c );
223+ }
0 commit comments