Skip to content

[BUG] Inter Thread Message Buffer Transport Doesn't Seem to be Working (Crash) #463

@hadi81

Description

@hadi81

Describe the bug

A crash is observed when I try to use inter thread message buffer transport.

code.txt

To Reproduce

This is the code being used:

#include
#include
#include

#include "erpc_server_setup.h"
#include "erpc_client_setup.h"
#include "erpc_inter_thread_buffer_transport.hpp"
#include "c_erpc_interface_server.h"
#include "c_erpc_interface_client.h"

using namespace erpc;

InterThreadBufferTransport *client_transport;
InterThreadBufferTransport *server_transport;

erpc_mbf_t message_buffer_factory1;

// erpc_mbf_t message_buffer_factory2;

erpc_server_t server;

void server_thread_func()
{
auto Stransport = reinterpret_cast<erpc_transport_t>(server_transport);
server = erpc_server_init(Stransport, message_buffer_factory1);
erpc_add_service_to_server(server, create_Arithmetic_service());

std::cout << "[SERVER] Starting server...\n";
erpc_server_run(server);
std::cout << "[SERVER] Server stopped.\n";
while(1) {}

}

void client_thread_func()
{
// std::this_thread::sleep_for(std::chrono::milliseconds(200));

auto Ctransport = reinterpret_cast<erpc_transport_t>(client_transport);
erpc_client_t client = erpc_client_init(Ctransport, message_buffer_factory1);
initArithmetic_client(client);

std::this_thread::sleep_for(std::chrono::milliseconds(200));
std::cout << "[CLIENT] Performing remote call...\n";
// int32_t result = add(10, 20);

C cStruct;
cStruct.fieldC = 10;

B bStruct;
bStruct.fieldB = 20;
bStruct.cStruct = &cStruct; // assign pointer, not object

A aStruct;
aStruct.fieldA = 30;
aStruct.bStruct = &bStruct; // assign pointer, not object

sendStructA(&aStruct); // pass address of A because function expects pointer


std::cout << "[CLIENT] sendStructA \n" << std::endl;

std::this_thread::sleep_for(std::chrono::milliseconds(100));  
// erpc_server_stop();  // Signal server to stop
while(1) {}

}

int main()
{
client_transport = new InterThreadBufferTransport();
server_transport = new InterThreadBufferTransport();

// client_transport = new InterThreadBufferTransport();
// server_transport = client_transport;


client_transport->linkWithPeer(server_transport);
// server_transport->linkWithPeer(client_transport);

message_buffer_factory1 = erpc_mbf_dynamic_init();
// message_buffer_factory2 = erpc_mbf_dynamic_init();

// message_buffer_factory1 = erpc_mbf_static_init();
// message_buffer_factory2 = erpc_mbf_static_init();


std::thread server_thread(server_thread_func);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
std::thread client_thread(client_thread_func);

while(1) {}
client_thread.join();
server_thread.join();

std::cout << "[MAIN] Client and server finished.\n";
return 0;

}

Expected behavior

Both threads should be able to communicate with each other. But a segfault is being observed.

Screenshots

Image

Desktop (please complete the following information)

  • OS: Ubuntu
  • eRPC Version: current master

Steps you didn't forgot to do

  • I checked if there is no related issue opened/closed.
  • I checked that there doesn't exist opened PR which is solving this issue.

Additional context

  1. Seems like there is some race condtion. Before client is able to copy the response message, server disposes off the request because of which the crash is being observed.

  2. I have seen C wrapper for all the transports except inter thread message buffer transport. Also there are no unit tests for this transport. I suspect that support for this transport has not been tested

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions