diff options
| author | Alexander Smirnov <[email protected]> | 2024-09-05 08:37:19 +0000 |
|---|---|---|
| committer | Alexander Smirnov <[email protected]> | 2024-09-05 08:37:19 +0000 |
| commit | bb0647a7d93533929a0834c45ffed44bc81866d7 (patch) | |
| tree | 0dc31a1fa76b9b38d7cda7023c7ab71123ecc648 /library/cpp | |
| parent | c07ddf8417c28e058874d675003784c39b9cffdd (diff) | |
| parent | 0c708029742f34234612e3ff3ffd36fa18aad0f8 (diff) | |
Merge branch 'rightlib' into mergelibs-240905-0836
Diffstat (limited to 'library/cpp')
15 files changed, 377 insertions, 51 deletions
diff --git a/library/cpp/tld/tlds-alpha-by-domain.txt b/library/cpp/tld/tlds-alpha-by-domain.txt index e92220d7fc9..fd7b650f85c 100644 --- a/library/cpp/tld/tlds-alpha-by-domain.txt +++ b/library/cpp/tld/tlds-alpha-by-domain.txt @@ -1,4 +1,4 @@ -# Version 2024083101, Last Updated Sun Sep 1 07:07:02 2024 UTC +# Version 2024090400, Last Updated Wed Sep 4 07:07:01 2024 UTC AAA AARP ABB diff --git a/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.h b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.h index 526b41d94b0..fc2baae6546 100644 --- a/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.h +++ b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.h @@ -1,43 +1,7 @@ #pragma once -#include <library/cpp/yt/memory/safe_memory_reader.h> - -namespace NYT::NBacktrace { - -//////////////////////////////////////////////////////////////////////////////// - -#ifndef _x86_64_ -#error Unsupported platform +#ifdef __x86_64__ + #include "frame_pointer_cursor_x86_64.h" +#else + #include "frame_pointer_cursor_dummy.h" #endif - -struct TFramePointerCursorContext -{ - ui64 Rip; - ui64 Rsp; - ui64 Rbp; -}; - -class TFramePointerCursor -{ -public: - TFramePointerCursor( - TSafeMemoryReader* memoryReader, - const TFramePointerCursorContext& context); - - bool IsFinished() const; - const void* GetCurrentIP() const; - void MoveNext(); - -private: - TSafeMemoryReader* MemoryReader_; - bool Finished_ = false; - bool First_ = true; - - const void* Rip_ = nullptr; - const void* Rbp_ = nullptr; - const void* StartRsp_ = nullptr; -}; - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT::NBacktrace diff --git a/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_dummy.cpp b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_dummy.cpp new file mode 100644 index 00000000000..a97badc6bdb --- /dev/null +++ b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_dummy.cpp @@ -0,0 +1,27 @@ +#include "frame_pointer_cursor_dummy.h" + +namespace NYT::NBacktrace { + +//////////////////////////////////////////////////////////////////////////////// + +TFramePointerCursor::TFramePointerCursor( + TSafeMemoryReader* /*memoryReader*/, + const TFramePointerCursorContext& /*context*/) +{ } + +bool TFramePointerCursor::IsFinished() const +{ + return true; +} + +const void* TFramePointerCursor::GetCurrentIP() const +{ + return nullptr; +} + +void TFramePointerCursor::MoveNext() +{ } + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT::NBacktrace diff --git a/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_dummy.h b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_dummy.h new file mode 100644 index 00000000000..6732e6f2808 --- /dev/null +++ b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_dummy.h @@ -0,0 +1,26 @@ +#pragma once + +#include <library/cpp/yt/memory/safe_memory_reader.h> + +namespace NYT::NBacktrace { + +//////////////////////////////////////////////////////////////////////////////// + +struct TFramePointerCursorContext +{ }; + +class TFramePointerCursor +{ +public: + TFramePointerCursor( + TSafeMemoryReader* memoryReader, + const TFramePointerCursorContext& context); + + bool IsFinished() const; + const void* GetCurrentIP() const; + void MoveNext(); +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT::NBacktrace diff --git a/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.cpp b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_x86_64.cpp index 290d30c3cec..0a2c3015771 100644 --- a/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.cpp +++ b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_x86_64.cpp @@ -1,4 +1,4 @@ -#include "frame_pointer_cursor.h" +#include "frame_pointer_cursor_x86_64.h" #include <util/generic/size_literals.h> diff --git a/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_x86_64.h b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_x86_64.h new file mode 100644 index 00000000000..c2f1b86b757 --- /dev/null +++ b/library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_x86_64.h @@ -0,0 +1,43 @@ +#pragma once + +#include <library/cpp/yt/memory/safe_memory_reader.h> + +namespace NYT::NBacktrace { + +//////////////////////////////////////////////////////////////////////////////// + +struct TFramePointerCursorContext +{ +#ifdef _x86_64_ + ui64 Rip; + ui64 Rsp; + ui64 Rbp; +#endif +}; + +class TFramePointerCursor +{ +public: + TFramePointerCursor( + TSafeMemoryReader* memoryReader, + const TFramePointerCursorContext& context); + + bool IsFinished() const; + const void* GetCurrentIP() const; + void MoveNext(); + +private: +#ifdef _x86_64_ + TSafeMemoryReader* const MemoryReader_; + bool Finished_ = false; + bool First_ = true; + + const void* Rip_ = nullptr; + const void* Rbp_ = nullptr; + const void* StartRsp_ = nullptr; +#endif +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT::NBacktrace diff --git a/library/cpp/yt/backtrace/cursors/frame_pointer/ya.make b/library/cpp/yt/backtrace/cursors/frame_pointer/ya.make index cb85d70315c..ba6b66b3c3d 100644 --- a/library/cpp/yt/backtrace/cursors/frame_pointer/ya.make +++ b/library/cpp/yt/backtrace/cursors/frame_pointer/ya.make @@ -2,8 +2,14 @@ LIBRARY() INCLUDE(${ARCADIA_ROOT}/library/cpp/yt/ya_cpp.make.inc) -SRCS( - frame_pointer_cursor.cpp -) +IF (ARCH_X86_64) + SRCS( + frame_pointer_cursor_x86_64.cpp + ) +ELSE() + SRCS( + frame_pointer_cursor_dummy.cpp + ) +ENDIF() END() diff --git a/library/cpp/yt/backtrace/cursors/interop/interop_dummy.cpp b/library/cpp/yt/backtrace/cursors/interop/interop_dummy.cpp new file mode 100644 index 00000000000..37e15ded852 --- /dev/null +++ b/library/cpp/yt/backtrace/cursors/interop/interop_dummy.cpp @@ -0,0 +1,26 @@ +#include "interop.h" + +namespace NYT::NBacktrace { + +//////////////////////////////////////////////////////////////////////////////// + +TFramePointerCursorContext FramePointerCursorContextFromUcontext(const ucontext_t& /*ucontext*/) +{ + return {}; +} + +std::optional<unw_context_t> TrySynthesizeLibunwindContextFromMachineContext( + const TContMachineContext& /*machineContext*/) +{ + return {}; +} + +TFramePointerCursorContext FramePointerCursorContextFromLibunwindCursor( + const unw_cursor_t& /*cursor*/) +{ + return {}; +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT::NBacktrace diff --git a/library/cpp/yt/backtrace/cursors/interop/interop.cpp b/library/cpp/yt/backtrace/cursors/interop/interop_x86_64.cpp index 5ef38f326d3..b4e6cfbe6ed 100644 --- a/library/cpp/yt/backtrace/cursors/interop/interop.cpp +++ b/library/cpp/yt/backtrace/cursors/interop/interop_x86_64.cpp @@ -6,13 +6,13 @@ namespace NYT::NBacktrace { TFramePointerCursorContext FramePointerCursorContextFromUcontext(const ucontext_t& ucontext) { -#if defined(_linux_) && defined(_x86_64_) +#if defined(_linux_) return { .Rip = static_cast<ui64>(ucontext.uc_mcontext.gregs[REG_RIP]), .Rsp = static_cast<ui64>(ucontext.uc_mcontext.gregs[REG_RSP]), .Rbp = static_cast<ui64>(ucontext.uc_mcontext.gregs[REG_RBP]), }; -#elif defined(_darwin_) && defined(_x86_64_) +#elif defined(_darwin_) return { .Rip = static_cast<ui64>(ucontext.uc_mcontext->__ss.__rip), .Rsp = static_cast<ui64>(ucontext.uc_mcontext->__ss.__rsp), diff --git a/library/cpp/yt/backtrace/cursors/interop/ya.make b/library/cpp/yt/backtrace/cursors/interop/ya.make index 6637f6a9b4a..491b0e13398 100644 --- a/library/cpp/yt/backtrace/cursors/interop/ya.make +++ b/library/cpp/yt/backtrace/cursors/interop/ya.make @@ -2,9 +2,15 @@ LIBRARY() INCLUDE(${ARCADIA_ROOT}/library/cpp/yt/ya_cpp.make.inc) -SRCS( - interop.cpp -) +IF (ARCH_X86_64) + SRCS( + interop_x86_64.cpp + ) +ELSE() + SRCS( + interop_dummy.cpp + ) +ENDIF() PEERDIR( library/cpp/yt/backtrace/cursors/frame_pointer diff --git a/library/cpp/yt/misc/global.h b/library/cpp/yt/misc/global.h index c8bc2c03f00..0c8af0f2768 100644 --- a/library/cpp/yt/misc/global.h +++ b/library/cpp/yt/misc/global.h @@ -3,7 +3,7 @@ //! Defines a global variable that is initialized on its first access. /*! * In contrast to a usual variable with static storage duration, this one - * is not susceptible to initialization order fisco issues. + * is not susceptible to initialization order fiasco issues. */ #define YT_DEFINE_GLOBAL(type, name, ...) \ inline type& name() \ diff --git a/library/cpp/yt/misc/non_null_ptr-inl.h b/library/cpp/yt/misc/non_null_ptr-inl.h new file mode 100644 index 00000000000..a14b1e93020 --- /dev/null +++ b/library/cpp/yt/misc/non_null_ptr-inl.h @@ -0,0 +1,49 @@ +#pragma once +#ifndef NON_NULL_PTR_H_ +#error "Direct inclusion of this file is not allowed, include helpers.h" +// For the sake of sane code completion. +#include "non_null_ptr.h" +#endif + +#include <library/cpp/yt/assert/assert.h> + +namespace NYT { + +//////////////////////////////////////////////////////////////////////////////// + +template <class T> +TNonNullPtrBase<T>::TNonNullPtrBase(T* ptr) noexcept + : Ptr_(ptr) +{ + YT_VERIFY(ptr); +} + +template <class T> +T* TNonNullPtrBase<T>::operator->() const noexcept +{ + return Ptr_; +} + +template <class T> +T& TNonNullPtrBase<T>::operator*() const noexcept +{ + return *Ptr_; +} + +template <class T> +TNonNullPtrBase<T>::TNonNullPtrBase() noexcept + : Ptr_(nullptr) +{ } + +template <class T> +TNonNullPtr<T> GetPtr(T& ref) noexcept +{ + TNonNullPtr<T> ptr; + ptr.Ptr_ = &ref; + + return ptr; +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT diff --git a/library/cpp/yt/misc/non_null_ptr.h b/library/cpp/yt/misc/non_null_ptr.h new file mode 100644 index 00000000000..0005e4edb66 --- /dev/null +++ b/library/cpp/yt/misc/non_null_ptr.h @@ -0,0 +1,76 @@ +#pragma once + +#include "concepts.h" + +namespace NYT { + +//////////////////////////////////////////////////////////////////////////////// + +// We have one really strange rule in our codestyle - mutable arguments are passed by pointer. +// But if you are not a fan of making your life indefinite, +// you can use this helper, that will validate that pointer you pass is not null. +template <class T> +class TNonNullPtr; + +template <class T> +class TNonNullPtrBase +{ +public: + TNonNullPtrBase(T* ptr) noexcept; + TNonNullPtrBase(const TNonNullPtrBase& other) = default; + + TNonNullPtrBase(std::nullptr_t) = delete; + TNonNullPtrBase operator=(const TNonNullPtrBase&) = delete; + + T* operator->() const noexcept; + T& operator*() const noexcept; + +protected: + T* Ptr_; + + TNonNullPtrBase() noexcept; +}; + +template <class T> +TNonNullPtr<T> GetPtr(T& ref) noexcept; + +template <class T> +class TNonNullPtr + : public TNonNullPtrBase<T> +{ + using TConstPtr = TNonNullPtr<const T>; + friend TConstPtr; + + using TNonNullPtrBase<T>::TNonNullPtrBase; + + friend TNonNullPtr<T> GetPtr<T>(T& ref) noexcept; +}; + +// NB(pogorelov): Method definitions placed in .h file (instead of -inl.h) because of clang16 bug. +// TODO(pogorelov): Move method definitions to helpers-inl.h when new clang will be used. +template <CConst T> +class TNonNullPtr<T> + : public TNonNullPtrBase<T> +{ + using TMutPtr = TNonNullPtr<std::remove_const_t<T>>; + + using TNonNullPtrBase<T>::TNonNullPtrBase; + + friend TNonNullPtr<T> GetPtr<T>(T& ref) noexcept; + +public: + TNonNullPtr(TMutPtr mutPtr) noexcept + : TNonNullPtrBase<T>() + { + TNonNullPtrBase<T>::Ptr_ = mutPtr.Ptr_; + } +}; + + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT + +#define NON_NULL_PTR_H_ +#include "non_null_ptr-inl.h" +#undef NON_NULL_PTR_H_ diff --git a/library/cpp/yt/misc/unittests/non_null_ptr_ut.cpp b/library/cpp/yt/misc/unittests/non_null_ptr_ut.cpp new file mode 100644 index 00000000000..a6903edc403 --- /dev/null +++ b/library/cpp/yt/misc/unittests/non_null_ptr_ut.cpp @@ -0,0 +1,102 @@ +#include <library/cpp/testing/gtest/gtest.h> + +#include <library/cpp/yt/misc/non_null_ptr.h> + +namespace NYT { +namespace { + +//////////////////////////////////////////////////////////////////////////////// + +enum EFuncResult { + Base, + ConstBase, + Derived, + ConstDerived, +}; + +enum EBinaryFuncResult { + Ok, + NotOk, +}; + +struct TBase +{ }; + +struct TDerived + : public TBase +{ }; + +EFuncResult Foo(TNonNullPtr<TBase> /*base*/) +{ + return EFuncResult::Base; +} + +EFuncResult Foo(TNonNullPtr<const TBase> /*base*/) +{ + return EFuncResult::ConstBase; +} + +EFuncResult Foo(TNonNullPtr<TDerived> /*derived*/) +{ + return EFuncResult::Derived; +} + +EFuncResult Foo(TNonNullPtr<const TDerived> /*derived*/) +{ + return EFuncResult::ConstDerived; +} + +[[maybe_unused]] EBinaryFuncResult Foo(int* /*derived*/) +{ + return EBinaryFuncResult::NotOk; +} + +EBinaryFuncResult Foo(TNonNullPtr<int> /*derived*/) +{ + return EBinaryFuncResult::Ok; +} + +EBinaryFuncResult Bar(TNonNullPtr<const int> /*arg*/) +{ + return EBinaryFuncResult::Ok; +} + +EBinaryFuncResult Baz(TNonNullPtr<int> /*arg*/) +{ + return EBinaryFuncResult::Ok; +} + +TEST(TNonNullPtrTest, Simple) +{ + TDerived derived{}; + const auto& constDerived = derived; + EXPECT_EQ(EFuncResult::Derived, Foo(GetPtr(derived))); + EXPECT_EQ(EFuncResult::ConstDerived, Foo(GetPtr(constDerived))); + + TBase base{}; + const auto& constBase = base; + EXPECT_EQ(EFuncResult::Base, Foo(GetPtr(base))); + EXPECT_EQ(EFuncResult::ConstBase, Foo(GetPtr(constBase))); + + int i{}; + EXPECT_EQ(EBinaryFuncResult::Ok, Foo(GetPtr(i))); +} + +TEST(TNonNullPtrTest, CastToConst) +{ + int i{}; + + EXPECT_EQ(EBinaryFuncResult::Ok, Bar(GetPtr(i))); +} + +TEST(TNonNullPtrTest, ConstructionFromRawPointer) +{ + int i{}; + + EXPECT_EQ(EBinaryFuncResult::Ok, Baz(&i)); +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace +} // namespace NYT diff --git a/library/cpp/yt/misc/unittests/ya.make b/library/cpp/yt/misc/unittests/ya.make index 611edd72173..5a071c887c4 100644 --- a/library/cpp/yt/misc/unittests/ya.make +++ b/library/cpp/yt/misc/unittests/ya.make @@ -5,6 +5,7 @@ INCLUDE(${ARCADIA_ROOT}/library/cpp/yt/ya_cpp.make.inc) SRCS( enum_ut.cpp guid_ut.cpp + non_null_ptr_ut.cpp preprocessor_ut.cpp strong_typedef_ut.cpp ) |
