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

Desktop (please complete the following information)
- OS: Ubuntu
- eRPC Version: current master
Steps you didn't forgot to do
Additional context
-
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.
-
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
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());
}
void client_thread_func()
{
// std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
int main()
{
client_transport = new InterThreadBufferTransport();
server_transport = new InterThreadBufferTransport();
}
Expected behavior
Both threads should be able to communicate with each other. But a segfault is being observed.
Screenshots
Desktop (please complete the following information)
Steps you didn't forgot to do
Additional context
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.
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