Port server core to Android
* Android libutils locks and threads
* Add Android.mk for building with AOSP
* Add logger sink for Android
* Regenerate Android.mk when CMake is run
diff --git a/common/os/Thread.cxx b/common/os/Thread.cxx
index 2b08dbf..f3e5b73 100644
--- a/common/os/Thread.cxx
+++ b/common/os/Thread.cxx
@@ -18,6 +18,9 @@
#ifdef WIN32
#include <windows.h>
+#elif defined(__ANDROID__)
+#include <functional>
+#include <utils/Thread.h>
#else
#include <pthread.h>
#include <signal.h>
@@ -31,12 +34,33 @@
using namespace os;
+#if defined(__ANDROID__)
+namespace os {
+class AndroidThread : public ::android::Thread {
+public:
+ AndroidThread(std::function<void()> worker) : mWorker(worker) {}
+
+ virtual bool threadLoop() {
+ try {
+ mWorker();
+ } catch(...) {
+ }
+ return false;
+ }
+private:
+ std::function<void()> mWorker;
+};
+};
+#endif
+
Thread::Thread() : running(false), threadId(NULL)
{
mutex = new Mutex;
#ifdef WIN32
threadId = new HANDLE;
+#elif defined(__ANDROID__)
+ threadId = new AndroidThread(std::bind(&Thread::worker, this));
#else
threadId = new pthread_t;
#endif
@@ -46,6 +70,9 @@
{
#ifdef WIN32
delete (HANDLE*)threadId;
+#elif defined(__ANDROID__)
+ ((AndroidThread*)threadId)->requestExit();
+ delete (::android::Thread*)threadId;
#else
if (isRunning())
pthread_cancel(*(pthread_t*)threadId);
@@ -63,6 +90,8 @@
*(HANDLE*)threadId = CreateThread(NULL, 0, startRoutine, this, 0, NULL);
if (*(HANDLE*)threadId == NULL)
throw rdr::SystemException("Failed to create thread", GetLastError());
+#elif defined(__ANDROID__)
+ ((AndroidThread*)threadId)->run(NULL);
#else
int ret;
sigset_t all, old;
@@ -96,6 +125,12 @@
ret = WaitForSingleObject(*(HANDLE*)threadId, INFINITE);
if (ret != WAIT_OBJECT_0)
throw rdr::SystemException("Failed to join thread", GetLastError());
+#elif defined(__ANDROID__)
+ ::android::status_t ret;
+
+ ret = ((AndroidThread*)threadId)->join();
+ if (ret != ::android::NO_ERROR)
+ throw rdr::SystemException("Failed to join thread", ret);
#else
int ret;
@@ -107,9 +142,13 @@
bool Thread::isRunning()
{
+#if defined(__ANDROID__)
+ return ((::android::Thread*)threadId)->isRunning();
+#else
AutoMutex a(mutex);
return running;
+#endif
}
size_t Thread::getSystemCPUCount()