Merge pull request #21754 from vjpai/alarm_executor

Alarm callback should run on executor
pull/21763/head
Vijay Pai 5 years ago committed by GitHub
commit 749b50d938
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      src/cpp/common/alarm.cc
  2. 20
      test/cpp/common/alarm_test.cc

@ -25,6 +25,7 @@
#include <grpcpp/impl/grpc_library.h>
#include <grpcpp/support/time.h>
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/surface/completion_queue.h"
@ -81,9 +82,16 @@ class AlarmImpl : public ::grpc::internal::CompletionQueueTag {
Ref();
GRPC_CLOSURE_INIT(&on_alarm_,
[](void* arg, grpc_error* error) {
AlarmImpl* alarm = static_cast<AlarmImpl*>(arg);
alarm->callback_(error == GRPC_ERROR_NONE);
alarm->Unref();
grpc_core::Executor::Run(
GRPC_CLOSURE_CREATE(
[](void* arg, grpc_error* error) {
AlarmImpl* alarm =
static_cast<AlarmImpl*>(arg);
alarm->callback_(error == GRPC_ERROR_NONE);
alarm->Unref();
},
arg, nullptr),
error);
},
this, grpc_schedule_on_exec_ctx);
grpc_timer_init(&timer_, grpc_timespec_to_millis_round_up(deadline),

@ -304,6 +304,26 @@ TEST(AlarmTest, CallbackCancellation) {
[c] { return c->completed; }));
}
TEST(AlarmTest, CallbackCancellationLocked) {
Alarm alarm;
auto c = std::make_shared<Completion>();
alarm.experimental().Set(
std::chrono::system_clock::now() + std::chrono::seconds(10),
[c](bool ok) {
EXPECT_FALSE(ok);
std::lock_guard<std::mutex> l(c->mu);
c->completed = true;
c->cv.notify_one();
});
std::unique_lock<std::mutex> l(c->mu);
alarm.Cancel();
EXPECT_TRUE(c->cv.wait_until(
l, std::chrono::system_clock::now() + std::chrono::seconds(1),
[c] { return c->completed; }));
}
TEST(AlarmTest, SetDestruction) {
CompletionQueue cq;
void* junk = reinterpret_cast<void*>(1618033);

Loading…
Cancel
Save