Close `watch print` gracefully with user interrupt
The print functionality of watch command needed to be stopped with a
SIGINT. However, this could lead to some resources (for example the
output file descriptor) not being closed properly.
This CL adds a wrapper around the poll function allowing print command
to wait for the user to press the return key and quit gracefully on user
input.
Bug: 199746421
Test: Tested Manually
Change-Id: I2bb3ffd6b0711f40ecafe3a94c21e756ac2cd4e6
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 4bbfc7b..b9a9755 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -1172,7 +1172,7 @@
status_t handleSetCameraMute(const Vector<String16>& args);
// Handle 'watch' command as passed through 'cmd'
- status_t handleWatchCommand(const Vector<String16> &args, int outFd);
+ status_t handleWatchCommand(const Vector<String16> &args, int inFd, int outFd);
// Enable tag monitoring of the given tags in provided clients
status_t startWatchingTags(const Vector<String16> &args, int outFd);
@@ -1184,19 +1184,12 @@
status_t clearCachedMonitoredTagDumps(int outFd);
// Print events of monitored tags in all cached and attached clients
- status_t printWatchedTags(const Vector<String16> &args, int outFd);
+ status_t printWatchedTags(const Vector<String16> &args, int inFd, int outFd);
// Print events of monitored tags in all attached clients as they are captured. New events are
- // fetched every `refreshMicros` us
- // NOTE: This function does not terminate unless interrupted.
- status_t printWatchedTagsUntilInterrupt(useconds_t refreshMicros, int outFd);
-
- // Print all events in vector `events' that came after lastPrintedEvent
- static void printNewWatchedEvents(int outFd,
- const char *cameraId,
- const String16 &packageName,
- const std::vector<std::string> &events,
- const std::string &lastPrintedEvent);
+ // fetched every `refreshMillis` ms
+ // NOTE: This function does not terminate until user passes '\n' to inFd.
+ status_t printWatchedTagsUntilInterrupt(long refreshMillis, int inFd, int outFd);
// Parses comma separated clients list and adds them to mWatchedClientPackages.
// Does not acquire mLogLock before modifying mWatchedClientPackages. It is the caller's