123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- #include <stdlib.h>
- #include "pthread.h"
- #include "implement.h"
- int
- pthread_cond_destroy (pthread_cond_t * cond)
- {
- pthread_cond_t cv;
- int result = 0, result1 = 0, result2 = 0;
-
- if (cond == NULL || *cond == NULL)
- {
- return EINVAL;
- }
- if (*cond != PTHREAD_COND_INITIALIZER)
- {
- pte_osMutexLock (pte_cond_list_lock);
- cv = *cond;
-
- if (sem_wait (&(cv->semBlockLock)) != 0)
- {
- return errno;
- }
-
- if ((result = pthread_mutex_trylock (&(cv->mtxUnblockLock))) != 0)
- {
- (void) sem_post (&(cv->semBlockLock));
- return result;
- }
-
- if (cv->nWaitersBlocked > cv->nWaitersGone)
- {
- if (sem_post (&(cv->semBlockLock)) != 0)
- {
- result = errno;
- }
- result1 = pthread_mutex_unlock (&(cv->mtxUnblockLock));
- result2 = EBUSY;
- }
- else
- {
-
- *cond = NULL;
- if (sem_destroy (&(cv->semBlockLock)) != 0)
- {
- result = errno;
- }
- if (sem_destroy (&(cv->semBlockQueue)) != 0)
- {
- result1 = errno;
- }
- if ((result2 = pthread_mutex_unlock (&(cv->mtxUnblockLock))) == 0)
- {
- result2 = pthread_mutex_destroy (&(cv->mtxUnblockLock));
- }
-
- if (pte_cond_list_head == cv)
- {
- pte_cond_list_head = cv->next;
- }
- else
- {
- cv->prev->next = cv->next;
- }
- if (pte_cond_list_tail == cv)
- {
- pte_cond_list_tail = cv->prev;
- }
- else
- {
- cv->next->prev = cv->prev;
- }
- (void) free (cv);
- }
- pte_osMutexUnlock(pte_cond_list_lock);
- }
- else
- {
-
- pte_osMutexLock (pte_cond_test_init_lock);
-
- if (*cond == PTHREAD_COND_INITIALIZER)
- {
-
- *cond = NULL;
- }
- else
- {
-
- result = EBUSY;
- }
- pte_osMutexUnlock(pte_cond_test_init_lock);
- }
- return ((result != 0) ? result : ((result1 != 0) ? result1 : result2));
- }
|