From 942e5fc613a64e103d4237fa5862582b1cdeca19 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 20 Jan 2024 12:54:17 +0300 Subject: [PATCH] Add LambdaPromise debug. --- tdactor/td/actor/impl/Actor-decl.h | 2 +- tdactor/td/actor/impl/Actor.h | 4 ++-- tdactor/td/actor/impl/Event.h | 6 +++--- tdactor/td/actor/impl/EventFull-decl.h | 4 ++-- tdactor/td/actor/impl/Scheduler-decl.h | 2 +- tdactor/td/actor/impl/Scheduler.h | 6 +++--- tdutils/td/utils/Promise.h | 23 +++++++++++++++-------- tdutils/td/utils/check.h | 8 +++++--- 8 files changed, 32 insertions(+), 23 deletions(-) diff --git a/tdactor/td/actor/impl/Actor-decl.h b/tdactor/td/actor/impl/Actor-decl.h index d2414872f..0fd1ded0b 100644 --- a/tdactor/td/actor/impl/Actor-decl.h +++ b/tdactor/td/actor/impl/Actor-decl.h @@ -95,7 +95,7 @@ class Actor : public ObserverBase { auto self_closure(SelfT *self, FuncT &&func, ArgsT &&...args); template - auto self_lambda(LambdaT &&lambda); + auto self_lambda(LambdaT &&func); // proxy to info_ ActorId<> actor_id(); diff --git a/tdactor/td/actor/impl/Actor.h b/tdactor/td/actor/impl/Actor.h index da23b0848..5ec72e347 100644 --- a/tdactor/td/actor/impl/Actor.h +++ b/tdactor/td/actor/impl/Actor.h @@ -156,8 +156,8 @@ auto Actor::self_closure(SelfT *self, FuncT &&func, ArgsT &&...args) { } template -auto Actor::self_lambda(LambdaT &&lambda) { - return EventCreator::lambda(actor_id(), std::forward(lambda)); +auto Actor::self_lambda(LambdaT &&func) { + return EventCreator::from_lambda(actor_id(), std::forward(func)); } inline Slice Actor::get_name() const { diff --git a/tdactor/td/actor/impl/Event.h b/tdactor/td/actor/impl/Event.h index f082d9d1c..ceec14f53 100644 --- a/tdactor/td/actor/impl/Event.h +++ b/tdactor/td/actor/impl/Event.h @@ -89,7 +89,7 @@ class LambdaEvent final : public CustomEvent { f_(); } template , LambdaEvent>::value, int> = 0> - explicit LambdaEvent(FromLambdaT &&lambda) : f_(std::forward(lambda)) { + explicit LambdaEvent(FromLambdaT &&func) : f_(std::forward(func)) { } private: @@ -149,8 +149,8 @@ class Event { } template - static Event lambda(FromLambdaT &&lambda) { - return custom(new LambdaEvent>(std::forward(lambda))); + static Event from_lambda(FromLambdaT &&func) { + return custom(new LambdaEvent>(std::forward(func))); } Event() : Event(Type::NoType) { diff --git a/tdactor/td/actor/impl/EventFull-decl.h b/tdactor/td/actor/impl/EventFull-decl.h index 4186d071a..b47443c4d 100644 --- a/tdactor/td/actor/impl/EventFull-decl.h +++ b/tdactor/td/actor/impl/EventFull-decl.h @@ -65,8 +65,8 @@ class EventCreator { } template - static EventFull lambda(ActorRef actor_ref, LambdaT &&lambda) { - return EventFull(actor_ref, Event::lambda(std::forward(lambda))); + static EventFull from_lambda(ActorRef actor_ref, LambdaT &&func) { + return EventFull(actor_ref, Event::from_lambda(std::forward(func))); } static EventFull yield(ActorRef actor_ref) { diff --git a/tdactor/td/actor/impl/Scheduler-decl.h b/tdactor/td/actor/impl/Scheduler-decl.h index f8909928e..850469945 100644 --- a/tdactor/td/actor/impl/Scheduler-decl.h +++ b/tdactor/td/actor/impl/Scheduler-decl.h @@ -107,7 +107,7 @@ class Scheduler { void destroy_on_scheduler(int32 sched_id, ArgsT &...values); template - void send_lambda(ActorRef actor_ref, EventT &&lambda); + void send_lambda(ActorRef actor_ref, EventT &&func); template void send_closure(ActorRef actor_ref, EventT &&closure); diff --git a/tdactor/td/actor/impl/Scheduler.h b/tdactor/td/actor/impl/Scheduler.h index 52d85af2b..ba4e0be86 100644 --- a/tdactor/td/actor/impl/Scheduler.h +++ b/tdactor/td/actor/impl/Scheduler.h @@ -215,15 +215,15 @@ void Scheduler::send_impl(const ActorId<> &actor_id, const RunFuncT &run_func, c } template -void Scheduler::send_lambda(ActorRef actor_ref, EventT &&lambda) { +void Scheduler::send_lambda(ActorRef actor_ref, EventT &&func) { return send_impl( actor_ref.get(), [&](ActorInfo *actor_info) { event_context_ptr_->link_token = actor_ref.token(); - lambda(); + func(); }, [&] { - auto event = Event::lambda(std::forward(lambda)); + auto event = Event::from_lambda(std::forward(func)); event.set_link_token(actor_ref.token()); return event; }); diff --git a/tdutils/td/utils/Promise.h b/tdutils/td/utils/Promise.h index 2d339ae9b..9edf92d8e 100644 --- a/tdutils/td/utils/Promise.h +++ b/tdutils/td/utils/Promise.h @@ -94,7 +94,7 @@ class LambdaPromise : public PromiseInterface { public: void set_value(ValueT &&value) override { - CHECK(state_.get() == State::Ready); + CHECK_IMPL(state_.get() == State::Ready, file_, line_); do_ok(std::move(value)); state_ = State::Complete; } @@ -116,12 +116,15 @@ class LambdaPromise : public PromiseInterface { } template - explicit LambdaPromise(FromT &&func) : func_(std::forward(func)), state_(State::Ready) { + explicit LambdaPromise(const char *file, int line, FromT &&func) + : func_(std::forward(func)), state_(State::Ready), file_(file), line_(line) { } private: FunctionT func_; MovableValue state_{State::Empty}; + const char *file_ = ""; + int line_ = 0; template std::enable_if_t>::value, void> do_error(Status &&status) { @@ -158,11 +161,12 @@ struct is_promise_interface_ptr> : std::true_type {}; template ::value, bool> has_t = false> auto lambda_promise(F &&f) { - return LambdaPromise>>, std::decay_t>(std::forward(f)); + return LambdaPromise>>, std::decay_t>(__FILE__, __LINE__, + std::forward(f)); } template ::value, bool> has_t = true> auto lambda_promise(F &&f) { - return LambdaPromise>(std::forward(f)); + return LambdaPromise>(__FILE__, __LINE__, std::forward(f)); } template { class PromiseCreator { public: template >> - static Promise lambda(OkT &&ok) { - return Promise(td::make_unique>>(std::forward(ok))); + static Promise lambda_impl(const char *file, int line, OkT &&ok) { + return Promise( + td::make_unique>>(file, line, std::forward(ok))); } +#define lambda(...) lambda_impl(__FILE__, __LINE__, __VA_ARGS__) template >> - static auto cancellable_lambda(CancellationToken cancellation_token, OkT &&ok) { + static auto cancellable_lambda_impl(const char *file, int line, CancellationToken cancellation_token, OkT &&ok) { return Promise(td::make_unique>>>( - std::move(cancellation_token), std::forward(ok))); + std::move(cancellation_token), file, line, std::forward(ok))); } +#define cancellable_lambda(...) cancellable_lambda_impl(__FILE__, __LINE__, __VA_ARGS__) template static Promise<> join(ArgsT &&...args) { diff --git a/tdutils/td/utils/check.h b/tdutils/td/utils/check.h index dd5e10105..c8068090d 100644 --- a/tdutils/td/utils/check.h +++ b/tdutils/td/utils/check.h @@ -8,11 +8,13 @@ #define TD_DUMMY_CHECK(condition) ((void)(condition)) -#define CHECK(condition) \ - if (!(condition)) { \ - ::td::detail::process_check_error(#condition, __FILE__, __LINE__); \ +#define CHECK_IMPL(condition, file, line) \ + if (!(condition)) { \ + ::td::detail::process_check_error(#condition, file, line); \ } +#define CHECK(condition) CHECK_IMPL(condition, __FILE__, __LINE__) + // clang-format off #ifdef NDEBUG #define DCHECK TD_DUMMY_CHECK