Compare commits
13 Commits
cf-integri
...
9c82f17e20
| Author | SHA1 | Date | |
|---|---|---|---|
| 9c82f17e20 | |||
| 665a9313a4 | |||
| 6e66202d5e | |||
| a92271a205 | |||
| 0dbfb4deae | |||
| 6e229b6b36 | |||
| 2200de11c8 | |||
| b37feb58dd | |||
| 94a4802824 | |||
| 707dbdb391 | |||
| bdd343bb57 | |||
| 7b31bd5efe | |||
| e255e1a926 |
@@ -31,11 +31,24 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|||||||
"MinSizeRel" "RelWithDebInfo")
|
"MinSizeRel" "RelWithDebInfo")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_compile_options(-fdata-sections -ffunction-sections -Wswitch-enum
|
add_compile_options(
|
||||||
-Werror=switch-enum -fPIC)
|
-Werror=switch-enum
|
||||||
|
-Wswitch-enum
|
||||||
|
-Wunused-variable
|
||||||
|
-fPIC
|
||||||
|
-fdata-sections
|
||||||
|
-ffunction-sections
|
||||||
|
-fno-jump-tables # https://github.com/llvm/llvm-project/issues/54247
|
||||||
|
)
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
add_link_options("-Wno-unused-command-line-argument")
|
add_link_options("-Wno-unused-command-line-argument")
|
||||||
|
find_program(LLVM_OBJCOPY llvm-objcopy)
|
||||||
|
if(LLVM_OBJCOPY)
|
||||||
|
set(CMAKE_OBJCOPY
|
||||||
|
${LLVM_OBJCOPY}
|
||||||
|
CACHE FILEPATH "path to objcopy binary" FORCE)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
@@ -56,6 +69,21 @@ if(HAS_FULL_RELRO)
|
|||||||
endif()
|
endif()
|
||||||
cmake_pop_check_state()
|
cmake_pop_check_state()
|
||||||
|
|
||||||
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
|
||||||
|
add_compile_options(-mbranch-protection=standard)
|
||||||
|
else()
|
||||||
|
add_compile_options(-fcf-protection)
|
||||||
|
set(rewrite_endbr_flags "-fuse-ld=mold;LINKER:-z,rewrite-endbr")
|
||||||
|
cmake_push_check_state()
|
||||||
|
list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${rewrite_endbr_flags})
|
||||||
|
check_cxx_source_compiles("int main(){}" HAS_REWRITE_ENDBR FAIL_REGEX
|
||||||
|
"warning:")
|
||||||
|
if(HAS_REWRITE_ENDBR)
|
||||||
|
add_link_options(${rewrite_endbr_flags})
|
||||||
|
endif()
|
||||||
|
cmake_pop_check_state()
|
||||||
|
endif()
|
||||||
|
|
||||||
set(version_script_flags
|
set(version_script_flags
|
||||||
LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/linker.map)
|
LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/linker.map)
|
||||||
cmake_push_check_state()
|
cmake_push_check_state()
|
||||||
@@ -81,19 +109,11 @@ else()
|
|||||||
add_link_options(-Wl,--gc-sections)
|
add_link_options(-Wl,--gc-sections)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT USE_SIMD_FALLBACK)
|
if(USE_SIMD_FALLBACK)
|
||||||
cmake_push_check_state()
|
add_compile_definitions(USE_SIMD_FALLBACK)
|
||||||
list(APPEND CMAKE_REQUIRED_FLAGS -mavx)
|
else()
|
||||||
check_include_file_cxx("immintrin.h" HAS_AVX)
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
|
||||||
if(HAS_AVX)
|
|
||||||
add_compile_options(-mavx)
|
add_compile_options(-mavx)
|
||||||
add_compile_definitions(HAS_AVX)
|
|
||||||
endif()
|
|
||||||
cmake_pop_check_state()
|
|
||||||
|
|
||||||
check_include_file_cxx("arm_neon.h" HAS_ARM_NEON)
|
|
||||||
if(HAS_ARM_NEON)
|
|
||||||
add_compile_definitions(HAS_ARM_NEON)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -323,7 +343,8 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND BUILD_TESTING)
|
|||||||
# c++98
|
# c++98
|
||||||
add_executable(conflict_set_cxx_api_test conflict_set_cxx_api_test.cpp)
|
add_executable(conflict_set_cxx_api_test conflict_set_cxx_api_test.cpp)
|
||||||
target_compile_options(conflict_set_cxx_api_test PRIVATE ${TEST_FLAGS})
|
target_compile_options(conflict_set_cxx_api_test PRIVATE ${TEST_FLAGS})
|
||||||
target_link_libraries(conflict_set_cxx_api_test PRIVATE ${PROJECT_NAME})
|
target_link_libraries(conflict_set_cxx_api_test
|
||||||
|
PRIVATE ${PROJECT_NAME}-static)
|
||||||
set_target_properties(conflict_set_cxx_api_test PROPERTIES CXX_STANDARD 98)
|
set_target_properties(conflict_set_cxx_api_test PROPERTIES CXX_STANDARD 98)
|
||||||
set_target_properties(conflict_set_cxx_api_test
|
set_target_properties(conflict_set_cxx_api_test
|
||||||
PROPERTIES CXX_STANDARD_REQUIRED ON)
|
PROPERTIES CXX_STANDARD_REQUIRED ON)
|
||||||
@@ -356,6 +377,15 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND BUILD_TESTING)
|
|||||||
${symbol_imports})
|
${symbol_imports})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_CROSSCOMPILING)
|
||||||
|
find_program(HARDENING_CHECK hardening-check)
|
||||||
|
if(HARDENING_CHECK)
|
||||||
|
add_test(NAME hardening_check
|
||||||
|
COMMAND ${HARDENING_CHECK} $<TARGET_FILE:${PROJECT_NAME}>
|
||||||
|
--nofortify --nostackprotector)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# bench
|
# bench
|
||||||
add_executable(conflict_set_bench Bench.cpp)
|
add_executable(conflict_set_bench Bench.cpp)
|
||||||
target_link_libraries(conflict_set_bench PRIVATE ${PROJECT_NAME} nanobench)
|
target_link_libraries(conflict_set_bench PRIVATE ${PROJECT_NAME} nanobench)
|
||||||
|
|||||||
129
ConflictSet.cpp
129
ConflictSet.cpp
@@ -14,6 +14,16 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if !defined(USE_SIMD_FALLBACK) && defined(__has_include)
|
||||||
|
#if __has_include("immintrin.h")
|
||||||
|
#define HAS_AVX 1
|
||||||
|
#include <immintrin.h>
|
||||||
|
#elif __has_include("arm_neon.h")
|
||||||
|
#define HAS_ARM_NEON 1
|
||||||
|
#include <arm_neon.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "ConflictSet.h"
|
#include "ConflictSet.h"
|
||||||
#include "Internal.h"
|
#include "Internal.h"
|
||||||
#include "LongestCommonPrefix.h"
|
#include "LongestCommonPrefix.h"
|
||||||
@@ -34,12 +44,6 @@ limitations under the License.
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#ifdef HAS_AVX
|
|
||||||
#include <immintrin.h>
|
|
||||||
#elif defined(HAS_ARM_NEON)
|
|
||||||
#include <arm_neon.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __SANITIZE_THREAD__
|
#ifndef __SANITIZE_THREAD__
|
||||||
#if defined(__has_feature)
|
#if defined(__has_feature)
|
||||||
#if __has_feature(thread_sanitizer)
|
#if __has_feature(thread_sanitizer)
|
||||||
@@ -696,8 +700,6 @@ constexpr int64_t kMaxFreeListBytes = 1 << 20;
|
|||||||
// doesn't meet the capacity constraints, it's freed and a new node is allocated
|
// doesn't meet the capacity constraints, it's freed and a new node is allocated
|
||||||
// with the minimum capacity. The hope is that "unfit" nodes don't get stuck in
|
// with the minimum capacity. The hope is that "unfit" nodes don't get stuck in
|
||||||
// the free list.
|
// the free list.
|
||||||
//
|
|
||||||
// TODO valgrind annotations
|
|
||||||
template <class T> struct NodeAllocator {
|
template <class T> struct NodeAllocator {
|
||||||
|
|
||||||
static_assert(std::derived_from<T, Node>);
|
static_assert(std::derived_from<T, Node>);
|
||||||
@@ -734,6 +736,7 @@ template <class T> struct NodeAllocator {
|
|||||||
p->parent = freeList;
|
p->parent = freeList;
|
||||||
freeList = p;
|
freeList = p;
|
||||||
freeListSize += sizeof(T) + p->partialKeyCapacity;
|
freeListSize += sizeof(T) + p->partialKeyCapacity;
|
||||||
|
VALGRIND_MAKE_MEM_NOACCESS(p, sizeof(T) + p->partialKeyCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void deferRelease(T *p, Node *forwardTo) {
|
void deferRelease(T *p, Node *forwardTo) {
|
||||||
@@ -755,6 +758,13 @@ template <class T> struct NodeAllocator {
|
|||||||
void releaseDeferred() {
|
void releaseDeferred() {
|
||||||
if (deferredList != nullptr) {
|
if (deferredList != nullptr) {
|
||||||
deferredListFront->parent = freeList;
|
deferredListFront->parent = freeList;
|
||||||
|
#ifndef NVALGRIND
|
||||||
|
for (auto *iter = deferredList; iter != freeList;) {
|
||||||
|
auto *tmp = iter;
|
||||||
|
iter = (T *)iter->parent;
|
||||||
|
VALGRIND_MAKE_MEM_NOACCESS(tmp, sizeof(T) + tmp->partialKeyCapacity);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
freeList = std::exchange(deferredList, nullptr);
|
freeList = std::exchange(deferredList, nullptr);
|
||||||
}
|
}
|
||||||
for (T *n = std::exchange(deferredListOverflow, nullptr); n != nullptr;) {
|
for (T *n = std::exchange(deferredListOverflow, nullptr); n != nullptr;) {
|
||||||
@@ -775,6 +785,7 @@ template <class T> struct NodeAllocator {
|
|||||||
assert(deferredList == nullptr);
|
assert(deferredList == nullptr);
|
||||||
assert(deferredListOverflow == nullptr);
|
assert(deferredListOverflow == nullptr);
|
||||||
for (T *iter = freeList; iter != nullptr;) {
|
for (T *iter = freeList; iter != nullptr;) {
|
||||||
|
VALGRIND_MAKE_MEM_DEFINED(iter, sizeof(T));
|
||||||
auto *tmp = iter;
|
auto *tmp = iter;
|
||||||
iter = (T *)iter->parent;
|
iter = (T *)iter->parent;
|
||||||
removeNode(tmp);
|
removeNode(tmp);
|
||||||
@@ -792,6 +803,7 @@ private:
|
|||||||
|
|
||||||
T *allocate_helper(int minCapacity, int maxCapacity) {
|
T *allocate_helper(int minCapacity, int maxCapacity) {
|
||||||
if (freeList != nullptr) {
|
if (freeList != nullptr) {
|
||||||
|
VALGRIND_MAKE_MEM_DEFINED(freeList, sizeof(T));
|
||||||
freeListSize -= sizeof(T) + freeList->partialKeyCapacity;
|
freeListSize -= sizeof(T) + freeList->partialKeyCapacity;
|
||||||
assume(freeList->partialKeyCapacity >= 0);
|
assume(freeList->partialKeyCapacity >= 0);
|
||||||
assume(minCapacity >= 0);
|
assume(minCapacity >= 0);
|
||||||
@@ -800,6 +812,11 @@ private:
|
|||||||
freeList->partialKeyCapacity <= maxCapacity) {
|
freeList->partialKeyCapacity <= maxCapacity) {
|
||||||
auto *result = freeList;
|
auto *result = freeList;
|
||||||
freeList = (T *)freeList->parent;
|
freeList = (T *)freeList->parent;
|
||||||
|
VALGRIND_MAKE_MEM_UNDEFINED(result,
|
||||||
|
sizeof(T) + result->partialKeyCapacity);
|
||||||
|
VALGRIND_MAKE_MEM_DEFINED(&result->partialKeyCapacity,
|
||||||
|
sizeof(result->partialKeyCapacity));
|
||||||
|
VALGRIND_MAKE_MEM_DEFINED(&result->type, sizeof(result->type));
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
auto *p = freeList;
|
auto *p = freeList;
|
||||||
@@ -3183,6 +3200,12 @@ Node *firstGeqPhysical(Node *n, const TrivialSpan key) {
|
|||||||
#define PRESERVE_NONE
|
#define PRESERVE_NONE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if __has_attribute(musttail) && __has_attribute(preserve_none)
|
||||||
|
constexpr bool kEnableInterleaved = true;
|
||||||
|
#else
|
||||||
|
constexpr bool kEnableInterleaved = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace check {
|
namespace check {
|
||||||
|
|
||||||
typedef PRESERVE_NONE void (*Continuation)(struct Job *, struct Context *);
|
typedef PRESERVE_NONE void (*Continuation)(struct Job *, struct Context *);
|
||||||
@@ -4969,51 +4992,50 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
check::Context context;
|
check::Context context;
|
||||||
context.readContext.impl = this;
|
context.readContext.impl = this;
|
||||||
|
|
||||||
#if __has_attribute(musttail)
|
if constexpr (kEnableInterleaved) {
|
||||||
if (count == 1) {
|
if (count == 1) {
|
||||||
useSequential(reads, result, count, context);
|
useSequential(reads, result, count, context);
|
||||||
} else {
|
} else {
|
||||||
constexpr int kConcurrent = 16;
|
constexpr int kConcurrent = 16;
|
||||||
check::Job inProgress[kConcurrent];
|
check::Job inProgress[kConcurrent];
|
||||||
context.count = count;
|
context.count = count;
|
||||||
context.oldestVersionFullPrecision = oldestVersionFullPrecision;
|
context.oldestVersionFullPrecision = oldestVersionFullPrecision;
|
||||||
context.root = root;
|
context.root = root;
|
||||||
context.queries = reads;
|
context.queries = reads;
|
||||||
context.results = result;
|
context.results = result;
|
||||||
int64_t started = std::min(kConcurrent, count);
|
int64_t started = std::min(kConcurrent, count);
|
||||||
context.started = started;
|
context.started = started;
|
||||||
for (int i = 0; i < started; i++) {
|
for (int i = 0; i < started; i++) {
|
||||||
inProgress[i].init(reads + i, result + i, root,
|
inProgress[i].init(reads + i, result + i, root,
|
||||||
oldestVersionFullPrecision);
|
oldestVersionFullPrecision);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < started - 1; i++) {
|
for (int i = 0; i < started - 1; i++) {
|
||||||
inProgress[i].next = inProgress + i + 1;
|
inProgress[i].next = inProgress + i + 1;
|
||||||
}
|
}
|
||||||
for (int i = 1; i < started; i++) {
|
for (int i = 1; i < started; i++) {
|
||||||
inProgress[i].prev = inProgress + i - 1;
|
inProgress[i].prev = inProgress + i - 1;
|
||||||
}
|
}
|
||||||
inProgress[0].prev = inProgress + started - 1;
|
inProgress[0].prev = inProgress + started - 1;
|
||||||
inProgress[started - 1].next = inProgress;
|
inProgress[started - 1].next = inProgress;
|
||||||
|
|
||||||
// Kick off the sequence of tail calls that finally returns once all jobs
|
// Kick off the sequence of tail calls that finally returns once all
|
||||||
// are done
|
// jobs are done
|
||||||
inProgress->continuation(inProgress, &context);
|
inProgress->continuation(inProgress, &context);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
Arena arena;
|
Arena arena;
|
||||||
auto *results2 = new (arena) Result[count];
|
auto *results2 = new (arena) Result[count];
|
||||||
check::Context context2;
|
check::Context context2;
|
||||||
context2.readContext.impl = this;
|
context2.readContext.impl = this;
|
||||||
useSequential(reads, results2, count, context2);
|
useSequential(reads, results2, count, context2);
|
||||||
assert(memcmp(result, results2, count) == 0);
|
assert(memcmp(result, results2, count) == 0);
|
||||||
assert(context.readContext == context2.readContext);
|
assert(context.readContext == context2.readContext);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
useSequential(reads, result, count, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
useSequential(reads, result, count, context);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
assert(reads[i].readVersion >= 0);
|
assert(reads[i].readVersion >= 0);
|
||||||
assert(reads[i].readVersion <= newestVersionFullPrecision);
|
assert(reads[i].readVersion <= newestVersionFullPrecision);
|
||||||
@@ -5186,11 +5208,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
assert(allPointWrites || sorted);
|
assert(allPointWrites || sorted);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __has_attribute(musttail)
|
|
||||||
constexpr bool kEnableInterleaved = true;
|
|
||||||
#else
|
|
||||||
constexpr bool kEnableInterleaved = false;
|
|
||||||
#endif
|
|
||||||
if (kEnableInterleaved && count > 1) {
|
if (kEnableInterleaved && count > 1) {
|
||||||
interleavedWrites(writes, count, InternalVersionT(writeVersion));
|
interleavedWrites(writes, count, InternalVersionT(writeVersion));
|
||||||
} else {
|
} else {
|
||||||
@@ -5858,13 +5875,13 @@ void checkVersionsGeqOldestExtant(Node *n,
|
|||||||
case Type_Node0: {
|
case Type_Node0: {
|
||||||
} break;
|
} break;
|
||||||
case Type_Node3: {
|
case Type_Node3: {
|
||||||
auto *self = static_cast<Node3 *>(n);
|
[[maybe_unused]] auto *self = static_cast<Node3 *>(n);
|
||||||
for (int i = 0; i < 3; ++i) {
|
for (int i = 0; i < 3; ++i) {
|
||||||
assert(self->childMaxVersion[i] >= oldestExtantVersion);
|
assert(self->childMaxVersion[i] >= oldestExtantVersion);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case Type_Node16: {
|
case Type_Node16: {
|
||||||
auto *self = static_cast<Node16 *>(n);
|
[[maybe_unused]] auto *self = static_cast<Node16 *>(n);
|
||||||
for (int i = 0; i < 16; ++i) {
|
for (int i = 0; i < 16; ++i) {
|
||||||
assert(self->childMaxVersion[i] >= oldestExtantVersion);
|
assert(self->childMaxVersion[i] >= oldestExtantVersion);
|
||||||
}
|
}
|
||||||
@@ -5874,7 +5891,7 @@ void checkVersionsGeqOldestExtant(Node *n,
|
|||||||
for (int i = 0; i < 48; ++i) {
|
for (int i = 0; i < 48; ++i) {
|
||||||
assert(self->childMaxVersion[i] >= oldestExtantVersion);
|
assert(self->childMaxVersion[i] >= oldestExtantVersion);
|
||||||
}
|
}
|
||||||
for (auto m : self->maxOfMax) {
|
for ([[maybe_unused]] auto m : self->maxOfMax) {
|
||||||
assert(m >= oldestExtantVersion);
|
assert(m >= oldestExtantVersion);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@@ -5883,7 +5900,7 @@ void checkVersionsGeqOldestExtant(Node *n,
|
|||||||
for (int i = 0; i < 256; ++i) {
|
for (int i = 0; i < 256; ++i) {
|
||||||
assert(self->childMaxVersion[i] >= oldestExtantVersion);
|
assert(self->childMaxVersion[i] >= oldestExtantVersion);
|
||||||
}
|
}
|
||||||
for (auto m : self->maxOfMax) {
|
for ([[maybe_unused]] auto m : self->maxOfMax) {
|
||||||
assert(m >= oldestExtantVersion);
|
assert(m >= oldestExtantVersion);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|||||||
@@ -13,12 +13,14 @@ RUN TZ=America/Los_Angeles DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
|||||||
ccache \
|
ccache \
|
||||||
cmake \
|
cmake \
|
||||||
curl \
|
curl \
|
||||||
|
devscripts \
|
||||||
g++-aarch64-linux-gnu \
|
g++-aarch64-linux-gnu \
|
||||||
gcovr \
|
gcovr \
|
||||||
git \
|
git \
|
||||||
gnupg \
|
gnupg \
|
||||||
libc6-dbg \
|
libc6-dbg \
|
||||||
lsb-release \
|
lsb-release \
|
||||||
|
mold \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
pre-commit \
|
pre-commit \
|
||||||
python3-requests \
|
python3-requests \
|
||||||
|
|||||||
4
Jenkinsfile
vendored
4
Jenkinsfile
vendored
@@ -91,7 +91,7 @@ pipeline {
|
|||||||
minio bucket: 'jenkins', credentialsId: 'jenkins-minio', excludes: '', host: 'minio.weaselab.dev', includes: 'build/*.deb,build/*.rpm,paper/*.pdf', targetFolder: '${JOB_NAME}/${BUILD_NUMBER}/${STAGE_NAME}/'
|
minio bucket: 'jenkins', credentialsId: 'jenkins-minio', excludes: '', host: 'minio.weaselab.dev', includes: 'build/*.deb,build/*.rpm,paper/*.pdf', targetFolder: '${JOB_NAME}/${BUILD_NUMBER}/${STAGE_NAME}/'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Release [gcc]') {
|
stage('gcc') {
|
||||||
agent {
|
agent {
|
||||||
dockerfile {
|
dockerfile {
|
||||||
args '-v /home/jenkins/ccache:/ccache'
|
args '-v /home/jenkins/ccache:/ccache'
|
||||||
@@ -99,7 +99,7 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
CleanBuildAndTest("-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_CXX_FLAGS=-DNVALGRIND")
|
CleanBuildAndTest("-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++")
|
||||||
recordIssues(tools: [gcc()])
|
recordIssues(tools: [gcc()])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string_view>
|
#include <span>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -64,7 +64,7 @@ int main(int argc, const char **argv) {
|
|||||||
auto *const mapOriginal = begin;
|
auto *const mapOriginal = begin;
|
||||||
const auto sizeOriginal = size;
|
const auto sizeOriginal = size;
|
||||||
|
|
||||||
using StringView = std::basic_string_view<uint8_t>;
|
using StringView = std::span<const uint8_t>;
|
||||||
|
|
||||||
StringView write;
|
StringView write;
|
||||||
std::vector<StringView> reads;
|
std::vector<StringView> reads;
|
||||||
@@ -78,9 +78,9 @@ int main(int argc, const char **argv) {
|
|||||||
end = (uint8_t *)memchr(begin, '\n', size);
|
end = (uint8_t *)memchr(begin, '\n', size);
|
||||||
|
|
||||||
if (line.size() > 0 && line[0] == 'P') {
|
if (line.size() > 0 && line[0] == 'P') {
|
||||||
write = line.substr(2, line.size());
|
write = line.subspan(2, line.size());
|
||||||
} else if (line.size() > 0 && line[0] == 'L') {
|
} else if (line.size() > 0 && line[0] == 'L') {
|
||||||
reads.push_back(line.substr(2, line.size()));
|
reads.push_back(line.subspan(2, line.size()));
|
||||||
} else if (line.empty()) {
|
} else if (line.empty()) {
|
||||||
{
|
{
|
||||||
readRanges.resize(reads.size());
|
readRanges.resize(reads.size());
|
||||||
|
|||||||
@@ -64,31 +64,47 @@ template <class... Ts> std::string tupleKey(const Ts &...ts) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr int kWindowSize = 300000;
|
constexpr int kTotalKeyRange = 1'000'000'000;
|
||||||
|
constexpr int kWindowSize = 1'000'000;
|
||||||
|
constexpr int kNumKeys = 10;
|
||||||
|
|
||||||
void workload(weaselab::ConflictSet *cs) {
|
void workload(weaselab::ConflictSet *cs) {
|
||||||
int64_t version = kWindowSize;
|
int64_t version = kWindowSize;
|
||||||
constexpr int kNumWrites = 16;
|
|
||||||
for (;; transactions.fetch_add(1, std::memory_order_relaxed)) {
|
for (;; transactions.fetch_add(1, std::memory_order_relaxed)) {
|
||||||
std::vector<int64_t> keyIndices;
|
std::vector<int64_t> keyIndices;
|
||||||
for (int i = 0; i < kNumWrites; ++i) {
|
for (int i = 0; i < kNumKeys; ++i) {
|
||||||
keyIndices.push_back(rand() % 100'000'000);
|
keyIndices.push_back(rand() % kTotalKeyRange);
|
||||||
}
|
}
|
||||||
std::sort(keyIndices.begin(), keyIndices.end());
|
std::sort(keyIndices.begin(), keyIndices.end());
|
||||||
std::vector<std::string> keys;
|
std::vector<std::string> keys;
|
||||||
std::vector<weaselab::ConflictSet::WriteRange> writes;
|
constexpr std::string_view fullString =
|
||||||
constexpr std::string_view suffix = "this is a suffix";
|
"this is a string, where a prefix of it is used as an element of the "
|
||||||
for (int i = 0; i < kNumWrites; ++i) {
|
"tuple forming the key";
|
||||||
keys.push_back(tupleKey(0x100, i, keyIndices[i],
|
for (int i = 0; i < kNumKeys; ++i) {
|
||||||
suffix.substr(0, rand() % suffix.size()),
|
keys.push_back(
|
||||||
rand()));
|
tupleKey(0x100, keyIndices[i] / fullString.size(),
|
||||||
|
fullString.substr(0, keyIndices[i] % fullString.size())));
|
||||||
// printf("%s\n", printable(keys.back()).c_str());
|
// printf("%s\n", printable(keys.back()).c_str());
|
||||||
}
|
}
|
||||||
for (int i = 0; i < kNumWrites; ++i) {
|
|
||||||
|
std::vector<weaselab::ConflictSet::ReadRange> reads;
|
||||||
|
std::vector<weaselab::ConflictSet::WriteRange> writes;
|
||||||
|
std::vector<weaselab::ConflictSet::Result> results;
|
||||||
|
for (int i = 0; i < kNumKeys; ++i) {
|
||||||
writes.push_back({{(const uint8_t *)keys[i].data(), int(keys[i].size())},
|
writes.push_back({{(const uint8_t *)keys[i].data(), int(keys[i].size())},
|
||||||
{nullptr, 0}});
|
{nullptr, 0}});
|
||||||
|
reads.push_back({{(const uint8_t *)keys[i].data(), int(keys[i].size())},
|
||||||
|
{nullptr, 0},
|
||||||
|
version - kWindowSize});
|
||||||
}
|
}
|
||||||
cs->addWrites(writes.data(), writes.size(), version);
|
results.resize(reads.size());
|
||||||
|
|
||||||
|
cs->check(reads.data(), results.data(), reads.size());
|
||||||
|
bool ok = true;
|
||||||
|
for (auto result : results) {
|
||||||
|
ok &= result == weaselab::ConflictSet::Commit;
|
||||||
|
}
|
||||||
|
cs->addWrites(writes.data(), ok ? writes.size() : 0, version);
|
||||||
cs->setOldestVersion(version - kWindowSize);
|
cs->setOldestVersion(version - kWindowSize);
|
||||||
++version;
|
++version;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -767,7 +767,9 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
false, true);
|
false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
sortPoints(points);
|
if (!std::is_sorted(points.begin(), points.end())) {
|
||||||
|
sortPoints(points);
|
||||||
|
}
|
||||||
|
|
||||||
int activeWriteCount = 0;
|
int activeWriteCount = 0;
|
||||||
std::vector<std::pair<StringRef, StringRef>> combinedWriteConflictRanges;
|
std::vector<std::pair<StringRef, StringRef>> combinedWriteConflictRanges;
|
||||||
@@ -794,7 +796,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
int temp[stripeSize];
|
int temp[stripeSize];
|
||||||
int stripes = (stringCount + stripeSize - 1) / stripeSize;
|
int stripes = (stringCount + stripeSize - 1) / stripeSize;
|
||||||
StringRef values[stripeSize];
|
StringRef values[stripeSize];
|
||||||
int64_t writeVersions[stripeSize / 2];
|
|
||||||
int ss = stringCount - (stripes - 1) * stripeSize;
|
int ss = stringCount - (stripes - 1) * stripeSize;
|
||||||
int64_t entryDelta = 0;
|
int64_t entryDelta = 0;
|
||||||
for (int s = stripes - 1; s >= 0; s--) {
|
for (int s = stripes - 1; s >= 0; s--) {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
___chkstk_darwin
|
||||||
___stack_chk_fail
|
___stack_chk_fail
|
||||||
___stack_chk_guard
|
___stack_chk_guard
|
||||||
__tlv_bootstrap
|
__tlv_bootstrap
|
||||||
@@ -5,6 +6,7 @@ _abort
|
|||||||
_bzero
|
_bzero
|
||||||
_free
|
_free
|
||||||
_malloc
|
_malloc
|
||||||
|
_memcmp
|
||||||
_memcpy
|
_memcpy
|
||||||
_memmove
|
_memmove
|
||||||
dyld_stub_binder
|
dyld_stub_binder
|
||||||
BIN
corpus/03d3918b737a86ed38fbeae6dff198d6913b90b2
Normal file
BIN
corpus/03d3918b737a86ed38fbeae6dff198d6913b90b2
Normal file
Binary file not shown.
BIN
corpus/0d35b148f45f7e3f722f4ac298558ba0dd545b48
Normal file
BIN
corpus/0d35b148f45f7e3f722f4ac298558ba0dd545b48
Normal file
Binary file not shown.
BIN
corpus/1e7a4ca606559d15183818a6c3d93b2f132b2fff
Normal file
BIN
corpus/1e7a4ca606559d15183818a6c3d93b2f132b2fff
Normal file
Binary file not shown.
BIN
corpus/25046edfa84c50539e352d8a5c14d5a38cbccbc9
Normal file
BIN
corpus/25046edfa84c50539e352d8a5c14d5a38cbccbc9
Normal file
Binary file not shown.
BIN
corpus/3388003130da408556ca4ebbe6f1e3cc3e110b33
Normal file
BIN
corpus/3388003130da408556ca4ebbe6f1e3cc3e110b33
Normal file
Binary file not shown.
BIN
corpus/342740d94427af6509e3332d46d99e1091a5c065
Normal file
BIN
corpus/342740d94427af6509e3332d46d99e1091a5c065
Normal file
Binary file not shown.
BIN
corpus/3571178de127e769d6229057b205f9df36506cbd
Normal file
BIN
corpus/3571178de127e769d6229057b205f9df36506cbd
Normal file
Binary file not shown.
BIN
corpus/42620ad6039a83a92d5f5c5c8f764c59149a0852
Normal file
BIN
corpus/42620ad6039a83a92d5f5c5c8f764c59149a0852
Normal file
Binary file not shown.
BIN
corpus/486d0d68d44e9eb5ecfc9d64d23ae561dfc150ad
Normal file
BIN
corpus/486d0d68d44e9eb5ecfc9d64d23ae561dfc150ad
Normal file
Binary file not shown.
BIN
corpus/4a2e895a63fd0487d9115aac49305cfad276d901
Normal file
BIN
corpus/4a2e895a63fd0487d9115aac49305cfad276d901
Normal file
Binary file not shown.
BIN
corpus/557f000e67b09ad7647e480e5ca51c39c6fb56fd
Normal file
BIN
corpus/557f000e67b09ad7647e480e5ca51c39c6fb56fd
Normal file
Binary file not shown.
BIN
corpus/59eb125178004fa691678fa4aeab2acf9eb20d92
Normal file
BIN
corpus/59eb125178004fa691678fa4aeab2acf9eb20d92
Normal file
Binary file not shown.
BIN
corpus/5c9267b106f81105ccd6ff67115a494ad967d31c
Normal file
BIN
corpus/5c9267b106f81105ccd6ff67115a494ad967d31c
Normal file
Binary file not shown.
BIN
corpus/613b3f22e9c850e88e43d4a08ab3f4aa690db94a
Normal file
BIN
corpus/613b3f22e9c850e88e43d4a08ab3f4aa690db94a
Normal file
Binary file not shown.
BIN
corpus/638968595f06cd59f8654d24f043d0f80c30f2ea
Normal file
BIN
corpus/638968595f06cd59f8654d24f043d0f80c30f2ea
Normal file
Binary file not shown.
BIN
corpus/6ca1fb9210b8478a854ec5406201b582c3c45dac
Normal file
BIN
corpus/6ca1fb9210b8478a854ec5406201b582c3c45dac
Normal file
Binary file not shown.
BIN
corpus/72e3ccd7785f7ee34adbc41ad0fe37a4e3997fa8
Normal file
BIN
corpus/72e3ccd7785f7ee34adbc41ad0fe37a4e3997fa8
Normal file
Binary file not shown.
BIN
corpus/7343aeff21ad270485906be46e6c2398c6af46cd
Normal file
BIN
corpus/7343aeff21ad270485906be46e6c2398c6af46cd
Normal file
Binary file not shown.
BIN
corpus/76f4456c1817bdfd54d6a6731f41b5c7951df797
Normal file
BIN
corpus/76f4456c1817bdfd54d6a6731f41b5c7951df797
Normal file
Binary file not shown.
BIN
corpus/7bf8c8d06451c512507d251d477c3ec61bb869f2
Normal file
BIN
corpus/7bf8c8d06451c512507d251d477c3ec61bb869f2
Normal file
Binary file not shown.
BIN
corpus/80fb897a23d1bbce326a8ae8ed257559d1dee707
Normal file
BIN
corpus/80fb897a23d1bbce326a8ae8ed257559d1dee707
Normal file
Binary file not shown.
BIN
corpus/853694cf1e93f28aca05f2e96798ece03061d8a9
Normal file
BIN
corpus/853694cf1e93f28aca05f2e96798ece03061d8a9
Normal file
Binary file not shown.
BIN
corpus/9078ea2ea49ecbfda8dd547b82175f4f2cec85d0
Normal file
BIN
corpus/9078ea2ea49ecbfda8dd547b82175f4f2cec85d0
Normal file
Binary file not shown.
BIN
corpus/96e2a3c9f8d6cc448d67502664f737560b422671
Normal file
BIN
corpus/96e2a3c9f8d6cc448d67502664f737560b422671
Normal file
Binary file not shown.
BIN
corpus/9deef5d7e40663e48c50d5049014e84c3a8ec72f
Normal file
BIN
corpus/9deef5d7e40663e48c50d5049014e84c3a8ec72f
Normal file
Binary file not shown.
BIN
corpus/9f390812bd1313d3727cf6c3502178d35f8f091d
Normal file
BIN
corpus/9f390812bd1313d3727cf6c3502178d35f8f091d
Normal file
Binary file not shown.
BIN
corpus/a0d2aadd536eabbf2f847b8a35e7d2bec90eff43
Normal file
BIN
corpus/a0d2aadd536eabbf2f847b8a35e7d2bec90eff43
Normal file
Binary file not shown.
BIN
corpus/afab94e11f2b96751dd648bb294847901787a203
Normal file
BIN
corpus/afab94e11f2b96751dd648bb294847901787a203
Normal file
Binary file not shown.
BIN
corpus/b6c7adfbb014456cc17d18e945c2b0a92299bece
Normal file
BIN
corpus/b6c7adfbb014456cc17d18e945c2b0a92299bece
Normal file
Binary file not shown.
BIN
corpus/b78c3ce2010ea9e0447d31be62ca126f2445f2e4
Normal file
BIN
corpus/b78c3ce2010ea9e0447d31be62ca126f2445f2e4
Normal file
Binary file not shown.
BIN
corpus/c4eb7f9dbf6b1b3f36a61b4f89a3ba204a793f1a
Normal file
BIN
corpus/c4eb7f9dbf6b1b3f36a61b4f89a3ba204a793f1a
Normal file
Binary file not shown.
BIN
corpus/c68b79c358de72172c32a73e8c694a379d622424
Normal file
BIN
corpus/c68b79c358de72172c32a73e8c694a379d622424
Normal file
Binary file not shown.
BIN
corpus/cca06ae98268952fd1b77f6e2abd97eb297b1a56
Normal file
BIN
corpus/cca06ae98268952fd1b77f6e2abd97eb297b1a56
Normal file
Binary file not shown.
BIN
corpus/cd7b5b4c8fc745842394a39e261490cd2123f903
Normal file
BIN
corpus/cd7b5b4c8fc745842394a39e261490cd2123f903
Normal file
Binary file not shown.
BIN
corpus/cfb0a0258f9ecdb58e1773352784543819bc947d
Normal file
BIN
corpus/cfb0a0258f9ecdb58e1773352784543819bc947d
Normal file
Binary file not shown.
BIN
corpus/d1ea327a3ee50b28de31bc8d169bacfffaaf209a
Normal file
BIN
corpus/d1ea327a3ee50b28de31bc8d169bacfffaaf209a
Normal file
Binary file not shown.
BIN
corpus/d575af201f168a680ba0a5d6a76dc02e6b130ab8
Normal file
BIN
corpus/d575af201f168a680ba0a5d6a76dc02e6b130ab8
Normal file
Binary file not shown.
BIN
corpus/d74eceff242d2281c29b65030c7e6a9844d6016c
Normal file
BIN
corpus/d74eceff242d2281c29b65030c7e6a9844d6016c
Normal file
Binary file not shown.
BIN
corpus/d7d22a5670f5ac18870856171c4555a46998bb49
Normal file
BIN
corpus/d7d22a5670f5ac18870856171c4555a46998bb49
Normal file
Binary file not shown.
BIN
corpus/d8d0c3eb0e132b0b3eefd11f1ff6660267485168
Normal file
BIN
corpus/d8d0c3eb0e132b0b3eefd11f1ff6660267485168
Normal file
Binary file not shown.
BIN
corpus/d9bb47bd8cd24b80cb11704a30f219a8a0bb3e24
Normal file
BIN
corpus/d9bb47bd8cd24b80cb11704a30f219a8a0bb3e24
Normal file
Binary file not shown.
BIN
corpus/de1f029e16846e29376769b00f3441722dcb5cf5
Normal file
BIN
corpus/de1f029e16846e29376769b00f3441722dcb5cf5
Normal file
Binary file not shown.
BIN
corpus/e4429de0453e9a6a4798c09a152e8229e4c06d56
Normal file
BIN
corpus/e4429de0453e9a6a4798c09a152e8229e4c06d56
Normal file
Binary file not shown.
BIN
corpus/e7bb8ea46d657cb03bae68f19ec8727b1ad6e6bd
Normal file
BIN
corpus/e7bb8ea46d657cb03bae68f19ec8727b1ad6e6bd
Normal file
Binary file not shown.
BIN
corpus/e9d5413739467acb5d40c2ece14427cff7846196
Normal file
BIN
corpus/e9d5413739467acb5d40c2ece14427cff7846196
Normal file
Binary file not shown.
BIN
corpus/edda099a9ee07d78923e61f1db04de1ef46d2d4a
Normal file
BIN
corpus/edda099a9ee07d78923e61f1db04de1ef46d2d4a
Normal file
Binary file not shown.
BIN
corpus/f2dcdd4e3a67d7d1ca2ab43300750cb9c95fc069
Normal file
BIN
corpus/f2dcdd4e3a67d7d1ca2ab43300750cb9c95fc069
Normal file
Binary file not shown.
BIN
corpus/f63507ee01e5d9c3177050bb57367996c4c62e4b
Normal file
BIN
corpus/f63507ee01e5d9c3177050bb57367996c4c62e4b
Normal file
Binary file not shown.
BIN
corpus/fbae9c0c23d75abddc753fda7cd5d106906d889f
Normal file
BIN
corpus/fbae9c0c23d75abddc753fda7cd5d106906d889f
Normal file
Binary file not shown.
@@ -8,7 +8,7 @@ SRC_DIR="${0%/*}"
|
|||||||
BUILD_ARM="$(mktemp -d -t conflict-set-arm)"
|
BUILD_ARM="$(mktemp -d -t conflict-set-arm)"
|
||||||
BUILD_X86="$(mktemp -d -t conflict-set-x86)"
|
BUILD_X86="$(mktemp -d -t conflict-set-x86)"
|
||||||
|
|
||||||
cmake_args=(-DCMAKE_CXX_FLAGS=-DNVALGRIND -DCPACK_PACKAGING_INSTALL_PREFIX=/usr/local)
|
cmake_args=(-DCMAKE_CXX_FLAGS=-DNVALGRIND -DCPACK_PACKAGING_INSTALL_PREFIX=/usr/local -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++)
|
||||||
|
|
||||||
cmake -S"$SRC_DIR" -B"$BUILD_ARM" -DCMAKE_OSX_ARCHITECTURES=arm64 "${cmake_args[@]}"
|
cmake -S"$SRC_DIR" -B"$BUILD_ARM" -DCMAKE_OSX_ARCHITECTURES=arm64 "${cmake_args[@]}"
|
||||||
cmake --build "$BUILD_ARM" --target conflict-set --target conflict-set-static
|
cmake --build "$BUILD_ARM" --target conflict-set --target conflict-set-static
|
||||||
|
|||||||
Reference in New Issue
Block a user