You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2014/04/29 15:29:46 UTC

svn commit: r1590978 - in /qpid/trunk/qpid/cpp/src: qpid/legacystore/ qpid/linearstore/ qpid/linearstore/journal/ qpid/sys/ qpid/sys/FreeBSD/ qpid/sys/windows/ qpid/types/ tests/

Author: astitcher
Date: Tue Apr 29 13:29:45 2014
New Revision: 1590978

URL: http://svn.apache.org/r1590978
Log:
QPID-5489: More cleaning up of the Uuid code
- Rewrite the Uuid iosteam extractor and insertor operators
  to not require any underlying uuid library.
- Create a specific uuid implementation for FreeBSD

Added:
    qpid/trunk/qpid/cpp/src/qpid/sys/FreeBSD/
    qpid/trunk/qpid/cpp/src/qpid/sys/FreeBSD/uuid.cpp
      - copied, changed from r1590969, qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h
Removed:
    qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h
Modified:
    qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.cpp
    qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.h
    qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp
    qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.h
    qpid/trunk/qpid/cpp/src/qpid/linearstore/journal/EmptyFilePool.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/uuid.h
    qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp
    qpid/trunk/qpid/cpp/src/qpid/types/Uuid.cpp
    qpid/trunk/qpid/cpp/src/tests/Uuid.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.cpp?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.cpp Tue Apr 29 13:29:45 2014
@@ -59,7 +59,7 @@ void TxnCtxt::commitTxn(JournalImpl* jc,
 }
 
 // static
-uuid_t TxnCtxt::uuid;
+qpid::sys::uuid_t TxnCtxt::uuid;
 
 // static
 IdSequence TxnCtxt::uuidSeq;
@@ -69,7 +69,7 @@ bool TxnCtxt::staticInit = TxnCtxt::setU
 
 // static
 bool TxnCtxt::setUuid() {
-    ::uuid_generate(uuid);
+    qpid::sys::uuid_generate(uuid);
     return true;
 }
 

Modified: qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.h?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/legacystore/TxnCtxt.h Tue Apr 29 13:29:45 2014
@@ -45,7 +45,7 @@ class TxnCtxt : public qpid::broker::Tra
   protected:
     static qpid::sys::Mutex globalSerialiser;
 
-    static uuid_t uuid;
+    static qpid::sys::uuid_t uuid;
     static IdSequence uuidSeq;
     static bool staticInit;
     static bool setUuid();

Modified: qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp Tue Apr 29 13:29:45 2014
@@ -60,7 +60,7 @@ void TxnCtxt::commitTxn(JournalImpl* jc,
 }
 
 // static
-uuid_t TxnCtxt::uuid;
+sys::uuid_t TxnCtxt::uuid;
 
 // static
 IdSequence TxnCtxt::uuidSeq;
@@ -70,7 +70,7 @@ bool TxnCtxt::staticInit = TxnCtxt::setU
 
 // static
 bool TxnCtxt::setUuid() {
-    ::uuid_generate(uuid);
+    qpid::sys::uuid_generate(uuid);
     return true;
 }
 

Modified: qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.h?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/linearstore/TxnCtxt.h Tue Apr 29 13:29:45 2014
@@ -43,7 +43,7 @@ class TxnCtxt : public qpid::broker::Tra
   protected:
     static qpid::sys::Mutex globalSerialiser;
 
-    static uuid_t uuid;
+    static sys::uuid_t uuid;
     static IdSequence uuidSeq;
     static bool staticInit;
     static bool setUuid();

Modified: qpid/trunk/qpid/cpp/src/qpid/linearstore/journal/EmptyFilePool.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/linearstore/journal/EmptyFilePool.cpp?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/linearstore/journal/EmptyFilePool.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/linearstore/journal/EmptyFilePool.cpp Tue Apr 29 13:29:45 2014
@@ -28,7 +28,7 @@
 #include "qpid/linearstore/journal/JournalLog.h"
 #include "qpid/linearstore/journal/slock.h"
 #include "qpid/linearstore/journal/utils/file_hdr.h"
-#include "qpid/sys/uuid.h"
+#include "qpid/types/Uuid.h"
 #include <sys/stat.h>
 #include <unistd.h>
 #include <vector>
@@ -189,12 +189,9 @@ void EmptyFilePool::createEmptyFile() {
 }
 
 std::string EmptyFilePool::getEfpFileName() {
-    uuid_t uuid;
-    ::uuid_generate(uuid); // NOTE: uuid_generate() is not thread safe
-    char uuid_str[37]; // 36 char uuid + trailing \0
-    ::uuid_unparse(uuid, uuid_str);
+    qpid::types::Uuid uuid(true);
     std::ostringstream oss;
-    oss << efpDirectory_ << "/" << uuid_str << QLS_JRNL_FILE_EXTENSION;
+    oss << efpDirectory_ << "/" << uuid << QLS_JRNL_FILE_EXTENSION;
     return oss.str();
 }
 

Copied: qpid/trunk/qpid/cpp/src/qpid/sys/FreeBSD/uuid.cpp (from r1590969, qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h)
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/FreeBSD/uuid.cpp?p2=qpid/trunk/qpid/cpp/src/qpid/sys/FreeBSD/uuid.cpp&p1=qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h&r1=1590969&r2=1590978&rev=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/FreeBSD/uuid.cpp Tue Apr 29 13:29:45 2014
@@ -1,6 +1,3 @@
-#ifndef _sys_windows_uuid_h
-#define _sys_windows_uuid_h
-
 /*
  *
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -22,14 +19,26 @@
  *
  */
 
-#include "qpid/types/ImportExport.h"
-#include <qpid/sys/IntegerTypes.h>
-
-namespace qpid { namespace sys { const size_t UuidSize = 16; }}
-typedef uint8_t uuid_t[qpid::sys::UuidSize];
+#include "qpid/sys/uuid.h"
 
-QPID_TYPES_EXTERN void uuid_generate (uuid_t out);
-QPID_TYPES_EXTERN int  uuid_parse (const char *in, uuid_t uu);  // Returns 0 on success, else -1
-QPID_TYPES_EXTERN void uuid_unparse (const uuid_t uu, char *out);
+#include <string.h>
+#include <uuid.h>
 
-#endif  /*!_sys_windows_uuid_h*/
+extern "C"
+void uuid_generate (uint8_t out[qpid::sys::UuidSize])
+{
+    uuid_t uuid;
+    uint32_t status;
+    uuid_create(&uuid, &status);
+    out[0] = (uuid.time_low & 0xff000000) >> 24;
+    out[1] = (uuid.time_low & 0x00ff0000) >> 16;
+    out[2] = (uuid.time_low & 0x0000ff00) >> 8;
+    out[3] = (uuid.time_low & 0x000000ff);
+    out[4] = (uuid.time_mid & 0xff00) >> 8;
+    out[5] = (uuid.time_mid & 0x00ff);
+    out[6] = (uuid.time_hi_and_version & 0xff00) >> 8;
+    out[7] = (uuid.time_hi_and_version & 0x00ff);
+    out[8] = uuid.clock_seq_hi_and_reserved;
+    out[9] = uuid.clock_seq_low;
+    ::memcpy(&out[10], &uuid.node, _UUID_NODE_LEN);
+}

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/uuid.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/uuid.h?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/uuid.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/uuid.h Tue Apr 29 13:29:45 2014
@@ -19,10 +19,19 @@
  *
  */
 
-#ifdef _WIN32
-#  include "qpid/sys/windows/uuid.h"
-#else
-#  include <uuid/uuid.h>
-#endif /* _WIN32 */
+#include "qpid/types/ImportExport.h"
+
+#include "qpid/sys/IntegerTypes.h"
+
+namespace qpid {
+namespace sys {
+
+const int UuidSize = 16;
+typedef uint8_t uuid_t[UuidSize];
+
+extern "C"
+QPID_TYPES_EXTERN void uuid_generate (uint8_t out[UuidSize]);
+
+}}
 
 #endif /* _sys_uuid_h */

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp Tue Apr 29 13:29:45 2014
@@ -32,7 +32,7 @@
 #  undef uuid_t
 #endif
 
-#include "qpid/sys/windows/uuid.h"
+#include "qpid/sys/uuid.h"
 
 #include <string.h>
 
@@ -43,7 +43,7 @@ inline void iswap (char *p1, char *p2) {
     *p2 = t;
 }
 
-void toUuid (const UUID *guid, uuid_t uuid) {
+void toUuid (const UUID *guid, uint8_t uuid[qpid::sys::UuidSize]) {
     // copy then swap bytes
     memcpy ((char *) uuid, (char *) guid, qpid::sys::UuidSize);
     char *p = (char *) uuid;
@@ -53,40 +53,16 @@ void toUuid (const UUID *guid, uuid_t uu
     iswap (p+6, p+7);
 }
 
-void printHex (const unsigned char *bytes, char *buf, int n) {
-    static char hexrep[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-                          'a', 'b', 'c', 'd', 'e', 'f'};
-    for (;n ; n--) {
-        unsigned char b = *bytes++;
-        *buf++ = hexrep[b >> 4];
-        *buf++ = hexrep[b & 0xf];
-    }
-}
 } // namespace
 
+namespace qpid {
+namespace sys {
 
-void uuid_generate (uuid_t out) {
+void uuid_generate (uint8_t out[qpid::sys::UuidSize]) {
     UUID guid;
     UuidCreate (&guid);
     // Version 4 GUID, convert to UUID
     toUuid (&guid, out);
 }
 
-int uuid_parse (const char *in, uuid_t uu) {
-    UUID guid;
-    if (UuidFromString ((unsigned char*)in, &guid) != RPC_S_OK)
-        return -1;
-    toUuid (&guid, uu);
-    return 0;
-}
-
-void uuid_unparse (const uuid_t uu, char *out) {
-    const uint8_t *in = uu;
-    out[8] = out[13] = out[18] = out[23] = '-';
-    printHex (in, out, 4);
-    printHex (in+4, out+9, 2);
-    printHex (in+6, out+14, 2);
-    printHex (in+8, out+19, 2);
-    printHex (in+10, out+24, 6);
-    out[36] = '\0';
-}
+}}

Modified: qpid/trunk/qpid/cpp/src/qpid/types/Uuid.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/types/Uuid.cpp?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/types/Uuid.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/types/Uuid.cpp Tue Apr 29 13:29:45 2014
@@ -23,6 +23,8 @@
 #include "qpid/sys/IntegerTypes.h"
 #include <sstream>
 #include <iostream>
+#include <iomanip>
+#include <stdio.h>
 #include <string.h>
 
 namespace qpid {
@@ -31,7 +33,7 @@ namespace types {
 using namespace std;
 
 const size_t Uuid::SIZE=16;
-static const size_t UNPARSED_SIZE=36; 
+static const int UNPARSED_SIZE=36;
 
 Uuid::Uuid(bool unique)
 {
@@ -66,7 +68,7 @@ Uuid& Uuid::operator=(const Uuid& other)
 
 void Uuid::generate()
 {
-    uuid_generate(bytes);
+    sys::uuid_generate(bytes);
 }
 
 void Uuid::clear()
@@ -122,17 +124,69 @@ bool operator>=(const Uuid& a, const Uui
 
 ostream& operator<<(ostream& out, Uuid uuid)
 {
-    char unparsed[UNPARSED_SIZE + 1];
-    uuid_unparse(uuid.bytes, unparsed);
-    return out << unparsed;
+    const uint8_t* bytes = uuid.bytes;
+
+    ios_base::fmtflags f = out.flags();
+    out << hex << setfill('0')
+        << setw(2) << int(bytes[0])
+        << setw(2) << int(bytes[1])
+        << setw(2) << int(bytes[2])
+        << setw(2) << int(bytes[3])
+        << "-"
+        << setw(2) << int(bytes[4])
+        << setw(2) << int(bytes[5])
+        << "-"
+        << setw(2) << int(bytes[6])
+        << setw(2) << int(bytes[7])
+        << "-"
+        << setw(2) << int(bytes[8])
+        << setw(2) << int(bytes[9])
+        << "-"
+        << setw(2) << int(bytes[10])
+        << setw(2) << int(bytes[11])
+        << setw(2) << int(bytes[12])
+        << setw(2) << int(bytes[13])
+        << setw(2) << int(bytes[14])
+        << setw(2) << int(bytes[15]);
+    out.flags(f);
+    return out;
 }
 
 istream& operator>>(istream& in, Uuid& uuid)
 {
+    unsigned bytes[16];
     char unparsed[UNPARSED_SIZE + 1] = {0};
-    in.get(unparsed, sizeof(unparsed));
-    if (uuid_parse(unparsed, uuid.bytes) != 0) 
+
+    istream::sentry s(in);
+    if ( !s ) return in;
+
+    in.get(unparsed, UNPARSED_SIZE+1);
+
+    // Check if we read enough characters
+    if ( in.gcount()!=UNPARSED_SIZE ) {
         in.setstate(ios::failbit);
+        return in;
+    }
+    int r = ::sscanf(unparsed, "%2x%2x%2x%2x-"
+                               "%2x%2x-"
+                               "%2x%2x-"
+                               "%2x%2x-"
+                               "%2x%2x%2x%2x%2x%2x",
+                     &bytes[0], &bytes[1], &bytes[2], &bytes[3],
+                     &bytes[4], &bytes[5],
+                     &bytes[6], &bytes[7],
+                     &bytes[8], &bytes[9],
+                     &bytes[10], &bytes[11], &bytes[12], &bytes[13], &bytes[14], &bytes[15]
+                    );
+    // Check if we got enough converted input
+    if ( r!=int(Uuid::SIZE) ) {
+        in.setstate(ios::failbit);
+        return in;
+    }
+
+    for (unsigned i=0; i<16; ++i) {
+      uuid.bytes[i] = bytes[i];
+    }
     return in;
 }
 

Modified: qpid/trunk/qpid/cpp/src/tests/Uuid.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/Uuid.cpp?rev=1590978&r1=1590977&r2=1590978&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/Uuid.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/Uuid.cpp Tue Apr 29 13:29:45 2014
@@ -49,9 +49,11 @@ QPID_AUTO_TEST_CASE(testUuidCtor) {
     for_each(uuids.begin(), uuids.end(), unique);
 }
 
-boost::array<uint8_t, 16>  sample =  {{0x1b, 0x4e, 0x28, 0xba, 0x2f, 0xa1, 0x11, 0xd2, 0x88, 0x3f, 0xb9, 0xa7, 0x61, 0xbd, 0xe3, 0xfb}};
-const string sampleStr("1b4e28ba-2fa1-11d2-883f-b9a761bde3fb");
+boost::array<uint8_t, 16>  sample =  {{0x1b, 0x4e, 0x28, 0xba, 0x2f, 0xa1, 0x11, 0x02, 0x88, 0x3f, 0xb9, 0xa7, 0x61, 0xbd, 0xe3, 0xfb}};
+const string sampleStr("1b4e28ba-2fa1-1102-883f-b9a761bde3fb");
 const string zeroStr("00000000-0000-0000-0000-000000000000");
+const string badUuid1("1b4e28ba-2fa1-11d2-883f-b9761bde3fb");
+const string badUuid2("1b4e28ba-2fa1-11d23883f-b9761dbde3fb");
 
 QPID_AUTO_TEST_CASE(testUuidIstream) {
     Uuid uuid;
@@ -63,7 +65,7 @@ QPID_AUTO_TEST_CASE(testUuidIstream) {
     istringstream is(zeroStr);
     Uuid zero;
     is >> zero;
-    BOOST_CHECK(!in.fail());
+    BOOST_CHECK(!is.fail());
     BOOST_CHECK_EQUAL(zero, Uuid());
 }
 
@@ -80,6 +82,16 @@ QPID_AUTO_TEST_CASE(testUuidOstream) {
     BOOST_CHECK_EQUAL(os.str(), zeroStr);
 }
 
+QPID_AUTO_TEST_CASE(testBadUuidIstream) {
+  Uuid a;
+  istringstream is(badUuid1);
+  is >> a;
+  BOOST_CHECK(!is.good());
+  istringstream is2(badUuid2);
+  is2 >> a;
+  BOOST_CHECK(!is2.good());
+}
+
 QPID_AUTO_TEST_CASE(testUuidIOstream) {
     Uuid a(true), b(true);
     ostringstream os;



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org