diff --git a/include/grpc++/alarm.h b/include/grpc++/alarm.h index f0ab546cb29e5a55b5a3c16052d3ea6315da7062..9979c34e4f13190ea70333af35a80ad5aec2f6e3 100644 --- a/include/grpc++/alarm.h +++ b/include/grpc++/alarm.h @@ -36,6 +36,7 @@ #ifndef GRPCXX_ALARM_H #define GRPCXX_ALARM_H +#include <grpc++/impl/codegen/completion_queue_tag.h> #include <grpc++/impl/codegen/grpc_library.h> #include <grpc++/impl/codegen/time.h> @@ -63,6 +64,19 @@ class Alarm : private GrpcLibrary { void Cancel(); private: + class AlarmEntry : public CompletionQueueTag { + public: + AlarmEntry(void* tag) : tag_(tag) {} + bool FinalizeResult(void** tag, bool* status) GRPC_OVERRIDE { + *tag = tag_; + return true; + } + + private: + void* tag_; + }; + + AlarmEntry tag_; grpc_alarm* const alarm_; // owned }; diff --git a/src/cpp/common/alarm.cc b/src/cpp/common/alarm.cc index aca15dc5eb5791a8786cddd46742d599b29762f2..a2896887682aeea4e258ffe5a4dbcfca01b64052 100644 --- a/src/cpp/common/alarm.cc +++ b/src/cpp/common/alarm.cc @@ -32,29 +32,15 @@ #include <grpc++/alarm.h> #include <grpc++/completion_queue.h> -#include <grpc++/impl/codegen/completion_queue_tag.h> #include <grpc++/impl/grpc_library.h> #include <grpc/grpc.h> namespace grpc { -class AlarmEntry : public CompletionQueueTag { - public: - AlarmEntry(void* tag) : tag_(tag) {} - bool FinalizeResult(void** tag, bool* status) GRPC_OVERRIDE { - *tag = tag_; - delete this; - return true; - } - - private: - void* tag_; -}; - static internal::GrpcLibraryInitializer g_gli_initializer; Alarm::Alarm(CompletionQueue* cq, gpr_timespec deadline, void* tag) - : alarm_(grpc_alarm_create(cq->cq(), deadline, - static_cast<void*>(new AlarmEntry(tag)))) { + : tag_(tag), + alarm_(grpc_alarm_create(cq->cq(), deadline, static_cast<void*>(&tag_))) { g_gli_initializer.summon(); }