#include <OS_NS_Thread.h>
Collaboration diagram for ACE_event_t:
Protected Attributes | |
char * | name_ |
Event name if process shared. | |
ACE_eventdata_t * | eventdata_ |
Event data. | |
Friends | |
int | event_init (ACE_event_t *, int, int, int, const char *, void *, int) |
int | event_destroy (ACE_event_t *) |
int | event_wait (ACE_event_t *) |
int | event_timedwait (ACE_event_t *, ACE_Time_Value *, int) |
int | event_signal (ACE_event_t *) |
int | event_pulse (ACE_event_t *) |
int | event_reset (ACE_event_t *) |
Definition at line 1859 of file OS_NS_Thread.h.
int event_destroy | ( | ACE_event_t * | event | ) | [friend] |
Definition at line 2352 of file OS_NS_Thread.cpp.
02353 { 02354 #if defined (ACE_WIN32) 02355 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::CloseHandle (*event), ace_result_), int, -1); 02356 #elif defined (ACE_HAS_THREADS) 02357 if (event->eventdata_) 02358 { 02359 // mutex_destroy()/cond_destroy() are called in a loop if the object 02360 // is BUSY. This avoids conditions where we fail to destroy these 02361 // objects because at time of destroy they were just being used in 02362 // another thread possibly causing deadlocks later on if they keep 02363 // being used after we're gone. 02364 02365 if (event->eventdata_->type_ == USYNC_PROCESS) 02366 { 02367 if (event->name_) 02368 { 02369 // Only destroy the event data if we're the ones who initialized 02370 // it. 02371 02372 int r1, r2; 02373 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 02374 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 02375 (!defined (ACE_USES_FIFO_SEM) && \ 02376 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02377 // First destroy the mutex so locking after this will return 02378 // errors. 02379 while ((r1 = ACE_OS::mutex_destroy (&event->eventdata_->lock_)) == -1 02380 && errno == EBUSY) 02381 { 02382 ACE_OS::thr_yield (); 02383 } 02384 # else 02385 r1 = ACE_OS::sema_destroy(&event->lock_); 02386 # endif 02387 02388 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 02389 (!defined (ACE_USES_FIFO_SEM) && \ 02390 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02391 // Now fix event to manual reset, raise signal and broadcast 02392 // until is's possible to destroy the condition. 02393 event->eventdata_->manual_reset_ = 1; 02394 while ((r2 = ACE_OS::cond_destroy (&event->eventdata_->condition_)) == -1 02395 && errno == EBUSY) 02396 { 02397 event->eventdata_->is_signaled_ = 1; 02398 ACE_OS::cond_broadcast (&event->eventdata_->condition_); 02399 ACE_OS::thr_yield (); 02400 } 02401 # else 02402 r2 = ACE_OS::sema_destroy(&event->semaphore_); 02403 # endif 02404 ACE_OS::munmap (event->eventdata_, 02405 sizeof (ACE_eventdata_t)); 02406 ACE_OS::shm_unlink (ACE_TEXT_CHAR_TO_TCHAR(event->name_)); 02407 ACE_OS::free (event->name_); 02408 return r1 != 0 || r2 != 0 ? -1 : 0; 02409 } 02410 else 02411 { 02412 ACE_OS::munmap (event->eventdata_, 02413 sizeof (ACE_eventdata_t)); 02414 # if (!defined (ACE_HAS_PTHREADS) || !defined (_POSIX_THREAD_PROCESS_SHARED) || \ 02415 (defined (ACE_LACKS_MUTEXATTR_PSHARED) && defined (ACE_LACKS_CONDATTR_PSHARED))) && \ 02416 (defined (ACE_USES_FIFO_SEM) || \ 02417 (defined (ACE_HAS_POSIX_SEM) && defined (ACE_HAS_POSIX_SEM_TIMEOUT) && defined (ACE_LACKS_NAMED_POSIX_SEM))) 02418 ACE_OS::sema_destroy(&event->lock_); 02419 # endif 02420 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 02421 (!defined (ACE_USES_FIFO_SEM) && \ 02422 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02423 return 0; 02424 # else 02425 return ACE_OS::sema_destroy(&event->semaphore_); 02426 # endif 02427 } 02428 } 02429 else 02430 { 02431 int r1, r2; 02432 // First destroy the mutex so locking after this will return errors. 02433 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 02434 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 02435 (!defined (ACE_USES_FIFO_SEM) && \ 02436 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02437 // first destroy the mutex so locking after this will return errors 02438 while ((r1 = ACE_OS::mutex_destroy (&event->eventdata_->lock_)) == -1 02439 && errno == EBUSY) 02440 { 02441 ACE_OS::thr_yield (); 02442 } 02443 # else 02444 r1 = ACE_OS::sema_destroy(&event->lock_); 02445 # endif 02446 02447 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 02448 (!defined (ACE_USES_FIFO_SEM) && \ 02449 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02450 // Now fix event to manual reset, raise signal and broadcast until 02451 // it's possible to destroy the condition. 02452 event->eventdata_->manual_reset_ = 1; 02453 while ((r2 = ACE_OS::cond_destroy (&event->eventdata_->condition_)) == -1 02454 && errno == EBUSY) 02455 { 02456 event->eventdata_->is_signaled_ = 1; 02457 ACE_OS::cond_broadcast (&event->eventdata_->condition_); 02458 ACE_OS::thr_yield (); 02459 } 02460 # else 02461 r2 = ACE_OS::sema_destroy(&event->semaphore_); 02462 # endif 02463 delete event->eventdata_; 02464 return r1 != 0 || r2 != 0 ? -1 : 0; 02465 } 02466 } 02467 02468 return 0; 02469 #else 02470 ACE_UNUSED_ARG (event); 02471 ACE_NOTSUP_RETURN (-1); 02472 #endif /* ACE_WIN32 */ 02473 }
int event_init | ( | ACE_event_t * | , | |
int | , | |||
int | , | |||
int | , | |||
const char * | , | |||
void * | , | |||
int | ||||
) | [friend] |
int event_pulse | ( | ACE_event_t * | event | ) | [friend] |
Definition at line 2736 of file OS_NS_Thread.cpp.
02737 { 02738 #if defined (ACE_WIN32) 02739 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::PulseEvent (*event), ace_result_), int, -1); 02740 #elif defined (ACE_HAS_THREADS) 02741 int result = 0; 02742 int error = 0; 02743 02744 // grab the lock first 02745 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 02746 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 02747 (!defined (ACE_USES_FIFO_SEM) && \ 02748 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02749 if (ACE_OS::mutex_lock (&event->eventdata_->lock_) == 0) 02750 # else 02751 if (ACE_OS::sema_wait (&event->lock_) == 0) 02752 # endif 02753 { 02754 if (event->eventdata_->waiting_threads_ > 0) 02755 { 02756 // Manual-reset event. 02757 if (event->eventdata_->manual_reset_ == 1) 02758 { 02759 // Wakeup all waiters. 02760 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 02761 (!defined (ACE_USES_FIFO_SEM) && \ 02762 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02763 if (ACE_OS::cond_broadcast (&event->eventdata_->condition_) != 0) 02764 { 02765 result = -1; 02766 error = errno; 02767 } 02768 if (result == 0) 02769 event->eventdata_->signal_count_ = event->eventdata_->waiting_threads_; 02770 # else 02771 event->eventdata_->signal_count_ = event->eventdata_->waiting_threads_; 02772 for (unsigned long i=0; i<event->eventdata_->signal_count_ ;++i) 02773 if (ACE_OS::sema_post(&event->semaphore_) != 0) 02774 { 02775 event->eventdata_->signal_count_ = 0; 02776 result = -1; 02777 error = errno; 02778 } 02779 02780 if (result == 0) 02781 while(event->eventdata_->signal_count_!=0 && event->eventdata_->waiting_threads_!=0) 02782 ACE_OS::thr_yield (); 02783 # endif 02784 } 02785 // Auto-reset event: wakeup one waiter. 02786 else 02787 { 02788 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 02789 (!defined (ACE_USES_FIFO_SEM) && \ 02790 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02791 if (ACE_OS::cond_signal (&event->eventdata_->condition_) != 0) 02792 # else 02793 if (ACE_OS::sema_post(&event->semaphore_) != 0) 02794 # endif 02795 { 02796 result = -1; 02797 error = errno; 02798 } 02799 02800 event->eventdata_->auto_event_signaled_ = true; 02801 } 02802 } 02803 02804 // Reset event. 02805 event->eventdata_->is_signaled_ = 0; 02806 02807 // Now we can let go of the lock. 02808 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 02809 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 02810 (!defined (ACE_USES_FIFO_SEM) && \ 02811 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02812 ACE_OS::mutex_unlock (&event->eventdata_->lock_); 02813 # else 02814 ACE_OS::sema_post (&event->lock_); 02815 # endif 02816 if (result == -1) 02817 // Reset errno in case mutex_unlock() also fails... 02818 errno = error; 02819 } 02820 else 02821 result = -1; 02822 return result; 02823 #else 02824 ACE_UNUSED_ARG (event); 02825 ACE_NOTSUP_RETURN (-1); 02826 #endif /* ACE_WIN32 */ 02827 }
int event_reset | ( | ACE_event_t * | event | ) | [friend] |
Definition at line 2830 of file OS_NS_Thread.cpp.
02831 { 02832 #if defined (ACE_WIN32) 02833 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::ResetEvent (*event), ace_result_), int, -1); 02834 #elif defined (ACE_HAS_THREADS) 02835 int result = 0; 02836 02837 // Grab the lock first. 02838 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 02839 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 02840 (!defined (ACE_USES_FIFO_SEM) && \ 02841 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02842 if (ACE_OS::mutex_lock (&event->eventdata_->lock_) == 0) 02843 # else 02844 if (ACE_OS::sema_wait (&event->lock_) == 0) 02845 # endif 02846 { 02847 // Reset event. 02848 event->eventdata_->is_signaled_ = 0; 02849 event->eventdata_->auto_event_signaled_ = false; 02850 02851 // Now we can let go of the lock. 02852 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 02853 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 02854 (!defined (ACE_USES_FIFO_SEM) && \ 02855 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02856 ACE_OS::mutex_unlock (&event->eventdata_->lock_); 02857 # else 02858 ACE_OS::sema_post (&event->lock_); 02859 # endif 02860 } 02861 else 02862 result = -1; 02863 return result; 02864 #else 02865 ACE_UNUSED_ARG (event); 02866 ACE_NOTSUP_RETURN (-1); 02867 #endif /* ACE_WIN32 */ 02868 }
int event_signal | ( | ACE_event_t * | event | ) | [friend] |
Definition at line 2871 of file OS_NS_Thread.cpp.
02872 { 02873 #if defined (ACE_WIN32) 02874 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::SetEvent (*event), ace_result_), int, -1); 02875 #elif defined (ACE_HAS_THREADS) 02876 int result = 0; 02877 int error = 0; 02878 02879 // grab the lock first 02880 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 02881 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 02882 (!defined (ACE_USES_FIFO_SEM) && \ 02883 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02884 if (ACE_OS::mutex_lock (&event->eventdata_->lock_) == 0) 02885 # else 02886 if (ACE_OS::sema_wait (&event->lock_) == 0) 02887 # endif 02888 { 02889 // Manual-reset event. 02890 if (event->eventdata_->manual_reset_ == 1) 02891 { 02892 // wakeup all 02893 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 02894 (!defined (ACE_USES_FIFO_SEM) && \ 02895 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02896 if (ACE_OS::cond_broadcast (&event->eventdata_->condition_) != 0) 02897 { 02898 result = -1; 02899 error = errno; 02900 } 02901 # else 02902 if (ACE_OS::sema_post(&event->semaphore_) != 0) 02903 { 02904 result = -1; 02905 error = errno; 02906 } 02907 # endif 02908 02909 if (result == 0) 02910 // signal event 02911 event->eventdata_->is_signaled_ = 1; 02912 } 02913 // Auto-reset event 02914 else 02915 { 02916 if (event->eventdata_->waiting_threads_ == 0) 02917 // No waiters: signal event. 02918 event->eventdata_->is_signaled_ = 1; 02919 // Waiters: wakeup one waiter. 02920 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 02921 (!defined (ACE_USES_FIFO_SEM) && \ 02922 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02923 else if (ACE_OS::cond_signal (&event->eventdata_->condition_) != 0) 02924 # else 02925 else if (ACE_OS::sema_post(&event->semaphore_) != 0) 02926 # endif 02927 { 02928 result = -1; 02929 error = errno; 02930 } 02931 02932 event->eventdata_->auto_event_signaled_ = true; 02933 } 02934 02935 // Now we can let go of the lock. 02936 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 02937 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 02938 (!defined (ACE_USES_FIFO_SEM) && \ 02939 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 02940 ACE_OS::mutex_unlock (&event->eventdata_->lock_); 02941 # else 02942 ACE_OS::sema_post (&event->lock_); 02943 # endif 02944 02945 if (result == -1) 02946 // Reset errno in case mutex_unlock() also fails... 02947 errno = error; 02948 } 02949 else 02950 result = -1; 02951 02952 return result; 02953 #else 02954 ACE_UNUSED_ARG (event); 02955 ACE_NOTSUP_RETURN (-1); 02956 #endif /* ACE_WIN32 */ 02957 }
int event_timedwait | ( | ACE_event_t * | event, | |
ACE_Time_Value * | timeout, | |||
int | use_absolute_time = 1 | |||
) | [friend] |
Definition at line 2960 of file OS_NS_Thread.cpp.
02963 { 02964 if (timeout == 0) 02965 // Wait indefinitely. 02966 return ACE_OS::event_wait (event); 02967 02968 #if defined (ACE_WIN32) 02969 DWORD result; 02970 02971 if (timeout->sec () == 0 && timeout->usec () == 0) 02972 // Do a "poll". 02973 result = ::WaitForSingleObject (*event, 0); 02974 else 02975 { 02976 // Wait for upto <relative_time> number of milliseconds. Note 02977 // that we must convert between absolute time (which is passed 02978 // as a parameter) and relative time (which is what 02979 // WaitForSingleObjects() expects). 02980 // <timeout> parameter is given in absolute or relative value 02981 // depending on parameter <use_absolute_time>. 02982 int msec_timeout; 02983 if (use_absolute_time) 02984 { 02985 // Time is given in absolute time, we should use 02986 // gettimeofday() to calculate relative time 02987 ACE_Time_Value relative_time (*timeout - ACE_OS::gettimeofday ()); 02988 02989 // Watchout for situations where a context switch has caused 02990 // the current time to be > the timeout. Thanks to Norbert 02991 // Rapp <NRapp@nexus-informatics.de> for pointing this. 02992 if (relative_time < ACE_Time_Value::zero) 02993 msec_timeout = 0; 02994 else 02995 msec_timeout = relative_time.msec (); 02996 } 02997 else 02998 // time is given in relative time, just convert it into 02999 // milliseconds and use it 03000 msec_timeout = timeout->msec (); 03001 result = ::WaitForSingleObject (*event, msec_timeout); 03002 } 03003 03004 switch (result) 03005 { 03006 case WAIT_OBJECT_0: 03007 return 0; 03008 case WAIT_TIMEOUT: 03009 errno = ETIME; 03010 return -1; 03011 default: 03012 // This is a hack, we need to find an appropriate mapping... 03013 ACE_OS::set_errno_to_last_error (); 03014 return -1; 03015 } 03016 #elif defined (ACE_HAS_THREADS) 03017 int result = 0; 03018 int error = 0; 03019 03020 // grab the lock first 03021 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 03022 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 03023 (!defined (ACE_USES_FIFO_SEM) && \ 03024 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03025 if (ACE_OS::mutex_lock (&event->eventdata_->lock_) == 0) 03026 # else 03027 if (ACE_OS::sema_wait (&event->lock_) == 0) 03028 # endif 03029 { 03030 if (event->eventdata_->is_signaled_ == 1) 03031 // event is currently signaled 03032 { 03033 if (event->eventdata_->manual_reset_ == 0) 03034 { 03035 // AUTO: reset state 03036 event->eventdata_->is_signaled_ = 0; 03037 event->eventdata_->auto_event_signaled_ = false; 03038 } 03039 } 03040 else 03041 // event is currently not signaled 03042 { 03043 event->eventdata_->waiting_threads_++; 03044 03045 ACE_Time_Value absolute_timeout = *timeout; 03046 03047 // cond_timewait() expects absolute time, check 03048 // <use_absolute_time> flag. 03049 if (use_absolute_time == 0) 03050 absolute_timeout += ACE_OS::gettimeofday (); 03051 03052 while (event->eventdata_->is_signaled_ == 0 && 03053 event->eventdata_->auto_event_signaled_ == false) 03054 { 03055 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 03056 (!defined (ACE_USES_FIFO_SEM) && \ 03057 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03058 if (ACE_OS::cond_timedwait (&event->eventdata_->condition_, 03059 &event->eventdata_->lock_, 03060 &absolute_timeout) != 0) 03061 { 03062 result = -1; 03063 error = errno; 03064 break; 03065 } 03066 03067 if (event->eventdata_->signal_count_ > 0) 03068 { 03069 event->eventdata_->signal_count_--; 03070 break; 03071 } 03072 # else 03073 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_MUTEXATTR_PSHARED)) || \ 03074 (!defined (ACE_USES_FIFO_SEM) && (!defined (ACE_HAS_POSIX_SEM) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03075 if (ACE_OS::mutex_unlock (&event->eventdata_->lock_) != 0) 03076 # else 03077 if (ACE_OS::sema_post (&event->lock_) != 0) 03078 # endif 03079 { 03080 event->eventdata_->waiting_threads_--; 03081 return -1; 03082 } 03083 03084 if (ACE_OS::sema_wait(&event->semaphore_, absolute_timeout) !=0) 03085 { 03086 result = -1; 03087 if (errno == ETIMEDOUT) // Semaphores time out with ETIMEDOUT (POSIX) 03088 error = ETIME; 03089 else 03090 error = errno; 03091 } 03092 03093 bool signalled = false; 03094 if (result == 0 && event->eventdata_->signal_count_ > 0) 03095 { 03096 event->eventdata_->signal_count_--; 03097 signalled = true; 03098 } 03099 03100 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_MUTEXATTR_PSHARED)) || \ 03101 (!defined (ACE_USES_FIFO_SEM) && (!defined (ACE_HAS_POSIX_SEM) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03102 if (ACE_OS::mutex_lock (&event->eventdata_->lock_) != 0) 03103 # else 03104 if (ACE_OS::sema_wait (&event->lock_) != 0) 03105 # endif 03106 { 03107 event->eventdata_->waiting_threads_--; // yes, I know it's not save 03108 return -1; 03109 } 03110 03111 if (result) 03112 break; 03113 03114 if (event->eventdata_->manual_reset_ == 1 && event->eventdata_->is_signaled_ == 1) 03115 if (ACE_OS::sema_post(&event->semaphore_) != 0) 03116 { 03117 result = -1; 03118 error = errno; 03119 break; 03120 } 03121 03122 if (signalled) 03123 break; 03124 # endif 03125 } 03126 03127 // Reset the auto_event_signaled_ to false now that we have 03128 // woken up. 03129 if (event->eventdata_->auto_event_signaled_ == true) 03130 event->eventdata_->auto_event_signaled_ = false; 03131 03132 event->eventdata_->waiting_threads_--; 03133 } 03134 03135 // Now we can let go of the lock. 03136 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 03137 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 03138 (!defined (ACE_USES_FIFO_SEM) && \ 03139 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03140 ACE_OS::mutex_unlock (&event->eventdata_->lock_); 03141 # else 03142 ACE_OS::sema_post (&event->lock_); 03143 # endif 03144 03145 if (result == -1) 03146 // Reset errno in case mutex_unlock() also fails... 03147 errno = error; 03148 } 03149 else 03150 result = -1; 03151 return result; 03152 #else 03153 ACE_UNUSED_ARG (event); 03154 ACE_UNUSED_ARG (timeout); 03155 ACE_UNUSED_ARG (use_absolute_time); 03156 ACE_NOTSUP_RETURN (-1); 03157 #endif /* ACE_WIN32 */ 03158 }
int event_wait | ( | ACE_event_t * | event | ) | [friend] |
Definition at line 3161 of file OS_NS_Thread.cpp.
03162 { 03163 #if defined (ACE_WIN32) 03164 switch (::WaitForSingleObject (*event, INFINITE)) 03165 { 03166 case WAIT_OBJECT_0: 03167 return 0; 03168 default: 03169 { 03170 ACE_OS::set_errno_to_last_error (); 03171 return -1; 03172 } 03173 } 03174 #elif defined (ACE_HAS_THREADS) 03175 int result = 0; 03176 int error = 0; 03177 03178 // grab the lock first 03179 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 03180 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 03181 (!defined (ACE_USES_FIFO_SEM) && \ 03182 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03183 if (ACE_OS::mutex_lock (&event->eventdata_->lock_) == 0) 03184 # else 03185 if (ACE_OS::sema_wait (&event->lock_) == 0) 03186 # endif 03187 { 03188 if (event->eventdata_->is_signaled_ == 1) 03189 // Event is currently signaled. 03190 { 03191 if (event->eventdata_->manual_reset_ == 0) 03192 // AUTO: reset state 03193 event->eventdata_->is_signaled_ = 0; 03194 } 03195 else // event is currently not signaled 03196 { 03197 event->eventdata_->waiting_threads_++; 03198 03199 while (event->eventdata_->is_signaled_ == 0 && 03200 event->eventdata_->auto_event_signaled_ == false) 03201 { 03202 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \ 03203 (!defined (ACE_USES_FIFO_SEM) && \ 03204 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03205 if (ACE_OS::cond_wait (&event->eventdata_->condition_, 03206 &event->eventdata_->lock_) != 0) 03207 { 03208 result = -1; 03209 error = errno; 03210 // Something went wrong... 03211 break; 03212 } 03213 if (event->eventdata_->signal_count_ > 0) 03214 { 03215 event->eventdata_->signal_count_--; 03216 break; 03217 } 03218 # else 03219 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_MUTEXATTR_PSHARED)) || \ 03220 (!defined (ACE_USES_FIFO_SEM) && (!defined (ACE_HAS_POSIX_SEM) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03221 if (ACE_OS::mutex_unlock (&event->eventdata_->lock_) != 0) 03222 # else 03223 if (ACE_OS::sema_post (&event->lock_) != 0) 03224 # endif 03225 { 03226 event->eventdata_->waiting_threads_--; 03227 return -1; 03228 } 03229 03230 if (ACE_OS::sema_wait (&event->semaphore_) !=0) 03231 { 03232 result = -1; 03233 error = errno; 03234 } 03235 03236 bool signalled = false; 03237 if (result == 0 && event->eventdata_->signal_count_ > 0) 03238 { 03239 event->eventdata_->signal_count_--; 03240 signalled = true; 03241 } 03242 03243 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_MUTEXATTR_PSHARED)) || \ 03244 (!defined (ACE_USES_FIFO_SEM) && (!defined (ACE_HAS_POSIX_SEM) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03245 if (ACE_OS::mutex_lock (&event->eventdata_->lock_) != 0) 03246 # else 03247 if (ACE_OS::sema_wait (&event->lock_) != 0) 03248 # endif 03249 { 03250 event->eventdata_->waiting_threads_--; 03251 return -1; 03252 } 03253 03254 if (result) 03255 break; 03256 03257 if (event->eventdata_->manual_reset_ == 1 && event->eventdata_->is_signaled_ == 1) 03258 if (ACE_OS::sema_post(&event->semaphore_) != 0) 03259 { 03260 result = -1; 03261 error = errno; 03262 break; 03263 } 03264 03265 if (signalled) 03266 break; 03267 # endif 03268 } 03269 03270 // Reset it since we have woken up. 03271 if (event->eventdata_->auto_event_signaled_ == true) 03272 event->eventdata_->auto_event_signaled_ = false; 03273 03274 event->eventdata_->waiting_threads_--; 03275 } 03276 03277 // Now we can let go of the lock. 03278 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && \ 03279 (!defined (ACE_LACKS_MUTEXATTR_PSHARED) || !defined (ACE_LACKS_CONDATTR_PSHARED))) || \ 03280 (!defined (ACE_USES_FIFO_SEM) && \ 03281 (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM))) 03282 ACE_OS::mutex_unlock (&event->eventdata_->lock_); 03283 # else 03284 ACE_OS::sema_post (&event->lock_); 03285 # endif 03286 03287 if (result == -1) 03288 // Reset errno in case mutex_unlock() also fails... 03289 errno = error; 03290 } 03291 else 03292 result = -1; 03293 return result; 03294 #else 03295 ACE_UNUSED_ARG (event); 03296 ACE_NOTSUP_RETURN (-1); 03297 #endif /* ACE_WIN32 */ 03298 }
ACE_eventdata_t* ACE_event_t::eventdata_ [protected] |
char* ACE_event_t::name_ [protected] |