Message_Queue_Vx.cpp

Go to the documentation of this file.
00001 // $Id: Message_Queue_Vx.cpp 80826 2008-03-04 14:51:23Z wotte $
00002 
00003 #include "ace/Message_Queue_Vx.h"
00004 #include "ace/Log_Msg.h"
00005 
00006 #if !defined (__ACE_INLINE__)
00007 #include "ace/Message_Queue_Vx.inl"
00008 #endif /* __ACE_INLINE__ */
00009 
00010 ACE_RCSID (ace,
00011            Message_Queue_Vx,
00012            "$Id: Message_Queue_Vx.cpp 80826 2008-03-04 14:51:23Z wotte $")
00013 
00014 
00015 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00016 
00017 #if defined (ACE_VXWORKS)
00018 
00019 ////////////////////////////////
00020 // class ACE_Message_Queue_Vx //
00021 ////////////////////////////////
00022 
00023 void
00024 ACE_Message_Queue_Vx::dump (void) const
00025 {
00026 #if defined (ACE_HAS_DUMP)
00027   ACE_TRACE ("ACE_Message_Queue_Vx::dump");
00028   ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00029   switch (this->state_)
00030     {
00031     case ACE_Message_Queue_Base::ACTIVATED:
00032       ACE_DEBUG ((LM_DEBUG,
00033                   ACE_TEXT ("state = ACTIVATED\n")));
00034       break;
00035     case ACE_Message_Queue_Base::DEACTIVATED:
00036       ACE_DEBUG ((LM_DEBUG,
00037                   ACE_TEXT ("state = DEACTIVATED\n")));
00038       break;
00039     case ACE_Message_Queue_Base::PULSED:
00040       ACE_DEBUG ((LM_DEBUG,
00041                   ACE_TEXT ("state = PULSED\n")));
00042       break;
00043     }
00044   ACE_DEBUG ((LM_DEBUG,
00045               ACE_TEXT ("low_water_mark = %d\n")
00046               ACE_TEXT ("high_water_mark = %d\n")
00047               ACE_TEXT ("cur_bytes = %d\n")
00048               ACE_TEXT ("cur_length = %d\n")
00049               ACE_TEXT ("cur_count = %d\n")
00050               ACE_TEXT ("head_ = %u\n")
00051               ACE_TEXT ("MSG_Q_ID = %u\n"),
00052               this->low_water_mark_,
00053               this->high_water_mark_,
00054               this->cur_bytes_,
00055               this->cur_length_,
00056               this->cur_count_,
00057               this->head_,
00058               this->tail_));
00059   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00060 #endif /* ACE_HAS_DUMP */
00061 }
00062 
00063 ACE_Message_Queue_Vx::ACE_Message_Queue_Vx (size_t max_messages,
00064                                             size_t max_message_length,
00065                                             ACE_Notification_Strategy *ns)
00066   : ACE_Message_Queue<ACE_NULL_SYNCH> (0, 0, ns),
00067     max_messages_ (static_cast<int> (max_messages)),
00068     max_message_length_ (static_cast<int> (max_message_length))
00069 {
00070   ACE_TRACE ("ACE_Message_Queue_Vx::ACE_Message_Queue_Vx");
00071 
00072   if (this->open (max_messages_, max_message_length_, ns) == -1)
00073     ACE_ERROR ((LM_ERROR, ACE_TEXT ("open")));
00074 }
00075 
00076 ACE_Message_Queue_Vx::~ACE_Message_Queue_Vx (void)
00077 {
00078   ACE_TRACE ("ACE_Message_Queue_Vx::~ACE_Message_Queue_Vx");
00079 
00080   if (this->tail_ != 0  &&  this->close () == -1)
00081     ACE_ERROR ((LM_ERROR, ACE_TEXT ("close")));
00082 }
00083 
00084 // Don't bother locking since if someone calls this function more than
00085 // once for the same queue, we're in bigger trouble than just
00086 // concurrency control!
00087 
00088 int
00089 ACE_Message_Queue_Vx::open (size_t max_messages,
00090                             size_t max_message_length,
00091                             ACE_Notification_Strategy *ns)
00092 {
00093   ACE_TRACE ("ACE_Message_Queue_Vx::open");
00094   this->high_water_mark_ = 0;
00095   this->low_water_mark_  = 0;
00096   this->cur_bytes_ = 0;
00097   this->cur_length_ = 0;
00098   this->cur_count_ = 0;
00099   this->head_ = 0;
00100   this->notification_strategy_ = ns;
00101   this->max_messages_ = static_cast<int> (max_messages);
00102   this->max_message_length_ = static_cast<int> (max_message_length);
00103 
00104   if (tail_)
00105     {
00106       // Had already created a msgQ, so delete it.
00107       close ();
00108       activate_i ();
00109     }
00110 
00111   return (this->tail_ =
00112           reinterpret_cast<ACE_Message_Block *> (
00113               ::msgQCreate (max_messages_,
00114                             max_message_length_,
00115                             MSG_Q_FIFO))) == 0 ? -1 : 0;
00116 }
00117 
00118 // Clean up the queue if we have not already done so!
00119 
00120 int
00121 ACE_Message_Queue_Vx::close (void)
00122 {
00123   ACE_TRACE ("ACE_Message_Queue_Vx::close");
00124   // Don't lock, because we don't have a lock.  It shouldn't be
00125   // necessary, anyways.
00126 
00127   this->deactivate_i ();
00128 
00129   // Don't bother to free up the remaining message on the list,
00130   // because we don't have any way to iterate over what's in the
00131   // queue.
00132 
00133   return ::msgQDelete (msgq ());
00134 }
00135 
00136 bool
00137 ACE_Message_Queue_Vx::is_empty_i (void)
00138 {
00139   ACE_TRACE ("ACE_Message_Queue_Vx::is_empty_i");
00140   return ::msgQNumMsgs (msgq ()) == 0;
00141 }
00142 
00143 bool
00144 ACE_Message_Queue_Vx::is_full_i (void)
00145 {
00146   ACE_TRACE ("ACE_Message_Queue_Vx::is_full_i");
00147   return ::msgQNumMsgs (msgq ()) >= max_messages_;
00148 }
00149 
00150 size_t
00151 ACE_Message_Queue_Vx::high_water_mark (void)
00152 {
00153   ACE_TRACE ("ACE_Message_Queue_Vx::high_water_mark");
00154   ACE_NOTSUP_RETURN ((size_t) -1);
00155 }
00156 
00157 void
00158 ACE_Message_Queue_Vx::high_water_mark (size_t)
00159 {
00160   ACE_TRACE ("ACE_Message_Queue_Vx::high_water_mark");
00161   ACE_NOTSUP;
00162 }
00163 
00164 size_t
00165 ACE_Message_Queue_Vx::low_water_mark (void)
00166 {
00167   ACE_TRACE ("ACE_Message_Queue_Vx::low_water_mark");
00168   // Don't need to guard, because this is fixed.
00169 
00170   ACE_NOTSUP_RETURN ((size_t) -1);
00171 }
00172 
00173 void
00174 ACE_Message_Queue_Vx::low_water_mark (size_t)
00175 {
00176   ACE_TRACE ("ACE_Message_Queue_Vx::low_water_mark");
00177   ACE_NOTSUP;
00178 }
00179 
00180 size_t
00181 ACE_Message_Queue_Vx::message_bytes (void)
00182 {
00183   ACE_TRACE ("ACE_Message_Queue_Vx::message_bytes");
00184   ACE_NOTSUP_RETURN ((size_t) -1);
00185 }
00186 
00187 size_t
00188 ACE_Message_Queue_Vx::message_length (void)
00189 {
00190   ACE_TRACE ("ACE_Message_Queue_Vx::message_length");
00191   ACE_NOTSUP_RETURN ((size_t) -1);
00192 }
00193 
00194 size_t
00195 ACE_Message_Queue_Vx::message_count (void)
00196 {
00197   ACE_TRACE ("ACE_Message_Queue_Vx::message_count");
00198   // Don't need to guard, because this is a system call.
00199 
00200   return ::msgQNumMsgs (msgq ());
00201 }
00202 
00203 void
00204 ACE_Message_Queue_Vx::message_bytes (size_t)
00205 {
00206   ACE_TRACE ("ACE_Message_Queue_Vx::message_bytes");
00207   ACE_NOTSUP;
00208 }
00209 
00210 void
00211 ACE_Message_Queue_Vx::message_length (size_t)
00212 {
00213   ACE_TRACE ("ACE_Message_Queue_Vx::message_length");
00214   ACE_NOTSUP;
00215 }
00216 
00217 int
00218 ACE_Message_Queue_Vx::signal_enqueue_waiters (void)
00219 {
00220   // No-op.
00221   return 0;
00222 }
00223 
00224 int
00225 ACE_Message_Queue_Vx::signal_dequeue_waiters (void)
00226 {
00227   // No-op.
00228   return 0;
00229 }
00230 
00231 int
00232 ACE_Message_Queue_Vx::enqueue_tail_i (ACE_Message_Block *new_item)
00233 {
00234   ACE_TRACE ("ACE_Message_Queue_Vx::enqueue_tail_i");
00235 
00236   if (new_item == 0)
00237     return -1;
00238 
00239   // Don't try to send a composite message!!!!  Only the first
00240   // block will be sent.
00241 
00242   ++this->cur_count_;
00243 
00244   // Always use this method to actually send a message on the queue.
00245   if (::msgQSend (msgq (),
00246                   new_item->rd_ptr (),
00247                   new_item->size (),
00248                   WAIT_FOREVER,
00249                   MSG_PRI_NORMAL) == OK)
00250     return ::msgQNumMsgs (msgq ());
00251   else
00252     return -1;
00253 }
00254 
00255 int
00256 ACE_Message_Queue_Vx::enqueue_head_i (ACE_Message_Block *new_item)
00257 {
00258   ACE_TRACE ("ACE_Message_Queue_Vx::enqueue_head_i");
00259 
00260   // Just delegate to enqueue_tail_i.
00261   return enqueue_tail_i (new_item);
00262 }
00263 
00264 int
00265 ACE_Message_Queue_Vx::enqueue_i (ACE_Message_Block *new_item)
00266 {
00267   ACE_TRACE ("ACE_Message_Queue_Vx::enqueue_i");
00268 
00269   if (new_item == 0)
00270     return -1;
00271 
00272   if (this->head_ == 0)
00273     // Should always take this branch.
00274     return this->enqueue_head_i (new_item);
00275   else
00276     ACE_NOTSUP_RETURN (-1);
00277 }
00278 
00279 int
00280 ACE_Message_Queue_Vx::enqueue_deadline_i (ACE_Message_Block *new_item)
00281 {
00282   ACE_TRACE ("ACE_Message_Queue_Vx::enqueue_deadline_i");
00283 
00284   // Just delegate to enqueue_tail_i.
00285   return enqueue_tail_i (new_item);
00286 }
00287 
00288 // Actually get the first ACE_Message_Block (no locking, so must be
00289 // called with locks held).  This method assumes that the queue has at
00290 // least one item in it when it is called.
00291 
00292 int
00293 ACE_Message_Queue_Vx::dequeue_head_i (ACE_Message_Block *&first_item)
00294 {
00295   ACE_TRACE ("ACE_Message_Queue_Vx::dequeue_head_i");
00296 
00297   // We don't allocate a new Message_Block:  the caller must provide
00298   // it, and must ensure that it is big enough (without chaining).
00299 
00300   if (first_item == 0  ||  first_item->wr_ptr () == 0)
00301     return -1;
00302 
00303   if (::msgQReceive (msgq (),
00304                      first_item->wr_ptr (),
00305                      first_item->size (),
00306                      WAIT_FOREVER) == ERROR)
00307     return -1;
00308   else
00309     return ::msgQNumMsgs (msgq ());
00310 }
00311 
00312 int
00313 ACE_Message_Queue_Vx::dequeue_prio_i (ACE_Message_Block *& /*dequeued*/)
00314 {
00315   ACE_TRACE ("ACE_Message_Queue_Vx::dequeue_prio_i");
00316   ACE_NOTSUP_RETURN (-1);
00317 }
00318 
00319 int
00320 ACE_Message_Queue_Vx::dequeue_tail_i (ACE_Message_Block *& /*dequeued*/)
00321 {
00322   ACE_TRACE ("ACE_Message_Queue_Vx::dequeue_tail_i");
00323   ACE_NOTSUP_RETURN (-1);
00324 }
00325 
00326 int
00327 ACE_Message_Queue_Vx::dequeue_deadline_i (ACE_Message_Block *& /*dequeued*/)
00328 {
00329   ACE_TRACE ("ACE_Message_Queue_Vx::dequeue_deadline_i");
00330   ACE_NOTSUP_RETURN (-1);
00331 }
00332 
00333 // Take a look at the first item without removing it.
00334 
00335 int
00336 ACE_Message_Queue_Vx::wait_not_full_cond (ACE_Guard<ACE_Null_Mutex> &mon,
00337                                           ACE_Time_Value *tv)
00338 {
00339   // Always return here, and let the VxWorks message queue handle blocking.
00340   ACE_UNUSED_ARG (mon);
00341   ACE_UNUSED_ARG (tv);
00342 
00343   return 0;
00344 }
00345 
00346 int
00347 ACE_Message_Queue_Vx::wait_not_empty_cond (ACE_Guard<ACE_Null_Mutex> &mon,
00348                                            ACE_Time_Value *tv)
00349 {
00350   // Always return here, and let the VxWorks message queue handle blocking.
00351   ACE_UNUSED_ARG (mon);
00352   ACE_UNUSED_ARG (tv);
00353 
00354   return 0;
00355 }
00356 
00357 #if ! defined (ACE_NEEDS_FUNC_DEFINITIONS)
00358 int
00359 ACE_Message_Queue_Vx::peek_dequeue_head (ACE_Message_Block *&,
00360                                          ACE_Time_Value *)
00361 {
00362   ACE_NOTSUP_RETURN (-1);
00363 }
00364 #endif /* ! ACE_NEEDS_FUNC_DEFINITIONS */
00365 
00366 #endif /* ACE_VXWORKS */
00367 
00368 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:40 2010 for ACE by  doxygen 1.4.7