Skip to content

Commit e31c024

Browse files
committed
Fix VK_Leak_Check for Android
RemoteServer timedout due to VK_Leak_Check taking too long before sending commands to remote server. Spawning a worker thread to keeping the remote server connection alive fixes the disconnection issue.
1 parent 883ad69 commit e31c024

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

util/test/rdtest/analyse.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ def open_capture(filename="", cap: rd.CaptureFile=None, opts: rd.ReplayOptions=N
5454
raise ValueError("Cannot call analyse.open_capture() with capture handle for remote {}"
5555
.format(util.get_remote_server().remote))
5656

57-
result, controller = util.get_remote_server().remote.OpenCapture(rd.RemoteServer.NoPreference,
58-
filename, opts, None)
57+
result, controller = util.get_remote_server().OpenCapture(rd.RemoteServer.NoPreference,
58+
filename, opts, None)
5959
if result == rd.ResultCode.Succeeded:
6060
api = str(controller.GetAPIProperties().pipelineType)
6161

util/test/rdtest/remoteserver.py

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from pathlib import Path
88
import os
99
import re
10-
10+
import threading
1111
from time import sleep
1212
from abc import ABC, abstractmethod
1313

@@ -82,6 +82,25 @@ def retrieve_latest_server_log(self, dst, timeout):
8282
def retrieve_comms_log(self, timeout):
8383
pass
8484

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
85104

86105
class AndroidRemoteServer(RemoteServer):
87106
# Android app IDs for the server
@@ -184,11 +203,20 @@ def connect(self):
184203
self.remote = remote
185204

186205
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+
187212
return remote
188213

189214
def disconnect(self):
190215
self.remote.ShutdownConnection()
191216
self.remote = None
217+
218+
# wait for thread completion
219+
self.pingThread.join()
192220

193221
def shutdown(self):
194222
# 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):
263291

264292
log.print("Running package:'{}' cmd:'{}' with env:'{}'".format(
265293
package_and_activity, cmdline, envmods))
266-
res = util.get_remote_server().remote.ExecuteAndInject(
294+
res = util.get_remote_server().ExecuteAndInject(
267295
package_and_activity, "", args, envmods, opts)
268296

269297
if res.result != rd.ResultCode.Succeeded:
@@ -319,7 +347,7 @@ def retrieve_latest_server_log(self, dst, timeout=10):
319347
dst = os.path.join(dst, latestlog)
320348
src = os.path.join(src, latestlog)
321349
log.print(f"Copying remote server log from '{src}' to '{dst}'")
322-
self.remote.CopyCaptureFromRemote(src, dst, None)
350+
self.CopyCaptureFromRemote(src, dst, None)
323351

324352
return dst
325353

@@ -336,10 +364,35 @@ def retrieve_comms_log(self, timeout=10):
336364

337365
dst = os.path.join(util.get_tmp_dir(), 'RenderDoc_Server.log')
338366
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)
340368

341369
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+
343396

344397
class LinuxRemoteServer(RemoteServer):
345398
TIMEOUT = 200
@@ -502,3 +555,18 @@ def retrieve_comms_log(self, timeout=10):
502555
log.print('Done')
503556

504557
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)

util/test/rdtest/testcase.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ def run(self):
553553

554554
if self.controller is not None:
555555
if not util.get_remote_server() is None:
556-
util.get_remote_server().remote.CloseCapture(self.controller)
556+
util.get_remote_server().CloseCapture(self.controller)
557557
else:
558558
self.controller.Shutdown()
559559

@@ -814,7 +814,7 @@ def retrieve_capture(self):
814814

815815
dest = util.get_tmp_path(self.capture_filename.split('/')[-1])
816816
log.print("Copying remote capture from '{}' to '{}'".format(self.capture_filename, dest))
817-
util.get_remote_server().remote.CopyCaptureFromRemote(self.capture_filename, dest, None)
817+
util.get_remote_server().CopyCaptureFromRemote(self.capture_filename, dest, None)
818818
return dest
819819

820820
def check_export(self, capture_filename):

0 commit comments

Comments
 (0)