@@ -516,21 +516,27 @@ GDBRemoteCommunicationClient::GetRemoteQSupported ()
516
516
}
517
517
}
518
518
519
- bool
520
- GDBRemoteCommunicationClient::GetThreadSuffixSupported ()
519
+ void
520
+ GDBRemoteCommunicationClient::ComputeThreadSuffixSupport ()
521
521
{
522
- if (m_supports_thread_suffix == eLazyBoolCalculate)
522
+ if (m_supports_thread_suffix != eLazyBoolCalculate)
523
+ return ;
524
+
525
+ StringExtractorGDBRemote response;
526
+ m_supports_thread_suffix = eLazyBoolNo;
527
+ if (SendPacketAndWaitForResponse (" QThreadSuffixSupported" , response, false ) == PacketResult::Success)
523
528
{
524
- StringExtractorGDBRemote response;
525
- m_supports_thread_suffix = eLazyBoolNo;
526
- if (SendPacketAndWaitForResponse (" QThreadSuffixSupported" , response, false ) == PacketResult::Success)
527
- {
528
- if (response.IsOKResponse ())
529
- m_supports_thread_suffix = eLazyBoolYes;
530
- }
529
+ if (response.IsOKResponse ())
530
+ m_supports_thread_suffix = eLazyBoolYes;
531
531
}
532
- return m_supports_thread_suffix;
533
532
}
533
+
534
+ bool
535
+ GDBRemoteCommunicationClient::GetThreadSuffixSupported ()
536
+ {
537
+ return m_supports_thread_suffix == eLazyBoolYes;
538
+ }
539
+
534
540
bool
535
541
GDBRemoteCommunicationClient::GetVContSupported (char flavor)
536
542
{
@@ -592,26 +598,17 @@ GDBRemoteCommunicationClient::GetVContSupported (char flavor)
592
598
GDBRemoteCommunication::PacketResult
593
599
GDBRemoteCommunicationClient::SendThreadSpecificPacketAndWaitForResponse (lldb::tid_t tid, StreamString &&payload,
594
600
StringExtractorGDBRemote &response,
595
- bool send_async )
601
+ const Lock &lock )
596
602
{
597
- Lock lock (*this , send_async);
598
- if (!lock)
599
- {
600
- if (Log *log = ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS))
601
- log ->Printf (" GDBRemoteCommunicationClient::%s: Didn't get sequence mutex for %s packet." , __FUNCTION__,
602
- payload.GetString ().c_str ());
603
- return PacketResult::ErrorNoSequenceLock;
604
- }
605
-
606
603
if (GetThreadSuffixSupported ())
607
604
payload.Printf (" ;thread:%4.4" PRIx64 " ;" , tid);
608
605
else
609
606
{
610
- if (!SetCurrentThread (tid))
607
+ if (!SetCurrentThread (tid, lock ))
611
608
return PacketResult::ErrorSendFailed;
612
609
}
613
610
614
- return SendPacketAndWaitForResponseNoLock (payload.GetString (), response);
611
+ return SendPacketAndWaitForResponse (payload.GetString (), response, lock );
615
612
}
616
613
617
614
// Check if the target supports 'p' packet. It sends out a 'p'
@@ -624,11 +621,20 @@ GDBRemoteCommunicationClient::GetpPacketSupported (lldb::tid_t tid)
624
621
{
625
622
if (m_supports_p == eLazyBoolCalculate)
626
623
{
624
+ Lock lock (*this , false );
625
+ if (!lock)
626
+ {
627
+ Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS));
628
+ if (log )
629
+ log ->Printf (" GDBRemoteCommunicationClient::%s failed to get sequence mutex" , __FUNCTION__);
630
+ return false ;
631
+ }
632
+
627
633
m_supports_p = eLazyBoolNo;
628
634
StreamString payload;
629
635
payload.PutCString (" p0" );
630
636
StringExtractorGDBRemote response;
631
- if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, false ) ==
637
+ if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, lock ) ==
632
638
PacketResult::Success &&
633
639
response.IsNormalResponse ())
634
640
{
@@ -766,7 +772,7 @@ GDBRemoteCommunicationClient::SendPacketsAndConcatenateResponses
766
772
// Construct payload
767
773
char sizeDescriptor[128 ];
768
774
snprintf (sizeDescriptor, sizeof (sizeDescriptor), " %x,%x" , offset, response_size);
769
- PacketResult result = SendPacketAndWaitForResponseNoLock (payload_prefix_str + sizeDescriptor, this_response);
775
+ PacketResult result = SendPacketAndWaitForResponse (payload_prefix_str + sizeDescriptor, this_response, lock );
770
776
if (result != PacketResult::Success)
771
777
return result;
772
778
@@ -2789,7 +2795,7 @@ GDBRemoteCommunicationClient::KillSpawnedProcess (lldb::pid_t pid)
2789
2795
}
2790
2796
2791
2797
bool
2792
- GDBRemoteCommunicationClient::SetCurrentThread (uint64_t tid)
2798
+ GDBRemoteCommunicationClient::SetCurrentThread (uint64_t tid, const Lock &lock )
2793
2799
{
2794
2800
if (m_curr_tid == tid)
2795
2801
return true ;
@@ -2802,7 +2808,7 @@ GDBRemoteCommunicationClient::SetCurrentThread (uint64_t tid)
2802
2808
packet_len = ::snprintf (packet, sizeof (packet), " Hg%" PRIx64, tid);
2803
2809
assert (packet_len + 1 < (int )sizeof (packet));
2804
2810
StringExtractorGDBRemote response;
2805
- if (SendPacketAndWaitForResponse (packet, packet_len, response, false ) == PacketResult::Success)
2811
+ if (SendPacketAndWaitForResponse (llvm::StringRef ( packet, packet_len) , response, lock ) == PacketResult::Success)
2806
2812
{
2807
2813
if (response.IsOKResponse ())
2808
2814
{
@@ -2963,9 +2969,9 @@ GDBRemoteCommunicationClient::GetCurrentThreadIDs (std::vector<lldb::tid_t> &thr
2963
2969
StringExtractorGDBRemote response;
2964
2970
2965
2971
PacketResult packet_result;
2966
- for (packet_result = SendPacketAndWaitForResponseNoLock (" qfThreadInfo" , response);
2972
+ for (packet_result = SendPacketAndWaitForResponse (" qfThreadInfo" , response, lock );
2967
2973
packet_result == PacketResult::Success && response.IsNormalResponse ();
2968
- packet_result = SendPacketAndWaitForResponseNoLock (" qsThreadInfo" , response))
2974
+ packet_result = SendPacketAndWaitForResponse (" qsThreadInfo" , response, lock ))
2969
2975
{
2970
2976
char ch = response.GetChar ();
2971
2977
if (ch == ' l' )
@@ -3496,12 +3502,12 @@ GDBRemoteCommunicationClient::AvoidGPackets (ProcessGDBRemote *process)
3496
3502
}
3497
3503
3498
3504
DataBufferSP
3499
- GDBRemoteCommunicationClient::ReadRegister (lldb::tid_t tid, uint32_t reg)
3505
+ GDBRemoteCommunicationClient::ReadRegister (lldb::tid_t tid, uint32_t reg, const Lock &lock )
3500
3506
{
3501
3507
StreamString payload;
3502
3508
payload.Printf (" p%x" , reg);
3503
3509
StringExtractorGDBRemote response;
3504
- if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, false ) != PacketResult::Success ||
3510
+ if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, lock ) != PacketResult::Success ||
3505
3511
!response.IsNormalResponse ())
3506
3512
return nullptr ;
3507
3513
@@ -3511,12 +3517,12 @@ GDBRemoteCommunicationClient::ReadRegister(lldb::tid_t tid, uint32_t reg)
3511
3517
}
3512
3518
3513
3519
DataBufferSP
3514
- GDBRemoteCommunicationClient::ReadAllRegisters (lldb::tid_t tid)
3520
+ GDBRemoteCommunicationClient::ReadAllRegisters (lldb::tid_t tid, const Lock &lock )
3515
3521
{
3516
3522
StreamString payload;
3517
3523
payload.PutChar (' g' );
3518
3524
StringExtractorGDBRemote response;
3519
- if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, false ) != PacketResult::Success ||
3525
+ if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, lock ) != PacketResult::Success ||
3520
3526
!response.IsNormalResponse ())
3521
3527
return nullptr ;
3522
3528
@@ -3526,25 +3532,26 @@ GDBRemoteCommunicationClient::ReadAllRegisters(lldb::tid_t tid)
3526
3532
}
3527
3533
3528
3534
bool
3529
- GDBRemoteCommunicationClient::WriteRegister (lldb::tid_t tid, uint32_t reg_num, llvm::ArrayRef<uint8_t > data)
3535
+ GDBRemoteCommunicationClient::WriteRegister (lldb::tid_t tid, uint32_t reg_num, llvm::ArrayRef<uint8_t > data,
3536
+ const Lock &lock)
3530
3537
{
3531
3538
StreamString payload;
3532
3539
payload.Printf (" P%x=" , reg_num);
3533
3540
payload.PutBytesAsRawHex8 (data.data (), data.size (), endian::InlHostByteOrder (), endian::InlHostByteOrder ());
3534
3541
StringExtractorGDBRemote response;
3535
- return SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, false ) ==
3542
+ return SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, lock ) ==
3536
3543
PacketResult::Success &&
3537
3544
response.IsOKResponse ();
3538
3545
}
3539
3546
3540
3547
bool
3541
- GDBRemoteCommunicationClient::WriteAllRegisters (lldb::tid_t tid, llvm::ArrayRef<uint8_t > data)
3548
+ GDBRemoteCommunicationClient::WriteAllRegisters (lldb::tid_t tid, llvm::ArrayRef<uint8_t > data, const Lock &lock )
3542
3549
{
3543
3550
StreamString payload;
3544
3551
payload.PutChar (' G' );
3545
3552
payload.PutBytesAsRawHex8 (data.data (), data.size (), endian::InlHostByteOrder (), endian::InlHostByteOrder ());
3546
3553
StringExtractorGDBRemote response;
3547
- return SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, false ) ==
3554
+ return SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, lock ) ==
3548
3555
PacketResult::Success &&
3549
3556
response.IsOKResponse ();
3550
3557
}
@@ -3555,12 +3562,21 @@ GDBRemoteCommunicationClient::SaveRegisterState (lldb::tid_t tid, uint32_t &save
3555
3562
save_id = 0 ; // Set to invalid save ID
3556
3563
if (m_supports_QSaveRegisterState == eLazyBoolNo)
3557
3564
return false ;
3558
-
3565
+
3566
+ Lock lock (*this , false );
3567
+ if (!lock)
3568
+ {
3569
+ Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS));
3570
+ if (log )
3571
+ log ->Printf (" GDBRemoteCommunicationClient::%s failed to get sequence mutex" , __FUNCTION__);
3572
+ return false ;
3573
+ }
3574
+
3559
3575
m_supports_QSaveRegisterState = eLazyBoolYes;
3560
3576
StreamString payload;
3561
3577
payload.PutCString (" QSaveRegisterState" );
3562
3578
StringExtractorGDBRemote response;
3563
- if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, false ) != PacketResult::Success)
3579
+ if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, lock ) != PacketResult::Success)
3564
3580
return false ;
3565
3581
3566
3582
if (response.IsUnsupportedResponse ())
@@ -3583,10 +3599,19 @@ GDBRemoteCommunicationClient::RestoreRegisterState (lldb::tid_t tid, uint32_t sa
3583
3599
if (m_supports_QSaveRegisterState == eLazyBoolNo)
3584
3600
return false ;
3585
3601
3602
+ Lock lock (*this , false );
3603
+ if (!lock)
3604
+ {
3605
+ Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS));
3606
+ if (log )
3607
+ log ->Printf (" GDBRemoteCommunicationClient::%s failed to get sequence mutex" , __FUNCTION__);
3608
+ return false ;
3609
+ }
3610
+
3586
3611
StreamString payload;
3587
3612
payload.Printf (" QRestoreRegisterState:%u" , save_id);
3588
3613
StringExtractorGDBRemote response;
3589
- if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, false ) != PacketResult::Success)
3614
+ if (SendThreadSpecificPacketAndWaitForResponse (tid, std::move (payload), response, lock ) != PacketResult::Success)
3590
3615
return false ;
3591
3616
3592
3617
if (response.IsOKResponse ())
@@ -3815,7 +3840,7 @@ GDBRemoteCommunicationClient::ServeSymbolLookups(lldb_private::Process *process)
3815
3840
StreamString packet;
3816
3841
packet.PutCString (" qSymbol::" );
3817
3842
StringExtractorGDBRemote response;
3818
- while (SendPacketAndWaitForResponseNoLock (packet.GetString (), response) == PacketResult::Success)
3843
+ while (SendPacketAndWaitForResponse (packet.GetString (), response, lock ) == PacketResult::Success)
3819
3844
{
3820
3845
if (response.IsOKResponse ())
3821
3846
{
0 commit comments