diff options
Diffstat (limited to 'ACE/apps/JAWS/clients/Caching/ID_Generator.cpp')
-rw-r--r-- | ACE/apps/JAWS/clients/Caching/ID_Generator.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/ACE/apps/JAWS/clients/Caching/ID_Generator.cpp b/ACE/apps/JAWS/clients/Caching/ID_Generator.cpp new file mode 100644 index 00000000000..6e868611835 --- /dev/null +++ b/ACE/apps/JAWS/clients/Caching/ID_Generator.cpp @@ -0,0 +1,61 @@ +// $Id$ + +#if !defined (ACE_ID_GENERATOR_C) +#define ACE_ID_GENERATOR_C + +#include "ace/Object_Manager.h" +#include "ID_Generator.h" + +ACE_RCSID(Caching, ID_Generator, "$Id$") + +time_t ACE_ID_Generator::last_time_ = 0; + +size_t ACE_ID_Generator::last_number_ = 0; + +ACE_SYNCH_MUTEX *ACE_ID_Generator::lock_ = 0; + +char * +ACE_ID_Generator::get_new_id (char *id) +{ + time_t t; + size_t sn; + + ACE_ID_Generator::get_serial_id (t, sn); + ACE_NEW_RETURN (id, char [ACE_OFFER_ID_LENGTH], 0); + + ACE_OS::sprintf (id, "%014d%06d", t, sn); + return id; +} + +void +ACE_ID_Generator::get_serial_id (time_t &t, size_t &s) +{ + ACE_MT (ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, *ACE_ID_Generator::get_lock ())); + ACE_OS::time (&t); + + if (t != ACE_ID_Generator::last_time_) + { + ACE_ID_Generator::last_time_ = t; + s = ACE_ID_Generator::last_number_ = 0; + } + else + s = ACE_ID_Generator::last_number_++; +} + +ACE_SYNCH_MUTEX * +ACE_ID_Generator::get_lock (void) +{ +#if defined (ACE_HAS_THREADS) + if (ACE_ID_Generator::lock_ == 0) + { + ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, *ACE_Static_Object_Lock::instance (), 0)); + + // Double-checked Locking Optimization. + if (ACE_ID_Generator::lock_ == 0) + ACE_NEW_RETURN (ACE_ID_Generator::lock_, ACE_SYNCH_MUTEX, 0); + } +#endif /* ACE_HAS_THREADS */ + return ACE_ID_Generator::lock_; +} + +#endif /* ACE_ID_GENERATOR_C */ |