diff options
Diffstat (limited to 'ace/UUID.cpp')
-rw-r--r-- | ace/UUID.cpp | 481 |
1 files changed, 0 insertions, 481 deletions
diff --git a/ace/UUID.cpp b/ace/UUID.cpp deleted file mode 100644 index 8137d16bd60..00000000000 --- a/ace/UUID.cpp +++ /dev/null @@ -1,481 +0,0 @@ -//$Id$ - -#include "ace/UUID.h" - -#if !defined (__ACE_INLINE__) -#include "ace/UUID.inl" -#endif /* __ACE_INLINE__ */ - -#include "ace/Log_Msg.h" -#include "ace/OS_NS_stdio.h" -#include "ace/OS_NS_sys_time.h" -#include "ace/OS_NS_netdb.h" - -ACE_RCSID (ace, - UUID, - "$Id$") - - -namespace ACE_Utils -{ - - UUID_node::UUID_node (void) - { - for (int i = 0; i < UUID_node::NODE_ID_SIZE; ++i) - { - nodeID_[i] = 0; - } - } - - UUID_node::NodeID& - UUID_node::nodeID (void) - { - return nodeID_; - } - - void - UUID_node::nodeID (NodeID& nodeID) - { - for (int i = 0; i < UUID_node::NODE_ID_SIZE; ++i) - { - nodeID_[i] = nodeID[i]; - } - } - - UUID UUID::NIL_UUID; - - /// Construct a nil UUID. Such a UUID has every one of it's data - /// elements set to zero. - UUID::UUID(void) - : timeLow_ (0), - timeMid_ (0), - timeHiAndVersion_ (0), - clockSeqHiAndReserved_ (0), - clockSeqLow_ (0), - as_string_ (0) - { - ACE_NEW (node_, - UUID_node); - - node_release_ = 1; - } - - /// Construct a UUID from a string representation of an UUID. - UUID::UUID (const ACE_CString& uuid_string) - : timeLow_ (0), - timeMid_ (0), - timeHiAndVersion_ (0), - clockSeqHiAndReserved_ (0), - clockSeqLow_ (0), - as_string_ (0) - { - ACE_NEW (node_, - UUID_node); - - node_release_ = 1; - - - if (uuid_string.length() < NIL_UUID.to_string()->length()) - { - ACE_DEBUG ((LM_DEBUG, - "%N ACE_UUID::UUID - " - "IllegalArgument(incorrect string length)\n")); - return; - } - - /// Special case for the nil UUID. - if (uuid_string == *NIL_UUID.to_string()) - { - bool copy_constructor_not_supported = false; - ACE_ASSERT(copy_constructor_not_supported); - //*this = NIL_UUID; - ACE_UNUSED_ARG (copy_constructor_not_supported); - return; - } - - unsigned int timeLow; - unsigned int timeMid; - unsigned int timeHiAndVersion; - unsigned int clockSeqHiAndReserved; - unsigned int clockSeqLow; - unsigned int node [UUID_node::NODE_ID_SIZE]; - char thr_pid_buf [BUFSIZ]; - - if (uuid_string.length() == NIL_UUID.to_string()->length()) - { - // This might seem quite strange this being in ACE, but it seems to - // be a bit difficult to write a facade for ::sscanf because some - // compilers dont support vsscanf, including MSVC. It appears that - // most platforms support sscanf though so we need to use it - // directly. - int nScanned = ::sscanf(uuid_string.c_str(), - "%8x-%4x-%4x-%2x%2x-%2x%2x%2x%2x%2x%2x", - &timeLow, - &timeMid, - &timeHiAndVersion, - &clockSeqHiAndReserved, - &clockSeqLow, - &node[0], - &node[1], - &node[2], - &node[3], - &node[4], - &node[5] - ); - if (nScanned != 11) - { - ACE_DEBUG ((LM_DEBUG, - "UUID::UUID - " - "IllegalArgument(invalid string representation)")); - return; - } - } - else - { - int nScanned = ::sscanf(uuid_string.c_str(), - "%8x-%4x-%4x-%2x%2x-%2x%2x%2x%2x%2x%2x-%s", - &timeLow, - &timeMid, - &timeHiAndVersion, - &clockSeqHiAndReserved, - &clockSeqLow, - &node[0], - &node[1], - &node[2], - &node[3], - &node[4], - &node[5], - thr_pid_buf - ); - if (nScanned != 12) - { - ACE_DEBUG ((LM_DEBUG, - "ACE_UUID::ACE_UUID - " - "IllegalArgument(invalid string representation)")); - return; - } - } - - this->timeLow_ = ACE_static_cast (ACE_UINT32, timeLow); - this->timeMid_ = ACE_static_cast (ACE_UINT16, timeMid); - this->timeHiAndVersion_ = ACE_static_cast (ACE_UINT16, timeHiAndVersion); - this->clockSeqHiAndReserved_ = ACE_static_cast (u_char, clockSeqHiAndReserved); - this->clockSeqLow_ = ACE_static_cast (u_char, clockSeqLow); - - UUID_node::NodeID nodeID; - for (int i = 0; i < UUID_node::NODE_ID_SIZE; ++i) - nodeID [i] = ACE_static_cast (u_char, node[i]); - - this->node_->nodeID (nodeID); - - // Support varient 10- only - if ((this->clockSeqHiAndReserved_ & 0xc0) != 0x80 && (this->clockSeqHiAndReserved_ & 0xc0) != 0xc0) - { - ACE_DEBUG ((LM_DEBUG, - "ACE_UUID_Impl::ACE_UUID_Impl - " - "IllegalArgument(unsupported variant)")); - return; - } - - /// Support versions 1, 3, and 4 only - ACE_UINT16 V1 = this->timeHiAndVersion_; - - if ((V1 & 0xF000) != 0x1000 && - (V1 & 0xF000) != 0x3000 && - (V1 & 0xF000) != 0x4000) - { - ACE_DEBUG ((LM_DEBUG, - "ACE_UUID::ACE_UUID - " - "IllegalArgument(unsupported version)")); - return; - } - if ((this->clockSeqHiAndReserved_ & 0xc0) == 0xc0) - { - if (uuid_string.length() == NIL_UUID.to_string()->length()) - { - ACE_DEBUG ((LM_DEBUG, - "ACE_UUID::ACE_UUID - " - "IllegalArgument (Missing Thread and Process Id)")); - return; - } - ACE_CString thr_pid_str (thr_pid_buf); - int pos = thr_pid_str.find ('-'); - if (pos == -1) - ACE_DEBUG ((LM_DEBUG, - "ACE_UUID::ACE_UUID - " - "IllegalArgument (Thread and Process Id format incorrect)")); - - this->thr_id_ = thr_pid_str.substr (0, pos); - this->pid_ = thr_pid_str.substr (pos+1, thr_pid_str.length ()-pos-1); - } - } - - UUID::~UUID (void) - { - if (node_release_) - delete node_; - - if (as_string_ != 0) - delete as_string_; - } - - const ACE_CString* - UUID::to_string (void) - { - /// Only compute the string representation once. - if (as_string_ == 0) - { - // Get a buffer exactly the correct size. Use the nil UUID as a - // gauge. Don't forget the trailing nul. - int UUID_STRING_LENGTH = 36 + thr_id_.length () + pid_.length (); - char *buf; - - if ((thr_id_.length () != 0) && (pid_.length () != 0)) - { - UUID_STRING_LENGTH += 2; //for '-' - ACE_NEW_RETURN (buf, - char[UUID_STRING_LENGTH + 1], - 0); - - ACE_OS::sprintf(buf, - "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x-%s-%s", - this->timeLow_, - this->timeMid_, - this->timeHiAndVersion_, - this->clockSeqHiAndReserved_, - this->clockSeqLow_, - (this->node_->nodeID ()) [0], - (this->node_->nodeID ()) [1], - (this->node_->nodeID ()) [2], - (this->node_->nodeID ()) [3], - (this->node_->nodeID ()) [4], - (this->node_->nodeID ()) [5], - thr_id_.c_str (), - pid_.c_str () - ); - } - else - { - ACE_NEW_RETURN (buf, - char[UUID_STRING_LENGTH + 1], - 0); - - ACE_OS::sprintf(buf, - "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x", - this->timeLow_, - this->timeMid_, - this->timeHiAndVersion_, - this->clockSeqHiAndReserved_, - this->clockSeqLow_, - (this->node_->nodeID ()) [0], - (this->node_->nodeID ()) [1], - (this->node_->nodeID ()) [2], - (this->node_->nodeID ()) [3], - (this->node_->nodeID ()) [4], - (this->node_->nodeID ()) [5] - ); - } - ACE_NEW_RETURN (this->as_string_, - ACE_CString (buf, UUID_STRING_LENGTH), - 0); - delete buf; - } - - return as_string_; - } - - UUID_Generator::UUID_Generator () - : timeLast_ (0) - { - ACE_NEW (lock_, - ACE_SYNCH_MUTEX); - destroy_lock_ = 1; - } - - UUID_Generator::~UUID_Generator() - { - if (destroy_lock_) - delete lock_; - } - - void - UUID_Generator::init (void) - { - ACE_OS::macaddr_node_t macaddress; - int result = - ACE_OS::getmacaddress (&macaddress); - - UUID_node::NodeID nodeID; - if (result != -1) - { - ACE_DEBUG ((LM_DEBUG, - "%02X-%02X-%02X-%02X-%02X-%02X\n", - macaddress.node [0], - macaddress.node [1], - macaddress.node [2], - macaddress.node [3], - macaddress.node [4], - macaddress.node [5])); - - ACE_OS::memcpy (&nodeID, - macaddress.node, - sizeof (nodeID)); - } - else - { - nodeID [0] = ACE_static_cast (u_char, ACE_OS::rand()); - nodeID [1] = ACE_static_cast (u_char, ACE_OS::rand()); - nodeID [2] = ACE_static_cast (u_char, ACE_OS::rand()); - nodeID [3] = ACE_static_cast (u_char, ACE_OS::rand()); - nodeID [4] = ACE_static_cast (u_char, ACE_OS::rand()); - nodeID [5] = ACE_static_cast (u_char, ACE_OS::rand()); - } - - this->get_timestamp (timeLast_); - - { - ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, *lock_); - uuid_state_.timestamp = timeLast_; - uuid_state_.node.nodeID (nodeID); - } - } - - - void - UUID_Generator::generateUUID (UUID& uuid,ACE_UINT16 version, u_char variant) - { - UUID_time timestamp; - this->get_timestamp (timestamp); - - - // Construct a Version 1 UUID with the information in the arguements. - uuid.timeLow (ACE_static_cast (ACE_UINT32, timestamp & 0xFFFFFFFF)); - uuid.timeMid (ACE_static_cast(ACE_UINT16, (timestamp >> 32) & 0xFFFF)); - - - ACE_UINT16 tHAV = ACE_static_cast (ACE_UINT16, (timestamp >> 48) & 0xFFFF); - tHAV |= (version << 12); - uuid.timeHiAndVersion (tHAV); - - u_char cseqHAV; - { - ACE_GUARD (ACE_SYNCH_MUTEX, mon, *lock_); - uuid.clockSeqLow (uuid_state_.clockSequence & 0xFF); - cseqHAV = (uuid_state_.clockSequence & 0x3f00) >> 8; - uuid_state_.timestamp = timestamp; - } - - cseqHAV |= variant; - uuid.clockSeqHiAndReserved (cseqHAV); - uuid.node (&(uuid_state_.node)); - - if (variant == 0xc0) - { - ACE_thread_t thr_id = ACE_OS::thr_self (); - ACE_hthread_t thr_handle; - ACE_OS::thr_self (thr_handle); - ACE_Thread_ID thread_id (thr_id, thr_handle); - char buf [BUFSIZ]; - thread_id.to_string (buf); - uuid.thr_id (buf); - - ACE_OS::sprintf (buf, - "%d", - ACE_static_cast (int, ACE_OS::getpid ())); - uuid.pid (buf); - } - } - - UUID* - UUID_Generator::generateUUID (ACE_UINT16 version, u_char variant) - { - UUID* uuid; - ACE_NEW_RETURN (uuid, - UUID, - 0); - - this->generateUUID (*uuid, version, variant); - return uuid; - } - - /// Obtain a new timestamp. If UUID's are being generated too quickly - /// the clock sequence will be incremented - void - UUID_Generator::get_timestamp (UUID_time& timestamp) - { - this->get_systemtime(timestamp); - - /// Account for the clock being set back. Increment the clock - /// sequence. - if (timestamp <= timeLast_) - { - { - ACE_GUARD (ACE_SYNCH_MUTEX, mon, *lock_); - uuid_state_.clockSequence = (uuid_state_.clockSequence + 1) & ACE_UUID_CLOCK_SEQ_MASK; - } - } - - /// If the system time ticked since the last UUID was generated. Set - /// the clock sequence back. - else if (timestamp > timeLast_) - { - { - ACE_GUARD (ACE_SYNCH_MUTEX, mon, *lock_); - uuid_state_.clockSequence = 0; - } - } - - timeLast_ = timestamp; - } - - /** - * ACE_Time_Value is in POSIX time, seconds since Jan 1, 1970. UUIDs use - * time in 100ns ticks since 15 October 1582. The difference is: - * 15 Oct 1582 - 1 Jan 1600: 17 days in Oct, 30 in Nov, 31 in Dec + - * 17 years and 4 leap days (1584, 88, 92 and 96) - * 1 Jan 1600 - 1 Jan 1900: 3 centuries + 73 leap days ( 25 in 17th cent. - * and 24 each in 18th and 19th centuries) - * 1 Jan 1900 - 1 Jan 1970: 70 years + 17 leap days. - * This adds up, in days: (17+30+31+365*17+4)+(365*300+73)+(365*70+17) or - * 122192928000000000U (0x1B21DD213814000) 100 ns ticks. - */ - void - UUID_Generator::get_systemtime (UUID_time & timestamp) - { - const UUID_time timeOffset = 0; - //const UUID_time timeOffset = 0x1B21DD213814000; - - /// Get the time of day, convert to 100ns ticks then add the offset. - ACE_Time_Value now = ACE_OS::gettimeofday(); - UUID_time time = now.sec() * 10000000 + now.usec() * 10; - timestamp = time + timeOffset; -} - - ACE_SYNCH_MUTEX* - UUID_Generator::lock (void) - { - return this->lock_; - } - - ACE_SYNCH_MUTEX* - UUID_Generator::lock (ACE_SYNCH_MUTEX* lock, - int release_lock_) - { - if (destroy_lock_) - delete lock_; - - ACE_SYNCH_MUTEX* prev_lock = this->lock_; - this->lock_ = lock; - this->destroy_lock_ = release_lock_; - return prev_lock; - } - -}; - - - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Singleton <ACE_Utils::UUID_Generator, ACE_SYNCH_MUTEX>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Singleton <ACE_Utils::UUID_Generator, ACE_SYNCH_MUTEX> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |