ACE_event_t Class Reference

Wrapper for NT events on UNIX. More...

#include <OS_NS_Thread.h>

Collaboration diagram for ACE_event_t:

Collaboration graph
[legend]
List of all members.

Protected Attributes

char * name_
 Event name if process shared.
ACE_eventdata_teventdata_
 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 *)

Detailed Description

Wrapper for NT events on UNIX.

Definition at line 1859 of file OS_NS_Thread.h.


Friends And Related Function Documentation

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 }


Member Data Documentation

ACE_eventdata_t* ACE_event_t::eventdata_ [protected]

Event data.

Definition at line 1874 of file OS_NS_Thread.h.

char* ACE_event_t::name_ [protected]

Event name if process shared.

Definition at line 1871 of file OS_NS_Thread.h.


The documentation for this class was generated from the following file:
Generated on Tue Feb 2 17:35:06 2010 for ACE by  doxygen 1.4.7