summaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorAlexander Smirnov <[email protected]>2024-09-05 08:37:19 +0000
committerAlexander Smirnov <[email protected]>2024-09-05 08:37:19 +0000
commitbb0647a7d93533929a0834c45ffed44bc81866d7 (patch)
tree0dc31a1fa76b9b38d7cda7023c7ab71123ecc648 /library/cpp
parentc07ddf8417c28e058874d675003784c39b9cffdd (diff)
parent0c708029742f34234612e3ff3ffd36fa18aad0f8 (diff)
Merge branch 'rightlib' into mergelibs-240905-0836
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/tld/tlds-alpha-by-domain.txt2
-rw-r--r--library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.h44
-rw-r--r--library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_dummy.cpp27
-rw-r--r--library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_dummy.h26
-rw-r--r--library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_x86_64.cpp (renamed from library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.cpp)2
-rw-r--r--library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor_x86_64.h43
-rw-r--r--library/cpp/yt/backtrace/cursors/frame_pointer/ya.make12
-rw-r--r--library/cpp/yt/backtrace/cursors/interop/interop_dummy.cpp26
-rw-r--r--library/cpp/yt/backtrace/cursors/interop/interop_x86_64.cpp (renamed from library/cpp/yt/backtrace/cursors/interop/interop.cpp)4
-rw-r--r--library/cpp/yt/backtrace/cursors/interop/ya.make12
-rw-r--r--library/cpp/yt/misc/global.h2
-rw-r--r--library/cpp/yt/misc/non_null_ptr-inl.h49
-rw-r--r--library/cpp/yt/misc/non_null_ptr.h76
-rw-r--r--library/cpp/yt/misc/unittests/non_null_ptr_ut.cpp102
-rw-r--r--library/cpp/yt/misc/unittests/ya.make1
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
)