forked from ytsaurus/ytsaurus
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
YT-17689: Move TFreeList to library/cpp/yt/memory
Iteration no. 2. First one reverted due to YT-18997
- Loading branch information
Showing
22 changed files
with
312 additions
and
200 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
// -*- C++ -*- | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef _LIBCPP_LATCH | ||
#define _LIBCPP_LATCH | ||
|
||
/* | ||
latch synopsis | ||
namespace std | ||
{ | ||
class latch | ||
{ | ||
public: | ||
static constexpr ptrdiff_t max() noexcept; | ||
constexpr explicit latch(ptrdiff_t __expected); | ||
~latch(); | ||
latch(const latch&) = delete; | ||
latch& operator=(const latch&) = delete; | ||
void count_down(ptrdiff_t __update = 1); | ||
bool try_wait() const noexcept; | ||
void wait() const; | ||
void arrive_and_wait(ptrdiff_t __update = 1); | ||
private: | ||
ptrdiff_t __counter; // exposition only | ||
}; | ||
} | ||
*/ | ||
|
||
#include <__availability> | ||
#include <__config> | ||
#include <atomic> | ||
#include <version> | ||
|
||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | ||
# pragma GCC system_header | ||
#endif | ||
|
||
#ifdef _LIBCPP_HAS_NO_THREADS | ||
# error <latch> is not supported on this single threaded system | ||
#endif | ||
|
||
_LIBCPP_PUSH_MACROS | ||
#include <__undef_macros> | ||
|
||
#if _LIBCPP_STD_VER >= 14 | ||
|
||
_LIBCPP_BEGIN_NAMESPACE_STD | ||
|
||
class latch | ||
{ | ||
__atomic_base<ptrdiff_t> __a; | ||
|
||
public: | ||
static constexpr ptrdiff_t max() noexcept { | ||
return numeric_limits<ptrdiff_t>::max(); | ||
} | ||
|
||
inline _LIBCPP_INLINE_VISIBILITY | ||
constexpr explicit latch(ptrdiff_t __expected) : __a(__expected) { } | ||
|
||
~latch() = default; | ||
latch(const latch&) = delete; | ||
latch& operator=(const latch&) = delete; | ||
|
||
inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY | ||
void count_down(ptrdiff_t __update = 1) | ||
{ | ||
auto const __old = __a.fetch_sub(__update, memory_order_release); | ||
if(__old == __update) | ||
__a.notify_all(); | ||
} | ||
inline _LIBCPP_INLINE_VISIBILITY | ||
bool try_wait() const noexcept | ||
{ | ||
return 0 == __a.load(memory_order_acquire); | ||
} | ||
inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY | ||
void wait() const | ||
{ | ||
auto const __test_fn = [=]() -> bool { | ||
return try_wait(); | ||
}; | ||
__cxx_atomic_wait(&__a.__a_, __test_fn); | ||
} | ||
inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY | ||
void arrive_and_wait(ptrdiff_t __update = 1) | ||
{ | ||
count_down(__update); | ||
wait(); | ||
} | ||
}; | ||
|
||
_LIBCPP_END_NAMESPACE_STD | ||
|
||
#endif // _LIBCPP_STD_VER >= 14 | ||
|
||
_LIBCPP_POP_MACROS | ||
|
||
#endif //_LIBCPP_LATCH |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
#pragma once | ||
|
||
#include "public.h" | ||
|
||
#include <atomic> | ||
|
||
namespace NYT { | ||
|
||
//////////////////////////////////////////////////////////////////////////////// | ||
|
||
template <class T> | ||
struct TFreeListItemBase | ||
{ | ||
std::atomic<T*> Next = nullptr; | ||
}; | ||
|
||
using TAtomicUint128 = volatile unsigned __int128 __attribute__((aligned(16))); | ||
|
||
template <class TItem> | ||
class TFreeList | ||
{ | ||
private: | ||
struct THead | ||
{ | ||
std::atomic<TItem*> Pointer = nullptr; | ||
std::atomic<size_t> Epoch = 0; | ||
|
||
THead() = default; | ||
|
||
explicit THead(TItem* pointer); | ||
|
||
}; | ||
|
||
union | ||
{ | ||
THead Head_; | ||
TAtomicUint128 AtomicHead_; | ||
}; | ||
|
||
// Avoid false sharing. | ||
char Padding[CacheLineSize - sizeof(TAtomicUint128)]; | ||
|
||
public: | ||
TFreeList(); | ||
|
||
TFreeList(TFreeList&& other); | ||
|
||
~TFreeList(); | ||
|
||
template <class TPredicate> | ||
bool PutIf(TItem* head, TItem* tail, TPredicate predicate); | ||
|
||
void Put(TItem* head, TItem* tail); | ||
|
||
void Put(TItem* item); | ||
|
||
TItem* Extract(); | ||
|
||
TItem* ExtractAll(); | ||
|
||
bool IsEmpty() const; | ||
|
||
void Append(TFreeList& other); | ||
}; | ||
|
||
//////////////////////////////////////////////////////////////////////////////// | ||
|
||
} // namespace NYT | ||
|
||
#define FREE_LIST_INL_H_ | ||
#include "free_list-inl.h" | ||
#undef FREE_LIST_INL_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.