ExecCtx based Activity wakeup mechanism (#27454)
* wakeup scheduler * wakeup scheduler * Automated change: Fix sanity tests * Update exec_ctx_wakeup_scheduler_test.cc * Remove unused name * fix_build Co-authored-by: ctiller <ctiller@users.noreply.github.com>pull/27481/head
parent
b7fc3cf465
commit
d1cecad651
7 changed files with 259 additions and 0 deletions
@ -0,0 +1,45 @@ |
|||||||
|
// Copyright 2021 gRPC authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#ifndef GRPC_CORE_LIB_PROMISE_EXEC_CTX_WAKEUP_SCHEDULER_H |
||||||
|
#define GRPC_CORE_LIB_PROMISE_EXEC_CTX_WAKEUP_SCHEDULER_H |
||||||
|
|
||||||
|
#include <grpc/impl/codegen/port_platform.h> |
||||||
|
|
||||||
|
#include "src/core/lib/iomgr/exec_ctx.h" |
||||||
|
|
||||||
|
namespace grpc_core { |
||||||
|
|
||||||
|
// A callback scheduler for activities that works by scheduling callbacks on the
|
||||||
|
// exec ctx.
|
||||||
|
class ExecCtxWakeupScheduler { |
||||||
|
public: |
||||||
|
template <typename ActivityType> |
||||||
|
void ScheduleWakeup(ActivityType* activity) { |
||||||
|
GRPC_CLOSURE_INIT( |
||||||
|
&closure_, |
||||||
|
[](void* arg, grpc_error_handle) { |
||||||
|
static_cast<ActivityType*>(arg)->RunScheduledWakeup(); |
||||||
|
}, |
||||||
|
activity, grpc_schedule_on_exec_ctx); |
||||||
|
ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE); |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
grpc_closure closure_; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace grpc_core
|
||||||
|
|
||||||
|
#endif // GRPC_CORE_LIB_PROMISE_EXEC_CTX_WAKEUP_SCHEDULER_H
|
@ -0,0 +1,69 @@ |
|||||||
|
// Copyright 2021 gRPC authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h" |
||||||
|
|
||||||
|
#include <gtest/gtest.h> |
||||||
|
|
||||||
|
#include "src/core/lib/promise/activity.h" |
||||||
|
|
||||||
|
namespace grpc_core { |
||||||
|
|
||||||
|
TEST(ExecCtxWakeupSchedulerTest, Works) { |
||||||
|
int state = 0; |
||||||
|
bool done = false; |
||||||
|
auto activity = MakeActivity( |
||||||
|
[&state]() mutable -> Poll<absl::Status> { |
||||||
|
++state; |
||||||
|
switch (state) { |
||||||
|
case 1: |
||||||
|
return Pending(); |
||||||
|
case 2: |
||||||
|
return absl::OkStatus(); |
||||||
|
default: |
||||||
|
abort(); |
||||||
|
} |
||||||
|
}, |
||||||
|
ExecCtxWakeupScheduler(), |
||||||
|
[&done](absl::Status status) { |
||||||
|
EXPECT_EQ(status, absl::OkStatus()); |
||||||
|
done = true; |
||||||
|
}); |
||||||
|
|
||||||
|
EXPECT_EQ(state, 1); |
||||||
|
EXPECT_FALSE(done); |
||||||
|
{ |
||||||
|
ExecCtx exec_ctx; |
||||||
|
EXPECT_FALSE(exec_ctx.HasWork()); |
||||||
|
activity->ForceWakeup(); |
||||||
|
EXPECT_TRUE(exec_ctx.HasWork()); |
||||||
|
EXPECT_EQ(state, 1); |
||||||
|
EXPECT_FALSE(done); |
||||||
|
} |
||||||
|
EXPECT_EQ(state, 2); |
||||||
|
EXPECT_TRUE(done); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace grpc_core
|
||||||
|
|
||||||
|
// Hook needed to run ExecCtx outside of iomgr.
|
||||||
|
void grpc_set_default_iomgr_platform() {} |
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
::testing::InitGoogleTest(&argc, argv); |
||||||
|
grpc_core::ExecCtx::GlobalInit(); |
||||||
|
int r = RUN_ALL_TESTS(); |
||||||
|
grpc_core::ExecCtx::GlobalShutdown(); |
||||||
|
return r; |
||||||
|
} |
Loading…
Reference in new issue