From ed176504388ccb2345a023e707de3aa9b7e0fb1e Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 21 Sep 2018 13:40:16 -0700 Subject: [PATCH 1/2] adb: fix test_device.FileOperationsTest.test_push_empty. It was doing a test with `[ -d foo`, without the closing square bracket. Test: python -m unittest test_device.FileOperationsTest.test_push_empty Change-Id: I996b98850cf916986ef969768a7235547fcc404a --- adb/test_device.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/adb/test_device.py b/adb/test_device.py index 9f451150f..c3166ffe1 100755 --- a/adb/test_device.py +++ b/adb/test_device.py @@ -751,7 +751,7 @@ class FileOperationsTest(DeviceTest): shutil.rmtree(host_dir) def test_push_empty(self): - """Push a directory containing an empty directory to the device.""" + """Push an empty directory to the device.""" self.device.shell(['rm', '-rf', self.DEVICE_TEMP_DIR]) self.device.shell(['mkdir', self.DEVICE_TEMP_DIR]) @@ -767,9 +767,10 @@ class FileOperationsTest(DeviceTest): self.device.push(empty_dir_path, self.DEVICE_TEMP_DIR) - test_empty_cmd = ['[', '-d', - os.path.join(self.DEVICE_TEMP_DIR, 'empty')] + remote_path = os.path.join(self.DEVICE_TEMP_DIR, "empty") + test_empty_cmd = ["[", "-d", remote_path, "]"] rc, _, _ = self.device.shell_nocheck(test_empty_cmd) + self.assertEqual(rc, 0) self.device.shell(['rm', '-rf', self.DEVICE_TEMP_DIR]) finally: From 2f6c2fa935cc3025b207d27e27bdb7c9c59794ba Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Thu, 20 Sep 2018 17:38:55 -0700 Subject: [PATCH 2/2] adb: add fdevent_release. Implement a version of fdevent_destroy that returns the file descriptor previously owned by the fdevent, instead of closing it. Bug: http://b/74616284 Test: treehugger Change-Id: I6a14ac96e6b8c801bc71bfcc9094851c158510ae --- adb/fdevent.cpp | 18 ++++++++++++++---- adb/fdevent.h | 7 ++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/adb/fdevent.cpp b/adb/fdevent.cpp index dee87bdf3..98a73eb0e 100644 --- a/adb/fdevent.cpp +++ b/adb/fdevent.cpp @@ -147,24 +147,34 @@ fdevent* fdevent_create(int fd, fd_func func, void* arg) { return fde; } -void fdevent_destroy(fdevent* fde) { +unique_fd fdevent_release(fdevent* fde) { check_main_thread(); - if (fde == nullptr) return; + if (!fde) { + return {}; + } + if (!(fde->state & FDE_CREATED)) { LOG(FATAL) << "destroying fde not created by fdevent_create(): " << dump_fde(fde); } + unique_fd result = std::move(fde->fd); if (fde->state & FDE_ACTIVE) { - g_poll_node_map.erase(fde->fd.get()); + g_poll_node_map.erase(result.get()); + if (fde->state & FDE_PENDING) { g_pending_list.remove(fde); } - fde->fd.reset(); fde->state = 0; fde->events = 0; } delete fde; + return result; +} + +void fdevent_destroy(fdevent* fde) { + // Release, and then let unique_fd's destructor cleanup. + fdevent_release(fde); } static void fdevent_update(fdevent* fde, unsigned events) { diff --git a/adb/fdevent.h b/adb/fdevent.h index d501b8660..df2339a97 100644 --- a/adb/fdevent.h +++ b/adb/fdevent.h @@ -50,11 +50,12 @@ struct fdevent { */ fdevent *fdevent_create(int fd, fd_func func, void *arg); -/* Uninitialize and deallocate an fdevent object that was -** created by fdevent_create() -*/ +// Deallocate an fdevent object that was created by fdevent_create. void fdevent_destroy(fdevent *fde); +// fdevent_destroy, except releasing the file descriptor previously owned by the fdevent. +unique_fd fdevent_release(fdevent* fde); + /* Change which events should cause notifications */ void fdevent_set(fdevent *fde, unsigned events);