@@ -87,7 +87,7 @@ bool RpcBase::call(const std::string& action,
8787 // Wait for response
8888 std::stringstream expected_id;
8989 expected_id << m_transaction_id;
90- RpcMessage* rpc_message = nullptr ;
90+ std::shared_ptr< RpcMessage> rpc_message;
9191 auto wait_time = std::chrono::steady_clock ().now () + timeout;
9292 do
9393 {
@@ -104,12 +104,15 @@ bool RpcBase::call(const std::string& action,
104104 if (rpc_message->unique_id != expected_id.str ())
105105 {
106106 // Wrong message
107- delete rpc_message;
108- rpc_message = nullptr ;
107+ rpc_message.reset ();
109108 }
110109 }
111110 }
112- } while (ret && (rpc_message == nullptr ));
111+ else
112+ {
113+ ret = false ;
114+ }
115+ } while (ret && !rpc_message);
113116
114117 // Extract response
115118 if (rpc_message)
@@ -126,7 +129,7 @@ bool RpcBase::call(const std::string& action,
126129 {
127130 message = rpc_message->message .GetString ();
128131 }
129- delete rpc_message;
132+ rpc_message. reset () ;
130133 }
131134 else
132135 {
@@ -164,12 +167,8 @@ void RpcBase::start()
164167 // Initialize transaction id sequence
165168 m_transaction_id = std::rand ();
166169
167- // Flush queues
168- m_requests_queue.clear ();
169- m_requests_queue.setEnable (true );
170- m_results_queue.clear ();
171-
172170 // Start reception thread
171+ m_requests_queue.setEnable (true );
173172 m_rx_thread = new std::thread (std::bind (&RpcBase::rxThread, this ));
174173 }
175174}
@@ -185,6 +184,10 @@ void RpcBase::stop()
185184 m_rx_thread->join ();
186185 delete m_rx_thread;
187186 m_rx_thread = nullptr ;
187+
188+ // Flush queues
189+ m_requests_queue.clear ();
190+ m_results_queue.clear ();
188191 }
189192}
190193
@@ -309,7 +312,7 @@ bool RpcBase::decodeCall(const std::string& unique_id,
309312 if (action.IsString () && payload.IsObject ())
310313 {
311314 // Add request to the queue
312- RpcMessage* msg = new RpcMessage (unique_id, action.GetString (), rpc_frame, payload);
315+ auto msg = std::make_shared< RpcMessage> (unique_id, action.GetString (), rpc_frame, payload);
313316 m_requests_queue.push (msg);
314317
315318 ret = true ;
@@ -327,7 +330,7 @@ bool RpcBase::decodeCallResult(const std::string& unique_id, rapidjson::Document
327330 if (payload.IsObject ())
328331 {
329332 // Add result to the queue
330- RpcMessage* msg = new RpcMessage (unique_id, rpc_frame, payload);
333+ auto msg = std::make_shared< RpcMessage> (unique_id, rpc_frame, payload);
331334 m_results_queue.push (msg);
332335
333336 ret = true ;
@@ -349,7 +352,7 @@ bool RpcBase::decodeCallError(const std::string& unique_id,
349352 if (error.IsString () && message.IsString () && payload.IsObject ())
350353 {
351354 // Add error to the queue
352- RpcMessage* msg = new RpcMessage (unique_id, rpc_frame, payload, &error, &message);
355+ auto msg = std::make_shared< RpcMessage> (unique_id, rpc_frame, payload, &error, &message);
353356 m_results_queue.push (msg);
354357
355358 ret = true ;
@@ -380,7 +383,7 @@ void RpcBase::sendCallError(const std::string& unique_id, const char* error, con
380383void RpcBase::rxThread ()
381384{
382385 // Thread loop
383- RpcMessage* rpc_message = nullptr ;
386+ std::shared_ptr< RpcMessage> rpc_message;
384387 while (m_requests_queue.pop (rpc_message))
385388 {
386389 // Notify call
@@ -417,7 +420,7 @@ void RpcBase::rxThread()
417420 }
418421
419422 // Free resources
420- delete rpc_message;
423+ rpc_message. reset () ;
421424 }
422425}
423426
0 commit comments