I've got a server class that has a `start` method and a `stop` method. The 
listening port is unknown until a user calls start.

As such, I build the server there, something like:

     void GrpcStreamingServerImpl::start(QUrl const& endpoint)
{
stop();

::grpc::ServerBuilder builder;
builder.AddListeningPort(endpoint.toString().toStdString(), 
grpc::InsecureServerCredentials());
builder.RegisterService(&m_service);
m_completionQueueCalls         = builder.AddCompletionQueue();
m_completionQueueNotifications = builder.AddCompletionQueue();
m_server                       = builder.BuildAndStart();

m_running = true;
               ....

and then I tear everything down when the server stops. Something like:

    if(!m_running)
    {
        return;
    }

    m_running = false;

    {
        std::lock_guard<std::mutex> local_lock_guard {m_mutexSessions};
        for(const auto& it : m_sessions)
        {
            it.second->finish();
        }
    }

    if(m_server)
    {
        m_server->Shutdown();
        m_completionQueueCalls->Shutdown();
        m_completionQueueNotifications->Shutdown();

        // Wait for the threads to exit before allowing the destruction of 
the completion queues they use
        if(m_callQueueThread && m_callQueueThread->isRunning() )
        {
            m_callQueueThread->wait();
        }

        if(m_notificationQueueThread && 
m_notificationQueueThread->isRunning())
        {
            m_notificationQueueThread->wait();
        }

        delete m_completionQueueNotifications;
        delete m_completionQueueCalls;
        delete m_server;
....


Problem is, if the user wants to start, stop, and start again, the 
RegisterService call results in abort being called and complains a service 
is already registered.

I tried to move the registration part to the constructor and only add a 
listening port when start() is called, but that results in a seg fault. 
Builder isn't a singleton, although I dunno how or why it retains the 
registration after the server object it returned was destroyed.

A little googling and I found issues were submitted regarding this, but 
there are no plans to implement an "unregisterService" method. So, what 
does one to work around this problem?

-- 
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 grpc-io+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/b5f4ccca-ab16-4ea6-9c1b-e4c2b80d8cbdn%40googlegroups.com.

Reply via email to