diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-06-24 22:59:51 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-06-24 22:59:51 +0000 |
commit | c898b974e7579f4b3a02900b885d418c8127935c (patch) | |
tree | 4b3aad8a1b2387822264a7a4cdee1e7ead270b4e | |
parent | 8afcf15229e1dc9a67b71ef786eacca4e282a163 (diff) | |
parent | 02a2e1387d82bb3899f00f5bdde4a35d6e9282d4 (diff) | |
download | goldfish-android11-dev.tar.gz |
Merge "Replace ::android::Thread with std::thread" into rvc-devandroid11-dev
-rw-r--r-- | audio/Android.bp | 1 | ||||
-rw-r--r-- | audio/io_thread.cpp | 1 | ||||
-rw-r--r-- | audio/io_thread.h | 7 | ||||
-rw-r--r-- | audio/stream_in.cpp | 42 | ||||
-rw-r--r-- | audio/stream_out.cpp | 42 |
5 files changed, 62 insertions, 31 deletions
diff --git a/audio/Android.bp b/audio/Android.bp index 4b80fd73..4905fe57 100644 --- a/audio/Android.bp +++ b/audio/Android.bp @@ -41,6 +41,7 @@ cc_library_shared { "libtinyalsa", "libutils", "libfmq", + "libprocessgroup", ], header_libs: [ "libaudio_system_headers", diff --git a/audio/io_thread.cpp b/audio/io_thread.cpp index 35a4d2ad..81982b36 100644 --- a/audio/io_thread.cpp +++ b/audio/io_thread.cpp @@ -32,7 +32,6 @@ bool IOThread::standby() { } void IOThread::requestExit() { - Thread::requestExit(); notify(EXIT_REQUEST); } diff --git a/audio/io_thread.h b/audio/io_thread.h index 355a29c7..698df499 100644 --- a/audio/io_thread.h +++ b/audio/io_thread.h @@ -15,7 +15,6 @@ */ #pragma once -#include <utils/Thread.h> #include <fmq/EventFlag.h> namespace android { @@ -24,15 +23,15 @@ namespace audio { namespace V6_0 { namespace implementation { -struct IOThread : public ::android::Thread { +struct IOThread { static constexpr uint32_t STAND_BY_REQUEST = 1 << 20; static constexpr uint32_t EXIT_REQUEST = 1 << 21; - IOThread() : Thread(false /*canCallJava*/) {} + virtual ~IOThread() {} virtual EventFlag *getEventFlag() = 0; virtual bool notify(uint32_t mask); virtual bool standby(); - void requestExit() override; + virtual void requestExit(); }; } // namespace implementation diff --git a/audio/stream_in.cpp b/audio/stream_in.cpp index 172617d3..89ca7e60 100644 --- a/audio/stream_in.cpp +++ b/audio/stream_in.cpp @@ -23,6 +23,12 @@ #include "deleters.h" #include "talsa.h" #include "util.h" +#include <sys/resource.h> +#include <pthread.h> +#include <cutils/sched_policy.h> +#include <utils/ThreadDefs.h> +#include <future> +#include <thread> namespace android { namespace hardware { @@ -75,29 +81,39 @@ struct ReadThread : public IOThread { mEfGroup.reset(rawEfGroup); } - status = run("reader", PRIORITY_URGENT_AUDIO); - if (status != OK) { - ALOGE("ReadThread::%s:%d: failed to start the thread: %s", - __func__, __LINE__, strerror(-status)); - } + mThread = std::thread(&ReadThread::threadLoop, this); } ~ReadThread() { - requestExit(); - LOG_ALWAYS_FATAL_IF(join() != OK); + if (mThread.joinable()) { + requestExit(); + mThread.join(); + } } EventFlag *getEventFlag() override { return mEfGroup.get(); } - bool threadLoop() override { - while (!exitPending()) { + bool isRunning() const { + return mThread.joinable(); + } + + std::future<pthread_t> getTid() { + return mTid.get_future(); + } + + void threadLoop() { + setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_AUDIO); + set_sched_policy(0, SP_FOREGROUND); + mTid.set_value(pthread_self()); + + while (true) { uint32_t efState = 0; mEfGroup->wait(MessageQueueFlagBits::NOT_FULL | EXIT_REQUEST | STAND_BY_REQUEST, &efState); if (efState & EXIT_REQUEST) { - return false; + return; } if (efState & STAND_BY_REQUEST) { @@ -122,8 +138,6 @@ struct ReadThread : public IOThread { processCommand(); } } - - return false; // do not restart threadLoop } void processCommand() { @@ -217,6 +231,8 @@ struct ReadThread : public IOThread { std::unique_ptr<uint8_t[]> mBuffer; talsa::PcmPtr mPcm; util::StreamPosition mPos; + std::thread mThread; + std::promise<pthread_t> mTid; }; } // namespace @@ -413,7 +429,7 @@ Return<void> StreamIn::prepareForReading(uint32_t frameSize, *(t->mCommandMQ.getDesc()), *(t->mDataMQ.getDesc()), *(t->mStatusMQ.getDesc()), - {.pid = getpid(), .tid = t->getTid()}); + {.pid = getpid(), .tid = t->getTid().get()}); mReadThread = std::move(t); } else { diff --git a/audio/stream_out.cpp b/audio/stream_out.cpp index 4665efb6..8de19638 100644 --- a/audio/stream_out.cpp +++ b/audio/stream_out.cpp @@ -24,6 +24,12 @@ #include "talsa.h" #include "deleters.h" #include "util.h" +#include <sys/resource.h> +#include <pthread.h> +#include <cutils/sched_policy.h> +#include <utils/ThreadDefs.h> +#include <future> +#include <thread> namespace android { namespace hardware { @@ -78,29 +84,39 @@ struct WriteThread : public IOThread { mEfGroup.reset(rawEfGroup); } - status = run("writer", PRIORITY_URGENT_AUDIO); - if (status != OK) { - ALOGE("WriteThread::%s:%d: failed to start the thread: %s", - __func__, __LINE__, strerror(-status)); - } + mThread = std::thread(&WriteThread::threadLoop, this); } ~WriteThread() { - requestExit(); - LOG_ALWAYS_FATAL_IF(join() != OK); + if (mThread.joinable()) { + requestExit(); + mThread.join(); + } } EventFlag *getEventFlag() override { return mEfGroup.get(); } - bool threadLoop() override { - while (!exitPending()) { + bool isRunning() const { + return mThread.joinable(); + } + + std::future<pthread_t> getTid() { + return mTid.get_future(); + } + + void threadLoop() { + setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_AUDIO); + set_sched_policy(0, SP_FOREGROUND); + mTid.set_value(pthread_self()); + + while (true) { uint32_t efState = 0; mEfGroup->wait(MessageQueueFlagBits::NOT_EMPTY | STAND_BY_REQUEST | EXIT_REQUEST, &efState); if (efState & EXIT_REQUEST) { - return false; + return; } if (efState & STAND_BY_REQUEST) { @@ -125,8 +141,6 @@ struct WriteThread : public IOThread { processCommand(); } } - - return false; // do not restart threadLoop } void processCommand() { @@ -235,6 +249,8 @@ struct WriteThread : public IOThread { std::unique_ptr<uint8_t[]> mBuffer; talsa::PcmPtr mPcm; util::StreamPosition mPos; + std::thread mThread; + std::promise<pthread_t> mTid; }; } // namespace @@ -431,7 +447,7 @@ Return<void> StreamOut::prepareForWriting(uint32_t frameSize, *(t->mCommandMQ.getDesc()), *(t->mDataMQ.getDesc()), *(t->mStatusMQ.getDesc()), - {.pid = getpid(), .tid = t->getTid()}); + {.pid = getpid(), .tid = t->getTid().get()}); mWriteThread = std::move(t); } else { |