Service_Types.cpp

Go to the documentation of this file.
00001 // Service_Types.cpp,v 4.36 2006/04/28 18:04:32 jeliazkov_i Exp
00002 
00003 #include "ace/Service_Types.h"
00004 
00005 #if !defined (__ACE_INLINE__)
00006 #include "ace/Service_Types.inl"
00007 #endif /* __ACE_INLINE__ */
00008 
00009 #include "ace/Stream_Modules.h"
00010 #include "ace/Stream.h"
00011 #include "ace/OS_NS_stdio.h"
00012 #include "ace/OS_NS_string.h"
00013 
00014 
00015 ACE_RCSID (ace,
00016            Service_Types,
00017            "Service_Types.cpp,v 4.36 2006/04/28 18:04:32 jeliazkov_i Exp")
00018 
00019   ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00020 
00021 typedef ACE_Stream<ACE_SYNCH> MT_Stream;
00022 typedef ACE_Module<ACE_SYNCH> MT_Module;
00023 typedef ACE_Task<ACE_SYNCH> MT_Task;
00024 
00025 ACE_ALLOC_HOOK_DEFINE(ACE_Service_Type_Impl)
00026 
00027   void
00028 ACE_Service_Type_Impl::dump (void) const
00029 {
00030 #if defined (ACE_HAS_DUMP)
00031   ACE_TRACE ("ACE_Service_Type_Impl::dump");
00032 #endif /* ACE_HAS_DUMP */
00033 }
00034 
00035 ACE_Service_Type_Impl::ACE_Service_Type_Impl (void *so,
00036                                               const ACE_TCHAR *s_name,
00037                                               u_int f,
00038                                               ACE_Service_Object_Exterminator gobbler)
00039   : name_ (0),
00040     obj_ (so),
00041     gobbler_ (gobbler),
00042     flags_ (f)
00043 {
00044   ACE_TRACE ("ACE_Service_Type_Impl::ACE_Service_Type_Impl");
00045   this->name (s_name);
00046 }
00047 
00048 ACE_Service_Type_Impl::~ACE_Service_Type_Impl (void)
00049 {
00050   ACE_TRACE ("ACE_Service_Type_Impl::~ACE_Service_Type_Impl");
00051 
00052   // It's ok to call this, even though we may have already deleted it
00053   // in the fini() method since it would then be NULL.
00054   delete [] const_cast <ACE_TCHAR *> (this->name_);
00055 }
00056 
00057 int
00058 ACE_Service_Type_Impl::fini (void) const
00059 {
00060   ACE_TRACE ("ACE_Service_Type_Impl::fini");
00061   if (ACE::debug ())
00062     ACE_DEBUG ((LM_DEBUG,
00063                 ACE_LIB_TEXT ("destroying %s, flags = %d\n"),
00064                 this->name_,
00065                 this->flags_));
00066 
00067   delete [] const_cast <ACE_TCHAR *> (this->name_);
00068   (const_cast <ACE_Service_Type_Impl *> (this))->name_ = 0;
00069 
00070   if (ACE_BIT_ENABLED (this->flags_,
00071                        ACE_Service_Type::DELETE_OBJ))
00072     {
00073       if (gobbler_ != 0)
00074         gobbler_ (this->object ());
00075       else
00076         // Cast to remove const-ness.
00077         operator delete ((void *) this->object ());
00078     }
00079 
00080   if (ACE_BIT_ENABLED (this->flags_,
00081                        ACE_Service_Type::DELETE_THIS))
00082     delete const_cast <ACE_Service_Type_Impl *> (this);
00083 
00084   return 0;
00085 }
00086 
00087 ACE_Service_Object_Type::ACE_Service_Object_Type (void *so,
00088                                                   const ACE_TCHAR *s_name,
00089                                                   u_int f,
00090                                                   ACE_Service_Object_Exterminator gobbler)
00091   : ACE_Service_Type_Impl (so, s_name, f, gobbler)
00092 {
00093   ACE_TRACE ("ACE_Service_Object_Type::ACE_Service_Object_Type");
00094 }
00095 
00096 int
00097 ACE_Service_Object_Type::init (int argc, ACE_TCHAR *argv[]) const
00098 {
00099   ACE_TRACE ("ACE_Service_Object_Type::init");
00100 
00101   void * const obj = this->object ();
00102 
00103   ACE_Service_Object * const so =
00104     static_cast<ACE_Service_Object *> (obj);
00105 
00106   if (ACE::debug () > 2)
00107     ACE_DEBUG ((LM_DEBUG,
00108                 ACE_LIB_TEXT ("(%P|%t) SOT::init, this=%@, ")
00109                 ACE_LIB_TEXT ("name=%s, flags=%d, so=%@\n"),
00110                 this,
00111                 this->name_,
00112                 this->flags_,
00113                 obj));
00114 
00115   if (so == 0)
00116     return -1;
00117   else
00118     return so->init (argc, argv);
00119 }
00120 
00121 int
00122 ACE_Service_Object_Type::fini (void) const
00123 {
00124   ACE_TRACE ("ACE_Service_Object_Type::fini");
00125 
00126   void * const obj = this->object ();
00127 
00128   if (ACE::debug () > 2)
00129     ACE_DEBUG ((LM_DEBUG,
00130                 ACE_LIB_TEXT ("(%P|%t) SOT::fini - this=%@, ")
00131                 ACE_LIB_TEXT ("name=%s, flags=%d, so=%@\n"),
00132                 this,
00133                 this->name_,
00134                 this->flags_,
00135                 obj));
00136 
00137   ACE_Service_Object * const so =
00138     static_cast<ACE_Service_Object *> (obj);
00139 
00140   if (so)
00141     {
00142       so->fini ();
00143 
00144       // @TODO: Why is this disabled?
00145 #if 0
00146       if (ACE_BIT_ENABLED (this->flags_,
00147                            ACE_Service_Type::DELETE_OBJ))
00148         delete so;
00149 #endif /* 1 */
00150     }
00151 
00152   return ACE_Service_Type_Impl::fini ();
00153 }
00154 
00155 ACE_Service_Object_Type::~ACE_Service_Object_Type (void)
00156 {
00157   ACE_TRACE ("ACE_Service_Object_Type::~ACE_Service_Object_Type");
00158 }
00159 
00160 int
00161 ACE_Service_Object_Type::suspend (void) const
00162 {
00163   ACE_TRACE ("ACE_Service_Object_Type::suspend");
00164   return static_cast<ACE_Service_Object *> (this->object ())->suspend ();
00165 }
00166 
00167 int
00168 ACE_Service_Object_Type::resume (void) const
00169 {
00170   ACE_TRACE ("ACE_Service_Object_Type::resume");
00171   return static_cast<ACE_Service_Object *> (this->object ())->resume ();
00172 }
00173 
00174 int
00175 ACE_Service_Object_Type::info (ACE_TCHAR **str, size_t len) const
00176 {
00177   ACE_TRACE ("ACE_Service_Object_Type::info");
00178   return static_cast<ACE_Service_Object *> (this->object ())->info (str, len);
00179 }
00180 
00181 ACE_ALLOC_HOOK_DEFINE(ACE_Module_Type)
00182 
00183   void
00184 ACE_Module_Type::dump (void) const
00185 {
00186 #if defined (ACE_HAS_DUMP)
00187   ACE_TRACE ("ACE_Module_Type::dump");
00188 #endif /* ACE_HAS_DUMP */
00189 }
00190 
00191 ACE_Module_Type::ACE_Module_Type (void *m,
00192                                   const ACE_TCHAR *m_name,
00193                                   u_int f)
00194   : ACE_Service_Type_Impl (m, m_name, f)
00195 {
00196   ACE_TRACE ("ACE_Module_Type::ACE_Module_Type");
00197 }
00198 
00199 ACE_Module_Type::~ACE_Module_Type (void)
00200 {
00201   ACE_TRACE ("ACE_Module_Type::~ACE_Module_Type");
00202 }
00203 
00204 int
00205 ACE_Module_Type::init (int argc, ACE_TCHAR *argv[]) const
00206 {
00207   ACE_TRACE ("ACE_Module_Type::init");
00208   void *obj = this->object ();
00209   MT_Module *mod = (MT_Module *) obj;
00210   MT_Task *reader = mod->reader ();
00211   MT_Task *writer = mod->writer ();
00212 
00213   if (reader->init (argc, argv) == -1
00214       || writer->init (argc, argv) == -1)
00215     return -1;
00216   else
00217     return 0;
00218 }
00219 
00220 int
00221 ACE_Module_Type::suspend (void) const
00222 {
00223   ACE_TRACE ("ACE_Module_Type::suspend");
00224   void *obj = this->object ();
00225   MT_Module *mod = (MT_Module *) obj;
00226   MT_Task *reader = mod->reader ();
00227   MT_Task *writer = mod->writer ();
00228 
00229   if (reader->suspend () == -1
00230       || writer->suspend () == -1)
00231     return -1;
00232   else
00233     return 0;
00234 }
00235 
00236 int
00237 ACE_Module_Type::resume (void) const
00238 {
00239   ACE_TRACE ("ACE_Module_Type::resume");
00240   void *obj = this->object ();
00241   MT_Module *mod = (MT_Module *) obj;
00242   MT_Task *reader = mod->reader ();
00243   MT_Task *writer = mod->writer ();
00244 
00245   if (reader->resume () == -1
00246       || writer->resume () == -1)
00247     return -1;
00248   else
00249     return 0;
00250 }
00251 
00252 // Note, these operations are somewhat too familiar with the
00253 // implementation of ACE_Module and ACE_Module::close...
00254 
00255 int
00256 ACE_Module_Type::fini (void) const
00257 {
00258   ACE_TRACE ("ACE_Module_Type::fini");
00259 
00260   void *obj = this->object ();
00261   MT_Module *mod = (MT_Module *) obj;
00262   MT_Task *reader = mod->reader ();
00263   MT_Task *writer = mod->writer ();
00264 
00265   if (reader != 0)
00266     reader->fini ();
00267 
00268   if (writer != 0)
00269     writer->fini ();
00270 
00271   // Close the module and delete the memory.
00272   mod->close (MT_Module::M_DELETE);
00273   return ACE_Service_Type_Impl::fini ();
00274 }
00275 
00276 int
00277 ACE_Module_Type::info (ACE_TCHAR **str, size_t len) const
00278 {
00279   ACE_TRACE ("ACE_Module_Type::info");
00280   ACE_TCHAR buf[BUFSIZ];
00281 
00282   ACE_OS::sprintf (buf,
00283                    ACE_LIB_TEXT ("%s\t %s"),
00284                    this->name (),
00285                    ACE_LIB_TEXT ("# ACE_Module\n"));
00286 
00287   if (*str == 0 && (*str = ACE_OS::strdup (buf)) == 0)
00288     return -1;
00289   else
00290     ACE_OS::strsncpy (*str, buf, len);
00291   return static_cast<int> (ACE_OS::strlen (buf));
00292 }
00293 
00294 void
00295 ACE_Module_Type::link (ACE_Module_Type *n)
00296 {
00297   ACE_TRACE ("ACE_Module_Type::link");
00298   this->link_ = n;
00299 }
00300 
00301 ACE_Module_Type *
00302 ACE_Module_Type::link (void) const
00303 {
00304   ACE_TRACE ("ACE_Module_Type::link");
00305   return this->link_;
00306 }
00307 
00308 ACE_ALLOC_HOOK_DEFINE(ACE_Stream_Type)
00309 
00310   void
00311 ACE_Stream_Type::dump (void) const
00312 {
00313 #if defined (ACE_HAS_DUMP)
00314   ACE_TRACE ("ACE_Stream_Type::dump");
00315 #endif /* ACE_HAS_DUMP */
00316 }
00317 
00318 int
00319 ACE_Stream_Type::init (int, ACE_TCHAR *[]) const
00320 {
00321   ACE_TRACE ("ACE_Stream_Type::init");
00322   return 0;
00323 }
00324 
00325 int
00326 ACE_Stream_Type::suspend (void) const
00327 {
00328   ACE_TRACE ("ACE_Stream_Type::suspend");
00329 
00330   for (ACE_Module_Type *m = this->head_;
00331        m != 0;
00332        m = m->link ())
00333     m->suspend ();
00334 
00335   return 0;
00336 }
00337 
00338 int
00339 ACE_Stream_Type::resume (void) const
00340 {
00341   ACE_TRACE ("ACE_Stream_Type::resume");
00342 
00343   for (ACE_Module_Type *m = this->head_;
00344        m != 0;
00345        m = m->link ())
00346     m->resume ();
00347 
00348   return 0;
00349 }
00350 
00351 ACE_Stream_Type::ACE_Stream_Type (void *s,
00352                                   const ACE_TCHAR *s_name,
00353                                   u_int f)
00354   : ACE_Service_Type_Impl (s, s_name, f),
00355     head_ (0)
00356 {
00357   ACE_TRACE ("ACE_Stream_Type::ACE_Stream_Type");
00358 }
00359 
00360 ACE_Stream_Type::~ACE_Stream_Type (void)
00361 {
00362   ACE_TRACE ("ACE_Stream_Type::~ACE_Stream_Type");
00363 }
00364 
00365 int
00366 ACE_Stream_Type::info (ACE_TCHAR **str, size_t len) const
00367 {
00368   ACE_TRACE ("ACE_Stream_Type::info");
00369   ACE_TCHAR buf[BUFSIZ];
00370 
00371   ACE_OS::sprintf (buf,
00372                    ACE_LIB_TEXT ("%s\t %s"),
00373                    this->name (),
00374                    ACE_LIB_TEXT ("# STREAM\n"));
00375 
00376   if (*str == 0 && (*str = ACE_OS::strdup (buf)) == 0)
00377     return -1;
00378   else
00379     ACE_OS::strsncpy (*str, buf, len);
00380   return static_cast<int> (ACE_OS::strlen (buf));
00381 }
00382 
00383 int
00384 ACE_Stream_Type::fini (void) const
00385 {
00386   ACE_TRACE ("ACE_Stream_Type::fini");
00387   void *obj = this->object ();
00388   MT_Stream *str = (MT_Stream *) obj;
00389 
00390   for (ACE_Module_Type *m = this->head_; m != 0; )
00391     {
00392       ACE_Module_Type *t = m->link ();
00393 
00394       // Final arg is an indication to *not* delete the Module.
00395       str->remove (m->name (),
00396                    MT_Module::M_DELETE_NONE);
00397 
00398       // Finalize the Module (this may delete it, but we don't really
00399       // care since we don't access it again).
00400       m->fini ();
00401       m = t;
00402     }
00403 
00404   str->close ();
00405   return ACE_Service_Type_Impl::fini ();
00406 }
00407 
00408 // Locate and remove <mod_name> from the ACE_Stream.
00409 
00410 int
00411 ACE_Stream_Type::remove (ACE_Module_Type *mod)
00412 {
00413   ACE_TRACE ("ACE_Stream_Type::remove");
00414 
00415   ACE_Module_Type *prev = 0;
00416   void *obj = this->object ();
00417   MT_Stream *str = (MT_Stream *) obj;
00418   int result = 0;
00419 
00420   for (ACE_Module_Type *m = this->head_; m != 0; )
00421     {
00422       // We need to do this first so we don't bomb out if we delete m!
00423       ACE_Module_Type *link = m->link ();
00424 
00425       if (m == mod)
00426         {
00427           if (prev == 0)
00428             this->head_ = link;
00429           else
00430             prev->link (link);
00431 
00432           // Final arg is an indication to *not* delete the Module.
00433           if (str->remove (m->name (),
00434                            MT_Module::M_DELETE_NONE) == -1)
00435             result = -1;
00436 
00437           // This call may end up deleting m, which is ok since we
00438           // don't access it again!
00439           m->fini ();
00440         }
00441       else
00442         prev = m;
00443 
00444       m = link;
00445     }
00446 
00447   return result;
00448 }
00449 
00450 int
00451 ACE_Stream_Type::push (ACE_Module_Type *new_module)
00452 {
00453   ACE_TRACE ("ACE_Stream_Type::push");
00454   void *obj = this->object ();
00455   MT_Stream *str = (MT_Stream *) obj;
00456 
00457   new_module->link (this->head_);
00458   this->head_ = new_module;
00459   obj = new_module->object ();
00460   return str->push ((MT_Module *) obj);
00461 }
00462 
00463 ACE_Module_Type *
00464 ACE_Stream_Type::find (const ACE_TCHAR *mod_name) const
00465 {
00466   ACE_TRACE ("ACE_Stream_Type::find");
00467 
00468   for (ACE_Module_Type *m = this->head_;
00469        m != 0;
00470        m = m->link ())
00471     if (ACE_OS::strcmp (m->name (), mod_name) == 0)
00472       return m;
00473 
00474   return 0;
00475 }
00476 
00477 // @@@ Eliminated ommented out explicit template instantiation code
00478 
00479 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Thu Nov 9 09:42:03 2006 for ACE by doxygen 1.3.6