Merge "LegacySupport: include interface name in errors"
diff --git a/base/TaskRunner.cpp b/base/TaskRunner.cpp
index 2f7d89c..33117e7 100644
--- a/base/TaskRunner.cpp
+++ b/base/TaskRunner.cpp
@@ -19,30 +19,31 @@
namespace android {
namespace hardware {
+namespace details {
TaskRunner::TaskRunner() {
- bool *running = mRunning = new bool();
- SynchronizedQueue<std::function<void(void)>> *q
- = mQueue = new SynchronizedQueue<std::function<void(void)>>();
- mThread = new std::thread([running, q] {
- *running = true;
- while (*running) {
- (q->wait_pop())();
- }
- delete q;
- delete running;
- });
-}
-TaskRunner::~TaskRunner() {
- bool *running = mRunning;
- std::thread *t = mThread;
- mThread->detach();
- mQueue->push([running, t] {
- *running = false;
- delete t;
- });
}
+void TaskRunner::start(size_t limit) {
+ mQueue = std::make_shared<SynchronizedQueue<Task>>(limit);
+
+ // Allow the thread to continue running in background;
+ // TaskRunner do not care about the std::thread object.
+ std::thread{[q = mQueue] {
+ Task nextTask;
+ while (!!(nextTask = q->wait_pop())) {
+ nextTask();
+ }
+ }}.detach();
+}
+
+TaskRunner::~TaskRunner() {
+ if (mQueue) {
+ mQueue->push(nullptr);
+ }
+}
+
+} // namespace details
} // namespace hardware
} // namespace android
diff --git a/base/include/hidl/SynchronizedQueue.h b/base/include/hidl/SynchronizedQueue.h
index 80123ba..efb04e0 100644
--- a/base/include/hidl/SynchronizedQueue.h
+++ b/base/include/hidl/SynchronizedQueue.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef ANDROID_SYNCHRONIZED_QUEUE_H
-#define ANDROID_SYNCHRONIZED_QUEUE_H
+#ifndef ANDROID_HIDL_SYNCHRONIZED_QUEUE_H
+#define ANDROID_HIDL_SYNCHRONIZED_QUEUE_H
#include <condition_variable>
#include <mutex>
@@ -24,10 +24,12 @@
namespace android {
namespace hardware {
+namespace details {
/* Threadsafe queue.
*/
template <typename T>
struct SynchronizedQueue {
+ SynchronizedQueue(size_t limit);
/* Gets an item from the front of the queue.
*
@@ -43,19 +45,18 @@
*/
size_t size();
- /* Sets the limit to the queue. Will fail
- * the push operation if the limit is reached.
- */
- void setLimit(size_t limit);
-
private:
std::condition_variable mCondition;
std::mutex mMutex;
std::queue<T> mQueue;
- size_t mQueueLimit = SIZE_MAX;
+ const size_t mQueueLimit;
};
template <typename T>
+SynchronizedQueue<T>::SynchronizedQueue(size_t limit) : mQueueLimit(limit) {
+}
+
+template <typename T>
T SynchronizedQueue<T>::wait_pop() {
std::unique_lock<std::mutex> lock(mMutex);
@@ -93,14 +94,8 @@
return mQueue.size();
}
-template <typename T>
-void SynchronizedQueue<T>::setLimit(size_t limit) {
- std::unique_lock<std::mutex> lock(mMutex);
-
- mQueueLimit = limit;
-}
-
+} // namespace details
} // namespace hardware
} // namespace android
-#endif
+#endif // ANDROID_HIDL_SYNCHRONIZED_QUEUE_H
diff --git a/base/include/hidl/TaskRunner.h b/base/include/hidl/TaskRunner.h
index bc9087f..8ecceca 100644
--- a/base/include/hidl/TaskRunner.h
+++ b/base/include/hidl/TaskRunner.h
@@ -13,56 +13,55 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#ifndef ANDROID_TASK_RUNNER_H
-#define ANDROID_TASK_RUNNER_H
+#ifndef ANDROID_HIDL_TASK_RUNNER_H
+#define ANDROID_HIDL_TASK_RUNNER_H
#include "SynchronizedQueue.h"
+#include <memory>
#include <thread>
namespace android {
namespace hardware {
+namespace details {
/*
* A background infinite loop that runs the Tasks push()'ed.
- * Just a simple single-threaded thread pool.
+ * Equivalent to a simple single-threaded Looper.
*/
class TaskRunner {
public:
+ using Task = std::function<void(void)>;
- /* Kicks off the loop immediately. */
+ /* Create an empty task runner. Nothing will be done until start() is called. */
TaskRunner();
/*
- * Detaches the background thread and return immediately.
- * Tasks in the queue will continue to be done sequentially, and _after_
- * all tasks are done, the background thread releases the resources
- * (the queue, the std::thread object, etc.)
+ * Notify the background thread to terminate and return immediately.
+ * Tasks in the queue will continue to be done sequentially in background
+ * until all tasks are finished.
*/
~TaskRunner();
/*
- * Add a task. Return true if successful, false if
- * the queue's size exceeds limit.
+ * Sets the queue limit. Fails the push operation once the limit is reached.
+ * Then kicks off the loop.
*/
- inline bool push(const std::function<void(void)> &t) {
- return this->mQueue->push(t);
- }
+ void start(size_t limit);
/*
- * Sets the queue limit. Fails the push operation once the limit is reached.
+ * Add a task. Return true if successful, false if
+ * the queue's size exceeds limit or t doesn't contain a callable target.
*/
- inline void setLimit(size_t limit) {
- this->mQueue->setLimit(limit);
+ inline bool push(const Task &t) {
+ return (mQueue != nullptr) && (!!t) && this->mQueue->push(t);
}
-private:
- // resources managed by the background thread.
- bool *mRunning;
- SynchronizedQueue<std::function<void(void)>> *mQueue;
- std::thread *mThread;
+private:
+ std::shared_ptr<SynchronizedQueue<Task>> mQueue;
};
+} // namespace details
} // namespace hardware
} // namespace android
-#endif // ANDROID_TASK_RUNNER_H
+#endif // ANDROID_HIDL_TASK_RUNNER_H
diff --git a/test_main.cpp b/test_main.cpp
index 7ff8ae3..7859156 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -255,8 +255,9 @@
}
TEST_F(LibHidlTest, TaskRunnerTest) {
- using android::hardware::TaskRunner;
+ using android::hardware::details::TaskRunner;
TaskRunner tr;
+ tr.start(1 /* limit */);
bool flag = false;
tr.push([&] {
usleep(1000);
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index d425591..cc31d9e 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -123,6 +123,7 @@
LOG(WARNING) << "Could not registerReference for "
<< interfaceName << "/" << instanceName
<< ": " << ret.description();
+ return;
}
LOG(VERBOSE) << "Successfully registerReference for "
<< interfaceName << "/" << instanceName;
diff --git a/transport/manager/1.0/IServiceManager.hal b/transport/manager/1.0/IServiceManager.hal
index 77cf253..9e1c2fc 100644
--- a/transport/manager/1.0/IServiceManager.hal
+++ b/transport/manager/1.0/IServiceManager.hal
@@ -113,11 +113,19 @@
generates (bool success);
/**
+ * Special values for InstanceDebugInfo pids.
+ */
+ enum PidConstant : int32_t {
+ NO_PID = -1,
+ };
+
+ /**
* Returned object for debugDump().
*/
struct InstanceDebugInfo {
string interfaceName;
string instanceName;
+ int32_t pid; // PidConstants:NO_PID if unavailable
vec<int32_t> clientPids;
Architecture arch;
};