/*
- * Copyright 2012 Facebook, Inc.
+ * Copyright 2011-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
*/
-#include "folly/PackedSyncPtr.h"
+#include <folly/PackedSyncPtr.h>
#include <cinttypes>
-#include <gtest/gtest.h>
#include <thread>
#include <unordered_map>
#include <utility>
+#include <folly/portability/GTest.h>
+
using folly::PackedSyncPtr;
namespace {
// Compile time check for packability. This requires that
// PackedSyncPtr is a POD struct on gcc.
-struct ignore { PackedSyncPtr<int> foo; char c; } __attribute__((packed));
+FOLLY_PACK_PUSH
+struct ignore { PackedSyncPtr<int> foo; char c; } FOLLY_PACK_ATTR;
+FOLLY_PACK_POP
static_assert(sizeof(ignore) == 9, "PackedSyncPtr wasn't packable");
-}
+} // namespace
TEST(PackedSyncPtr, Basic) {
PackedSyncPtr<std::pair<int,int>> sp;
sp.setExtra(0x13);
EXPECT_EQ(sp.extra(), 0x13);
EXPECT_EQ((sp.get() + 1)->second, 7);
- delete sp.get();
+ delete[] sp.get();
auto newP = new std::pair<int,int>();
sp.set(newP);
EXPECT_EQ(sp.extra(), 0x13);
EXPECT_EQ(sp.get(), newP);
sp.unlock();
+ delete sp.get();
}
// Here we use the PackedSyncPtr to lock the whole SyncVec (base, *base, and sz)
-template<typename T>
+template <typename T>
struct SyncVec {
PackedSyncPtr<T> base;
SyncVec() { base.init(); }
+ ~SyncVec() { free(base.get()); }
void push_back(const T& t) {
base.set((T*) realloc(base.get(),
(base.extra() + 1) * sizeof(T)));