summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksei Borzenkov <[email protected]>2024-03-05 10:50:35 +0300
committerGitHub <[email protected]>2024-03-05 10:50:35 +0300
commitbd29bb29362170537b1bdca13d812114c870d94a (patch)
tree00d253c6f48dbb48886db3e6f7d8e2f26af7b496
parentac6a6144a7b896998e61a2a4e59faf144c09f6e2 (diff)
Avoid copying event observers before each call (#2431)
-rw-r--r--ydb/library/actors/testlib/test_runtime.cpp48
1 files changed, 25 insertions, 23 deletions
diff --git a/ydb/library/actors/testlib/test_runtime.cpp b/ydb/library/actors/testlib/test_runtime.cpp
index 1d4794ee0fb..c64a332c2b3 100644
--- a/ydb/library/actors/testlib/test_runtime.cpp
+++ b/ydb/library/actors/testlib/test_runtime.cpp
@@ -1206,13 +1206,14 @@ namespace NActors {
for (auto& ev : events) {
TInverseGuard<TMutex> inverseGuard(Mutex);
- for (auto observer : ObserverFuncs) {
+ for (auto& observer : ObserverFuncs) {
observer(ev);
if (!ev) break;
}
- if(ev && ObserverFunc(ev) != EEventAction::DROP && ev)
+ if (ev && ObserverFunc(ev) != EEventAction::DROP) {
eventsToPush.push_back(ev);
+ }
}
mbox.second->PushFront(eventsToPush);
}
@@ -1237,37 +1238,38 @@ namespace NActors {
}
hasProgress = true;
- EEventAction action = EEventAction::PROCESS;
+ EEventAction action;
{
TInverseGuard<TMutex> inverseGuard(Mutex);
- for (auto observer : ObserverFuncs) {
+ for (auto& observer : ObserverFuncs) {
observer(ev);
- if(!ev) break;
+ if (!ev) break;
}
- if (ev)
+ if (ev) {
action = ObserverFunc(ev);
+ } else {
+ action = EEventAction::DROP;
+ }
}
- if (ev) {
- switch (action) {
- case EEventAction::PROCESS:
- UpdateFinalEventsStatsForEachContext(*ev);
- SendInternal(ev.Release(), mbox.first.NodeId - FirstNodeId, false);
- break;
- case EEventAction::DROP:
- // do nothing
- break;
- case EEventAction::RESCHEDULE: {
- TInstant deadline = TInstant::MicroSeconds(CurrentTimestamp) + ReschedulingDelay;
- mbox.second->Freeze(deadline);
- mbox.second->PushFront(ev);
- break;
- }
- default:
- Y_ABORT("Unknown action");
+ switch (action) {
+ case EEventAction::PROCESS:
+ UpdateFinalEventsStatsForEachContext(*ev);
+ SendInternal(ev.Release(), mbox.first.NodeId - FirstNodeId, false);
+ break;
+ case EEventAction::DROP:
+ // do nothing
+ break;
+ case EEventAction::RESCHEDULE: {
+ TInstant deadline = TInstant::MicroSeconds(CurrentTimestamp) + ReschedulingDelay;
+ mbox.second->Freeze(deadline);
+ mbox.second->PushFront(ev);
+ break;
}
+ default:
+ Y_ABORT("Unknown action");
}
}
}