00001
00002
00003 #include "ace/Service_Types.h"
00004
00005 #if !defined (__ACE_INLINE__)
00006 #include "ace/Service_Types.inl"
00007 #endif
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
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
00053
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
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
00145 #if 0
00146 if (ACE_BIT_ENABLED (this->flags_,
00147 ACE_Service_Type::DELETE_OBJ))
00148 delete so;
00149 #endif
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
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
00253
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
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
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
00395 str->remove (m->name (),
00396 MT_Module::M_DELETE_NONE);
00397
00398
00399
00400 m->fini ();
00401 m = t;
00402 }
00403
00404 str->close ();
00405 return ACE_Service_Type_Impl::fini ();
00406 }
00407
00408
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
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
00433 if (str->remove (m->name (),
00434 MT_Module::M_DELETE_NONE) == -1)
00435 result = -1;
00436
00437
00438
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
00478
00479 ACE_END_VERSIONED_NAMESPACE_DECL