Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions include/silk/util/init.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#pragma once

namespace silk
{

/**
* Initialize all silk singletons in the right order. Call once at process startup before any silk calls
*/
void initialize() noexcept;

/**
* Tear down silk singletons in reverse order.
*/
void destroy() noexcept;

} // namespace silk
6 changes: 0 additions & 6 deletions include/silk/util/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,4 @@ static constexpr uint64_t intHash(uint64_t key) noexcept
return key;
}

/**
* Initialize librseq. Must be called before any rseq critical sections run.
* Idempotent -- safe to call multiple times.
*/
void initRseq() noexcept;

} // namespace silk
37 changes: 10 additions & 27 deletions include/silk/util/tsc.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace silk
/**
* TSC frequency query and cycle/nanosecond conversion.
*
* Frequency is queried once via CPUID on first use and cached.
* Frequency is queried once via CPUID at initialization and cached.
* Conversions use fixed-point multiply+shift - no division on the hot path.
*/
class Tsc
Expand Down Expand Up @@ -38,41 +38,24 @@ class Tsc
#endif
}

/**
* Query TSC frequency, populate the fixed-point conversion factors, and
* assert that the running CPU advertises an invariant TSC. Idempotent.
*/
static void initialize() noexcept;

/** Return the TSC frequency in Hz. */
static uint64_t getFrequency() noexcept
{
if (frequency == 0) [[unlikely]]
{
init();
}
return frequency;
}
static uint64_t getFrequency() noexcept { return frequency; }

/** Convert TSC cycles to nanoseconds. */
static uint64_t cyclesToNanoseconds(uint64_t cycles) noexcept
{
if (nsPerCycleFp == 0) [[unlikely]]
{
init();
}
return (cycles * nsPerCycleFp) >> SHIFT;
}
static uint64_t cyclesToNanoseconds(uint64_t cycles) noexcept { return (cycles * nsPerCycleFp) >> SHIFT; }

/** Convert nanoseconds to TSC cycles. */
static uint64_t nanosecondsToCycles(uint64_t ns) noexcept
{
if (cyclesPerNsFp == 0) [[unlikely]]
{
init();
}
return (ns * cyclesPerNsFp) >> SHIFT;
}
static uint64_t nanosecondsToCycles(uint64_t ns) noexcept { return (ns * cyclesPerNsFp) >> SHIFT; }

private:
static constexpr uint32_t SHIFT = 20;

static void init() noexcept;

inline static uint64_t frequency = 0; ///< Hz
inline static uint64_t nsPerCycleFp = 0; ///< (1 << SHIFT) * 1'000'000'000 / frequency
inline static uint64_t cyclesPerNsFp = 0; ///< frequency * (1 << SHIFT) / 1'000'000'000
Expand Down
10 changes: 3 additions & 7 deletions src/fibers/benchmarks/main.cpp
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
#include <silk/fibers/fiber.h>
#include <silk/util/perf.h>
#include <silk/util/queue.h>
#include <silk/util/init.h>

#include <benchmark/benchmark.h>

int main(int argc, char ** argv)
{
silk::initRseq();
silk::Perf::initialize();
silk::QueueBase::initialize();
silk::initialize();
silk::FiberScheduler::initialize();

benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
benchmark::Shutdown();

silk::FiberScheduler::destroy();
silk::QueueBase::destroy();
silk::Perf::destroy();
silk::destroy();
return 0;
}
16 changes: 5 additions & 11 deletions src/fibers/tests/main.cpp
Original file line number Diff line number Diff line change
@@ -1,28 +1,22 @@
#include <silk/fibers/fiber.h>
#include <silk/util/perf.h>
#include <silk/util/queue.h>
#include <silk/util/init.h>

#include <gtest/gtest.h>

int main(int argc, char ** argv)
{
::testing::InitGoogleTest(&argc, argv);
// Skip scheduler initialization
if (::testing::GTEST_FLAG(list_tests))
{
return RUN_ALL_TESTS();
}

silk::initRseq();
silk::Perf::initialize();
silk::QueueBase::initialize();
silk::initialize();
silk::FiberScheduler::initialize();

int result = RUN_ALL_TESTS();
int r = RUN_ALL_TESTS();

silk::FiberScheduler::destroy();
silk::QueueBase::destroy();
silk::Perf::destroy();

return result;
silk::destroy();
return r;
}
9 changes: 3 additions & 6 deletions src/gdb/tests/gdb-test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@
#include <silk/fibers/future.h>
#include <silk/fibers/mutex.h>
#include <silk/util/assert.h>
#include <silk/util/init.h>
#include <silk/util/perf.h>
#include <silk/util/platform.h>
#include <silk/util/queue.h>

#include <atomic>
#include <cstdio>
Expand Down Expand Up @@ -106,9 +106,7 @@ __attribute__((noinline, used)) static void gdb_ready()

int main()
{
silk::initRseq();
silk::Perf::initialize();
silk::QueueBase::initialize();
silk::initialize();
silk::FiberScheduler::initialize();

// Spinner stays RUNNING on a CPU.
Expand Down Expand Up @@ -157,8 +155,7 @@ int main()
sem_destroy(&ready);

silk::FiberScheduler::destroy();
silk::QueueBase::destroy();
silk::Perf::destroy();
silk::destroy();

return 0;
}
9 changes: 3 additions & 6 deletions src/perf/file-perf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

#include <silk/fibers/fiber.h>
#include <silk/util/assert.h>
#include <silk/util/init.h>
#include <silk/util/logger.h>
#include <silk/util/perf.h>
#include <silk/util/platform.h>
#include <silk/util/queue.h>
#include <silk/util/tsc.h>

#include <boost/program_options.hpp>
Expand Down Expand Up @@ -406,9 +406,7 @@ int main(int argc, char ** argv)

sigset_t mask = blockSignals();

silk::initRseq();
silk::Perf::initialize();
silk::QueueBase::initialize();
silk::initialize();
silk::FiberScheduler::initialize();

LOG_INFO(
Expand Down Expand Up @@ -445,8 +443,7 @@ int main(int argc, char ** argv)
printJson(allLat, cfg);

silk::FiberScheduler::destroy();
silk::QueueBase::destroy();
silk::Perf::destroy();
silk::destroy();

::close(fd);
return 0;
Expand Down
9 changes: 3 additions & 6 deletions src/perf/http-perf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
#include <silk/fibers/fiber.h>
#include <silk/fibers/future.h>
#include <silk/util/assert.h>
#include <silk/util/init.h>
#include <silk/util/logger.h>
#include <silk/util/perf.h>
#include <silk/util/platform.h>
#include <silk/util/queue.h>
#include <silk/util/tsc.h>

#include <Poco/Net/HTTPClientSession.h>
Expand Down Expand Up @@ -282,11 +282,9 @@ static void runClient(int argc, char ** argv)
sigset_t mask = blockSignals();
bool signalled = false;

silk::initialize();
if (!cfg.useThreads)
{
silk::initRseq();
silk::Perf::initialize();
silk::QueueBase::initialize();
silk::FiberScheduler::initialize();
}

Expand Down Expand Up @@ -323,9 +321,8 @@ static void runClient(int argc, char ** argv)
if (!cfg.useThreads)
{
silk::FiberScheduler::destroy();
silk::QueueBase::destroy();
silk::Perf::destroy();
}
silk::destroy();
}

/**
Expand Down
6 changes: 3 additions & 3 deletions src/perf/net-perf-asio.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "common.h"

#include <silk/util/assert.h>
#include <silk/util/init.h>
#include <silk/util/logger.h>
#include <silk/util/perf.h>
#include <silk/util/platform.h>
Expand Down Expand Up @@ -523,8 +524,7 @@ int main(int argc, char ** argv)
return 1;
}

silk::initRseq();
silk::Perf::initialize();
silk::initialize();

const char * subcmd = argv[1];
if (strcmp(subcmd, "server") == 0)
Expand All @@ -542,6 +542,6 @@ int main(int argc, char ** argv)
return 1;
}

silk::Perf::destroy();
silk::destroy();
return 0;
}
14 changes: 5 additions & 9 deletions src/perf/net-perf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

#include <silk/fibers/fiber.h>
#include <silk/util/assert.h>
#include <silk/util/init.h>
#include <silk/util/list.h>
#include <silk/util/logger.h>
#include <silk/util/perf.h>
#include <silk/util/platform.h>
#include <silk/util/queue.h>
#include <silk/util/tsc.h>

#include <boost/program_options.hpp>
Expand Down Expand Up @@ -738,9 +738,7 @@ static void runServer(int argc, char ** argv)

sigset_t mask = blockSignals();

silk::initRseq();
silk::Perf::initialize();
silk::QueueBase::initialize();
silk::initialize();
silk::FiberScheduler::initialize();

LOG_INFO("starting server on {}:{}", cfg.host, cfg.port);
Expand All @@ -756,8 +754,7 @@ static void runServer(int argc, char ** argv)
server.stop();

silk::FiberScheduler::destroy();
silk::QueueBase::destroy();
silk::Perf::destroy();
silk::destroy();
}

/**
Expand Down Expand Up @@ -812,8 +809,7 @@ static void runClient(int argc, char ** argv)

sigset_t mask = blockSignals();

silk::initRseq();
silk::Perf::initialize();
silk::initialize();
silk::FiberScheduler::initialize();

LOG_INFO("starting client on {}:{}", cfg.host, cfg.port);
Expand Down Expand Up @@ -844,7 +840,7 @@ static void runClient(int argc, char ** argv)
printJson(allLat, cfg);

silk::FiberScheduler::destroy();
silk::Perf::destroy();
silk::destroy();
}

/**
Expand Down
9 changes: 3 additions & 6 deletions src/perf/s3-perf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
#include <silk/fibers/fiber.h>
#include <silk/fibers/future.h>
#include <silk/util/assert.h>
#include <silk/util/init.h>
#include <silk/util/logger.h>
#include <silk/util/perf.h>
#include <silk/util/platform.h>
#include <silk/util/queue.h>
#include <silk/util/stack.h>
#include <silk/util/tsc.h>

Expand Down Expand Up @@ -756,9 +756,7 @@ int main(int argc, char ** argv)

std::shared_ptr<Aws::Utils::Threading::Executor> executor;

silk::initRseq();
silk::Perf::initialize();
silk::QueueBase::initialize();
silk::initialize();
if (!cfg.useThreads)
{
silk::FiberScheduler::initialize();
Expand Down Expand Up @@ -814,8 +812,7 @@ int main(int argc, char ** argv)
{
silk::FiberScheduler::destroy();
}
silk::QueueBase::destroy();
silk::Perf::destroy();
silk::destroy();

return 0;
}
6 changes: 4 additions & 2 deletions src/util/benchmarks/main.cpp
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
#include <silk/util/platform.h>
#include <silk/util/init.h>

#include <benchmark/benchmark.h>

int main(int argc, char ** argv)
{
silk::initRseq();
silk::initialize();

benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
benchmark::Shutdown();

silk::destroy();
return 0;
}
Loading
Loading