7
7
from pathlib import Path
8
8
import os
9
9
import re
10
-
10
+ import threading
11
11
from time import sleep
12
12
from abc import ABC , abstractmethod
13
13
@@ -82,6 +82,25 @@ def retrieve_latest_server_log(self, dst, timeout):
82
82
def retrieve_comms_log (self , timeout ):
83
83
pass
84
84
85
+ @abstractmethod
86
+ def Ping (self ):
87
+ pass
88
+
89
+ @abstractmethod
90
+ def OpenCapture (self ):
91
+ pass
92
+
93
+ @abstractmethod
94
+ def CloseCapture (self , controller ):
95
+ pass
96
+
97
+ @abstractmethod
98
+ def ExecuteAndInject (self ):
99
+ pass
100
+
101
+ @abstractmethod
102
+ def CopyCaptureFromRemote (self , src , dst , progress_callback ):
103
+ pass
85
104
86
105
class AndroidRemoteServer (RemoteServer ):
87
106
# Android app IDs for the server
@@ -184,11 +203,20 @@ def connect(self):
184
203
self .remote = remote
185
204
186
205
log .print ("Connected!" )
206
+
207
+ # spawn a thread to keep connection alive
208
+ self .mutex = threading .Lock ()
209
+ self .pingThread = threading .Thread (target = self .PingThread )
210
+ self .pingThread .start ()
211
+
187
212
return remote
188
213
189
214
def disconnect (self ):
190
215
self .remote .ShutdownConnection ()
191
216
self .remote = None
217
+
218
+ # wait for thread completion
219
+ self .pingThread .join ()
192
220
193
221
def shutdown (self ):
194
222
# If we running over ADB, close down the server. This will involve first establishing a
@@ -263,7 +291,7 @@ def inject_and_run_exe(self, cmdline, envmods, opts):
263
291
264
292
log .print ("Running package:'{}' cmd:'{}' with env:'{}'" .format (
265
293
package_and_activity , cmdline , envmods ))
266
- res = util .get_remote_server ().remote . ExecuteAndInject (
294
+ res = util .get_remote_server ().ExecuteAndInject (
267
295
package_and_activity , "" , args , envmods , opts )
268
296
269
297
if res .result != rd .ResultCode .Succeeded :
@@ -319,7 +347,7 @@ def retrieve_latest_server_log(self, dst, timeout=10):
319
347
dst = os .path .join (dst , latestlog )
320
348
src = os .path .join (src , latestlog )
321
349
log .print (f"Copying remote server log from '{ src } ' to '{ dst } '" )
322
- self .remote . CopyCaptureFromRemote (src , dst , None )
350
+ self .CopyCaptureFromRemote (src , dst , None )
323
351
324
352
return dst
325
353
@@ -336,10 +364,35 @@ def retrieve_comms_log(self, timeout=10):
336
364
337
365
dst = os .path .join (util .get_tmp_dir (), 'RenderDoc_Server.log' )
338
366
log .print ("Copying remote server comms log from '{}' to '{}'" .format (src , dst ))
339
- self .remote . CopyCaptureFromRemote (src , dst , None )
367
+ self .CopyCaptureFromRemote (src , dst , None )
340
368
341
369
return dst
342
-
370
+
371
+ def PingThread (self ):
372
+ while self .remote is not None :
373
+ self .Ping ()
374
+ sleep (0.175 )
375
+
376
+ def Ping (self ):
377
+ with self .mutex :
378
+ return self .remote .Ping ()
379
+
380
+ def OpenCapture (self , proxyid , logfile , replayOptions , progressCallback ):
381
+ with self .mutex :
382
+ return self .remote .OpenCapture (proxyid , logfile , replayOptions , progressCallback )
383
+
384
+ def CloseCapture (self , controller ):
385
+ with self .mutex :
386
+ return self .remote .CloseCapture (controller )
387
+
388
+ def ExecuteAndInject (self , app , workingDir , cmdLine , env , captureOptions ):
389
+ with self .mutex :
390
+ return self .remote .ExecuteAndInject (app , workingDir , cmdLine , env , captureOptions )
391
+
392
+ def CopyCaptureFromRemote (self , src , dst , progressCallback ):
393
+ with self .mutex :
394
+ return self .remote .CopyCaptureFromRemote (src , dst , progressCallback )
395
+
343
396
344
397
class LinuxRemoteServer (RemoteServer ):
345
398
TIMEOUT = 200
@@ -502,3 +555,18 @@ def retrieve_comms_log(self, timeout=10):
502
555
log .print ('Done' )
503
556
504
557
return dst
558
+
559
+ def Ping (self ):
560
+ return self .remote .Ping ()
561
+
562
+ def OpenCapture (self , proxyid , logfile , replayOptions , progressCallback ):
563
+ return self .remote .OpenCapture (proxyid , logfile , replayOptions , progressCallback )
564
+
565
+ def CloseCapture (self , controller ):
566
+ return self .remote .CloseCapture (controller )
567
+
568
+ def ExecuteAndInject (self , app , workingDir , cmdLine , env , captureOptions ):
569
+ return self .remote .ExecuteAndInject (app , workingDir , cmdLine , env , captureOptions )
570
+
571
+ def CopyCaptureFromRemote (self , src , dst , progressCallback ):
572
+ return self .remote .CopyCaptureFromRemote (src , dst , progressCallback )
0 commit comments