LocThread.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /* Copyright (c) 2015, 2020 The Linux Foundation. All rights reserved.
  2. *
  3. * Redistribution and use in source and binary forms, with or without
  4. * modification, are permitted provided that the following conditions are
  5. * met:
  6. * * Redistributions of source code must retain the above copyright
  7. * notice, this list of conditions and the following disclaimer.
  8. * * Redistributions in binary form must reproduce the above
  9. * copyright notice, this list of conditions and the following
  10. * disclaimer in the documentation and/or other materials provided
  11. * with the distribution.
  12. * * Neither the name of The Linux Foundation, nor the names of its
  13. * contributors may be used to endorse or promote products derived
  14. * from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
  17. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
  19. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
  20. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  21. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  22. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  23. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  24. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  25. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  26. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. *
  28. */
  29. #include <sys/prctl.h>
  30. #include <LocThread.h>
  31. #include <string.h>
  32. #include <string>
  33. #include <thread>
  34. #include <loc_pla.h>
  35. using std::weak_ptr;
  36. using std::shared_ptr;
  37. using std::thread;
  38. using std::string;
  39. namespace loc_util {
  40. class LocThreadDelegate {
  41. static const char defaultThreadName[];
  42. weak_ptr<LocRunnable> mRunnable;
  43. thread mThread;
  44. LocThreadDelegate(const string tName, shared_ptr<LocRunnable> r);
  45. public:
  46. ~LocThreadDelegate() {
  47. shared_ptr<LocRunnable> runnable = mRunnable.lock();
  48. if (nullptr != runnable) {
  49. runnable->interrupt();
  50. }
  51. }
  52. inline static LocThreadDelegate* create(const char* tName, shared_ptr<LocRunnable> runnable);
  53. };
  54. const char LocThreadDelegate::defaultThreadName[] = "LocThread";
  55. LocThreadDelegate* LocThreadDelegate::create(const char* tName, shared_ptr<LocRunnable> runnable) {
  56. LocThreadDelegate* threadDelegate = nullptr;
  57. if (nullptr != runnable) {
  58. if (!tName) {
  59. tName = defaultThreadName;
  60. }
  61. char lname[16];
  62. auto nameSize = strlen(tName) + 1;
  63. int len = std::min(sizeof(lname), nameSize) - 1;
  64. memcpy(lname, tName, len);
  65. lname[len] = 0;
  66. threadDelegate = new LocThreadDelegate(lname, runnable);
  67. }
  68. return threadDelegate;
  69. }
  70. LocThreadDelegate::LocThreadDelegate(const string tName, shared_ptr<LocRunnable> runnable) :
  71. mRunnable(runnable),
  72. mThread([tName, runnable] {
  73. prctl(PR_SET_NAME, tName.c_str(), 0, 0, 0);
  74. runnable->prerun();
  75. while (runnable->run());
  76. runnable->postrun();
  77. }) {
  78. mThread.detach();
  79. }
  80. bool LocThread::start(const char* tName, shared_ptr<LocRunnable> runnable) {
  81. bool success = false;
  82. if (!mThread) {
  83. mThread = LocThreadDelegate::create(tName, runnable);
  84. // true only if thread is created successfully
  85. success = (NULL != mThread);
  86. }
  87. return success;
  88. }
  89. void LocThread::stop() {
  90. if (nullptr != mThread) {
  91. delete mThread;
  92. mThread = nullptr;
  93. }
  94. }
  95. } // loc_util