-
Notifications
You must be signed in to change notification settings - Fork 238
Description
Describe the bug
A crash is observed when I try to use inter thread message buffer transport.
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
- 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
-
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