Hi Jupp,

Unfortunately, a Cap'n Proto object created in one thread cannot be called
from a different thread, because the object is tied to a specific network
connection and event loop. You can create a new event loop and new
connections from a separate thread, but you cannot share objects between
threads.

-Kenton

On Sat, Jul 9, 2016 at 2:27 AM, <[email protected]> wrote:

> Dear Brano, David, all,
>
> I am finally able to call remote functions, receive return values and
> handle disconnection of remote clients. What I am unable to get to work is
> the ability to invoke functions on registered clients with previously
> registered capabilities of clients.
> The below mentioned method "ComHandler::Run" is running in its own thread
> to don't stall the main thread. I am trying to invoke clients functions
> like this:
>
> void ComHandler::InvokeFunctionOnClient() {
>   for (ClientInterface::Client &client : this->registered_clients_) {
>    auto request = client.InvokeFunctionOnClientRequest();
>     // ...
>
>    request.send();
>   }
> }
>
> Whenever "ComHandler::InvokeFunctionOnClient" is called, the client does
> not receive anything and an exception is thrown. I suppose this is because
> "ComHandler::InvokeFunctionOnClient" is called from the main thread whereas
> EzRpcServer's event loop is running in a different thread.
>
> Here's the console output of the exception:
> unknown file: Failure
> C++ exception with description "src/kj/async.c++:227: failed: expected
> head == nullptr; EventLoop destroyed with events still in the queue.
> Memory leak?; head->trace() = kj::_::ChainPromiseNode
> kj::_::TransformPromiseNode<kj::Promise<void>, kj::_::Void,
> capnp::TwoPartyVatNetwork::OutgoingMessageImpl::send()::{lambda()#1},
> kj::_::PropagateException>
> kj::_::EagerPromiseNode<kj::_::Void>
>
>
> Can anyone help me?
>
> Thanks in advance and sorry - again - for the double post.
>
> Best regards,
> Jupp
>
> On Saturday, July 9, 2016 at 11:19:44 AM UTC+2, [email protected] wrote:
>>
>> Dear Brano, David, all,
>>
>> I am finally able to call remote functions, receive return values and
>> handle disconnection of remote clients. What I am unable to get to work is
>> the ability to invoke functions on registered clients with previously
>> registered capabilities of clients.
>> The below mentioned method "ComHandler::Run" is running in its own thread
>> to don't stall the main thread. I am trying to invoke clients functions
>> like this:
>>
>> void ComHandler::InvokeFunctionOnClient() {
>>   for (ClientInterface::Client &client : this->registered_clients_) {
>>     auto request = client.InvokeFunctionOnClientRequest();
>>     // ...
>>
>>   }
>> }
>>
>>
>>
>>
>>
>> On Tuesday, July 5, 2016 at 1:26:11 PM UTC+2, Branislav Katreniak wrote:
>>>
>>> You can remember the reference to ServerImpl before you pass it to
>>> EzRpcServer.
>>>
>>>     auto server = kj::heap<ServerImpl>();
>>>     ServerImpl& serverRef = *server;
>>>     capnp::EzRpcServer server(kj::mv(server), ip_address, port);
>>>
>>> Kind regards
>>>  Brano
>>>
>>> On Tue, Jul 5, 2016 at 9:12 AM, <[email protected]> wrote:
>>>
>>>> Hi David,
>>>>
>>>> thank you very much for the answer. I wasn't able to finally test it,
>>>> because I am now having a different problem related to my post.
>>>> Suppose I have the following server implementation:
>>>>
>>>> class ServerImpl:public ServerInterface::Server {
>>>>  private:
>>>>   std::vector<ClientInterface::Client> registered_clients_;
>>>>
>>>>  public:
>>>>   kj::Promise<void> registerClientInterface(
>>>> RegisterClientInterfaceContext context) override {
>>>>     this->registered_clients_.push_back(context.getParams().getClient
>>>> ());
>>>>   }
>>>>
>>>>   // ...
>>>> }
>>>>
>>>> class ComHandler {
>>>>  public:
>>>>   void Run(const std::string& ip_address, std::size_t port) {
>>>>     capnp::EzRpcServer server(kj::heap<ServerImpl>(), ip_address,
>>>> port);
>>>>         kj::WaitScope &wait_scope = server.getWaitScope();
>>>>
>>>>     kj::NEVER_DONE.wait(wait_scope);
>>>>   }
>>>>
>>>>   void InvokeFunctionOnClient() {
>>>>     // Here I need access to ServerImpl owned by EzRpcServer.
>>>>     // How would I do that?
>>>>   }
>>>> }
>>>>
>>>> I can only store the client capabilities in class "ServerImpl" since an
>>>> rvalue is needed for pushing to the vector. Since the object of
>>>> "ServerImpl" is owned by EzRpcServer, I do not have the possibility to
>>>> invoke a client's function from outside, e.g. from class "ComHandler".
>>>>
>>>> How would I do that?
>>>>
>>>> Best regards,
>>>> Jupp
>>>>
>>>>
>>>> --
> You received this message because you are subscribed to the Google Groups
> "Cap'n Proto" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> Visit this group at https://groups.google.com/group/capnproto.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
Visit this group at https://groups.google.com/group/capnproto.

Reply via email to