@@ -170,34 +170,6 @@ void PABotBase::wait_for_all_requests(const Cancellable* cancelled){
170
170
171
171
// m_logger.log("Waiting for all requests to finish... Completed.", COLOR_DARKGREEN);
172
172
}
173
-
174
- bool PABotBase::try_stop_all_commands (){
175
-
176
- #ifdef DEBUG_STACK_TRACE
177
- cout << __FILE__ << " :" << __LINE__ << " PABotBase::try_stop_all_commands()" << endl;
178
- cout << " -----------------------------------------------------------------------------------------" << endl;
179
- #if defined(__APPLE__)
180
- void * callstack[128 ];
181
- int i, frames = backtrace (callstack, 128 );
182
- char ** strs = backtrace_symbols (callstack, frames);
183
- for (i = 0 ; i < frames; ++i) {
184
- cout << strs[i] << endl;
185
- }
186
- free (strs);
187
- #endif
188
- cout << " -----------------------------------------------------------------------------------------" << endl;
189
- #endif
190
-
191
- auto scope_check = m_sanitizer.check_scope ();
192
-
193
- uint64_t seqnum = try_issue_request (nullptr , SerialPABotBase::DeviceRequest_request_stop (), true );
194
- if (seqnum != 0 ){
195
- clear_all_active_commands (seqnum);
196
- return true ;
197
- }else {
198
- return false ;
199
- }
200
- }
201
173
void PABotBase::stop_all_commands (){
202
174
203
175
#ifdef DEBUG_STACK_TRACE
@@ -217,24 +189,13 @@ void PABotBase::stop_all_commands(){
217
189
218
190
auto scope_check = m_sanitizer.check_scope ();
219
191
220
- uint64_t seqnum = issue_request (nullptr , SerialPABotBase::DeviceRequest_request_stop (), true );
192
+ uint64_t seqnum = issue_request (nullptr , SerialPABotBase::DeviceRequest_request_stop (), true , true );
221
193
clear_all_active_commands (seqnum);
222
194
}
223
- bool PABotBase::try_next_command_interrupt (){
224
- auto scope_check = m_sanitizer.check_scope ();
225
-
226
- uint64_t seqnum = try_issue_request (nullptr , SerialPABotBase::DeviceRequest_next_command_interrupt (), true );
227
- if (seqnum != 0 ){
228
- clear_all_active_commands (seqnum);
229
- return true ;
230
- }else {
231
- return false ;
232
- }
233
- }
234
195
void PABotBase::next_command_interrupt (){
235
196
auto scope_check = m_sanitizer.check_scope ();
236
197
237
- uint64_t seqnum = issue_request (nullptr , SerialPABotBase::DeviceRequest_next_command_interrupt (), true );
198
+ uint64_t seqnum = issue_request (nullptr , SerialPABotBase::DeviceRequest_next_command_interrupt (), true , true );
238
199
clear_all_active_commands (seqnum);
239
200
}
240
201
void PABotBase::clear_all_active_commands (uint64_t seqnum){
@@ -649,7 +610,8 @@ void PABotBase::retransmit_thread(){
649
610
650
611
uint64_t PABotBase::try_issue_request (
651
612
const Cancellable* cancelled,
652
- const BotBaseRequest& request, bool silent_remove
613
+ const BotBaseRequest& request,
614
+ bool silent_remove, bool do_not_block
653
615
){
654
616
auto scope_check = m_sanitizer.check_scope ();
655
617
@@ -677,14 +639,20 @@ uint64_t PABotBase::try_issue_request(
677
639
size_t queue_limit = m_max_pending_requests.load (std::memory_order_relaxed);
678
640
679
641
// Too many unacked requests in flight.
680
- if (inflight_requests () >= queue_limit){
642
+ if (!do_not_block && inflight_requests () >= queue_limit){
681
643
// m_logger.log("Message throttled due to too many inflight requests.");
682
644
return 0 ;
683
645
}
684
646
685
647
// Don't get too far ahead of the oldest seqnum.
686
648
uint64_t seqnum = m_send_seq;
687
649
if (seqnum - oldest_live_seqnum () > MAX_SEQNUM_GAP){
650
+ if (do_not_block){
651
+ throw ConnectionException (
652
+ &m_logger,
653
+ " Connection has stalled for a long time. Assuming it is dead."
654
+ );
655
+ }
688
656
return 0 ;
689
657
}
690
658
@@ -722,7 +690,8 @@ uint64_t PABotBase::try_issue_request(
722
690
}
723
691
uint64_t PABotBase::try_issue_command (
724
692
const Cancellable* cancelled,
725
- const BotBaseRequest& request, bool silent_remove
693
+ const BotBaseRequest& request,
694
+ bool silent_remove
726
695
){
727
696
auto scope_check = m_sanitizer.check_scope ();
728
697
@@ -801,11 +770,12 @@ uint64_t PABotBase::try_issue_command(
801
770
}
802
771
uint64_t PABotBase::issue_request (
803
772
const Cancellable* cancelled,
804
- const BotBaseRequest& request, bool silent_remove
773
+ const BotBaseRequest& request,
774
+ bool silent_remove, bool do_not_block
805
775
){
806
776
auto scope_check = m_sanitizer.check_scope ();
807
777
808
- // Issue a request or a command and return.
778
+ // Issue a request and return.
809
779
//
810
780
// If it cannot be issued (because we're over the limits), this function
811
781
// will wait until it can be issued.
@@ -824,7 +794,7 @@ uint64_t PABotBase::issue_request(
824
794
//
825
795
826
796
while (true ){
827
- uint64_t seqnum = try_issue_request (cancelled, request, silent_remove);
797
+ uint64_t seqnum = try_issue_request (cancelled, request, silent_remove, do_not_block );
828
798
if (seqnum != 0 ){
829
799
return seqnum;
830
800
}
@@ -843,11 +813,12 @@ uint64_t PABotBase::issue_request(
843
813
}
844
814
uint64_t PABotBase::issue_command (
845
815
const Cancellable* cancelled,
846
- const BotBaseRequest& request, bool silent_remove
816
+ const BotBaseRequest& request,
817
+ bool silent_remove
847
818
){
848
819
auto scope_check = m_sanitizer.check_scope ();
849
820
850
- // Issue a request or a command and return.
821
+ // Issue a command and return.
851
822
//
852
823
// If it cannot be issued (because we're over the limits), this function
853
824
// will wait until it can be issued.
@@ -891,7 +862,7 @@ bool PABotBase::try_issue_request(
891
862
auto scope_check = m_sanitizer.check_scope ();
892
863
893
864
if (!request.is_command ()){
894
- return try_issue_request (cancelled, request, true ) != 0 ;
865
+ return try_issue_request (cancelled, request, true , false ) != 0 ;
895
866
}else {
896
867
return try_issue_command (cancelled, request, true ) != 0 ;
897
868
}
@@ -903,7 +874,7 @@ void PABotBase::issue_request(
903
874
auto scope_check = m_sanitizer.check_scope ();
904
875
905
876
if (!request.is_command ()){
906
- issue_request (cancelled, request, true );
877
+ issue_request (cancelled, request, true , false );
907
878
}else {
908
879
issue_command (cancelled, request, true );
909
880
}
@@ -919,7 +890,7 @@ BotBaseMessage PABotBase::issue_request_and_wait(
919
890
throw InternalProgramError (&m_logger, PA_CURRENT_FUNCTION, " This function only supports requests." );
920
891
}
921
892
922
- uint64_t seqnum = issue_request (cancelled, request, false );
893
+ uint64_t seqnum = issue_request (cancelled, request, false , false );
923
894
return wait_for_request (seqnum, cancelled);
924
895
}
925
896
BotBaseMessage PABotBase::wait_for_request (uint64_t seqnum, const Cancellable* cancelled){
0 commit comments