Hi all,

I've created a tiny code sample that is based off the hello world async 
greeter example. I keep getting a "pure virtual method called" in the 
grpc_completion_queue_next() function, and I'm having a hard time 
understanding why. What am I doing wrong?

I've included the proto file, C++ code and gdb output... (the program is 
both a client or a server, if you give it a command line value of "c" it 
acts as a client).

Thanks in advance!

PROTO FILE


















*syntax = "proto3";package helloworld;service Greeter{    rpc SayHello 
(HelloRequest) returns (stream HelloReply) {}}message HelloRequest{    
string  message = 1;}message HelloReply{    string  reply = 1;}*


C++ CODE

*#include <iostream>*
*#include <string>*
*#include <grpc++/grpc++.h>*
*#include "minfail.grpc.pb.h"*

*using namespace std;*
*using namespace helloworld;*

*class CallData {*
*public:*
*    CallData(Greeter::AsyncService* service, grpc::ServerCompletionQueue* 
cq) : service_(service), cq_(cq), responder_(&ctx_), status_(CREATE) {*
*        Proceed();*
*    }*

*    void Proceed() {*
*        if (status_ == CREATE) {*
*            status_ = PROCESS;*
*            service_->RequestSayHello(&ctx_, &request_, &responder_, cq_, 
cq_, this);*
*        } else if (status_ == PROCESS) {*
*            new CallData(service_, cq_);*
*            reply_.set_reply("hello " + request_.message());*
*            responder_.Write (reply_, this);*
*            responder_.Finish(grpc::Status::OK, this);*
*            status_ = FINISH;*
*        } else {*
*            GPR_ASSERT(status_ == FINISH);*
*            delete this;*
*        }*
*    }*

*private:*
*    HelloRequest request_;*
*    HelloReply reply_;*
*    grpc::ServerAsyncWriter<HelloReply> responder_;*

*    enum CallStatus { CREATE, PROCESS, FINISH };*
*    CallStatus status_;*
*    grpc::ServerContext ctx_;*
*    grpc::ServerCompletionQueue* cq_;*
*    Greeter::AsyncService* service_;*
*};*

*class GreeterClient*
*{*
*public:*
*    GreeterClient (shared_ptr <grpc::Channel> channel)*
*    : stub_ (Greeter::NewStub (channel)) {}*
*    string*
*    SayHello (const string &user) {*
*        HelloRequest request;*
*        request.set_message (user);*
*        grpc::ClientContext context;*
*        unique_ptr <grpc::ClientReader <HelloReply>> reader 
(stub_->SayHello (&context, request));*
*        HelloReply reply;*
*        while (reader -> Read (&reply)) {*
*            cout << "SayHello returns " << reply.reply() << "\n";*
*        }*
*        grpc::Status status = reader -> Finish();*
*        if (status.ok()) {*
*            return (reply.reply());*
*        }*
*        return ("<RPC failed>");*
*    }*

*private:*
*    unique_ptr<Greeter::Stub> stub_;*
*};*

*int*
*main (int argc, char **argv)*
*{*
*    string server_address ("0.0.0.0:50051");*

*    if (argc == 2 && argv [1][0] == 'c') {*
*        GreeterClient greeter(grpc::CreateChannel (server_address, 
grpc::InsecureChannelCredentials()));*
*        cout << "Sending world...\n";*
*        cout << "Response is " << greeter.SayHello ("world") << "\n";*
*    } else {*
*        unique_ptr<grpc::ServerCompletionQueue> cq;*
*        Greeter::AsyncService service;*
*        unique_ptr<grpc::Server> server;*

*        grpc::ServerBuilder builder;*

*        builder.AddListeningPort(server_address, 
grpc::InsecureServerCredentials());*
*        builder.RegisterService(&service);*
*        cq = builder.AddCompletionQueue();*
*        server = builder.BuildAndStart();*

*        new CallData(&service, cq.get());*
*        CallData* tag;  // uniquely identifies a request.*
*        bool ok;*
*        while (true) {*
*            GPR_ASSERT(cq->Next((void **)&tag, &ok));*
*            GPR_ASSERT(ok);*
*            tag->Proceed();*
*        }*

*        server->Shutdown();*
*        cq->Shutdown();*
*    }*
*}*

and run / GDB output:





*$ ./minfailD1115 11:45:47.919769500   24264 env_linux.c:77]             
Warning: insecure environment read function 'getenv' usedpure virtual 
method calledterminate called without an active exceptionAborted (core 
dumped)*

*$ gdb ./minfail*
*... elided ...*
*Program received signal SIG36, Real-time event 36.*
*0x00000035ce0e8cec in epoll_pwait () from /lib64/libc.so.6*
*(gdb) bt*
*#0  0x00000035ce0e8cec in epoll_pwait () from /lib64/libc.so.6*
*#1  0x00007ffff76f8d4a in ?? () from /.../lib/libgrpc++.so.1*
*#2  0x00007ffff76f91a6 in ?? () from /.../lib/libgrpc++.so.1*
*#3  0x00007ffff770d61b in grpc_completion_queue_next () from 
/.../lib/libgrpc++.so.1*
*#4  0x00007ffff76e3f20 in grpc::CompletionQueue::AsyncNextInternal(void**, 
bool*, gpr_timespec) () from /.../lib/libgrpc++.so.1*
*#5  0x000000000040919f in grpc::CompletionQueue::Next 
[_ZN4grpc15Completion...] (this=0x628fa0, tag=0x7fffffffe1e8, 
ok=0x7fffffffe1e7) at 
.../include/grpc++/impl/codegen/completion_queue.h:148*
*#6  0x00000000004085ca in main [main] (argc=1, argv=0x7fffffffe3a8) at 
minfail.cc:95*
*(gdb)*

Any help greatly appreciated!

Cheers,
-RK

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/34f059a0-f825-4aa3-a725-84fb61e46b1f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to