/*
- * Copyright 2017 Facebook, Inc.
+ * Copyright 2013-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.
#include <glog/logging.h>
-#include <folly/portability/Time.h>
+#include <folly/Chrono.h>
#include <folly/portability/GTest.h>
+#include <folly/portability/Time.h>
using namespace folly::detail;
using namespace folly::test;
using namespace std;
using namespace std::chrono;
+using folly::chrono::coarse_steady_clock;
typedef DeterministicSchedule DSched;
-template <template<typename> class Atom>
+template <template <typename> class Atom>
void run_basic_thread(
Futex<Atom>& f) {
- EXPECT_TRUE(f.futexWait(0));
+ EXPECT_EQ(FutexResult::AWOKEN, f.futexWait(0));
}
-template <template<typename> class Atom>
+template <template <typename> class Atom>
void run_basic_tests() {
Futex<Atom> f(0);
- EXPECT_FALSE(f.futexWait(1));
+ EXPECT_EQ(FutexResult::VALUE_CHANGED, f.futexWait(1));
EXPECT_EQ(f.futexWake(), 0);
auto thr = DSched::thread(std::bind(run_basic_thread<Atom>, std::ref(f)));
DSched::join(thr);
}
-template <template<typename> class Atom, typename Clock, typename Duration>
+template <template <typename> class Atom, typename Clock, typename Duration>
void liveClockWaitUntilTests() {
Futex<Atom> f(0);
EXPECT_TRUE(res == FutexResult::TIMEDOUT || res == FutexResult::INTERRUPTED);
}
-template<template<typename> class Atom>
+template <template <typename> class Atom>
void run_wait_until_tests() {
liveClockWaitUntilTests<Atom, system_clock, system_clock::duration>();
liveClockWaitUntilTests<Atom, steady_clock, steady_clock::duration>();
+ liveClockWaitUntilTests<Atom, steady_clock, coarse_steady_clock::duration>();
typedef duration<int64_t, std::ratio<1, 10000000>> decimicroseconds;
liveClockWaitUntilTests<Atom, system_clock, decimicroseconds>();
void run_wait_until_tests<DeterministicAtomic>() {
deterministicAtomicWaitUntilTests<system_clock>();
deterministicAtomicWaitUntilTests<steady_clock>();
+ deterministicAtomicWaitUntilTests<coarse_steady_clock>();
}
uint64_t diff(uint64_t a, uint64_t b) {
for (auto delay = std::chrono::milliseconds(1);; delay *= 2) {
bool success = false;
Futex<Atom> f(0);
- auto thr = DSched::thread([&] { success = f.futexWait(0); });
+ auto thr = DSched::thread(
+ [&] { success = FutexResult::AWOKEN == f.futexWait(0); });
/* sleep override */ std::this_thread::sleep_for(delay);
f.store(1);
f.futexWake(1);