Thread.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * Copyright (c) 2019-2020, Sergey Bugaev <bugaevc@serenityos.org>
  3. * Copyright (c) 2021, Spencer Dixon <spencercdixon@gmail.com>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/DistinctNumeric.h>
  9. #include <AK/Function.h>
  10. #include <AK/Result.h>
  11. #include <AK/String.h>
  12. #include <LibCore/Object.h>
  13. #include <pthread.h>
  14. namespace Threading {
  15. AK_TYPEDEF_DISTINCT_ORDERED_ID(intptr_t, ThreadError);
  16. class Thread final : public Core::Object {
  17. C_OBJECT(Thread);
  18. public:
  19. virtual ~Thread();
  20. void start();
  21. void detach();
  22. template<typename T = void>
  23. Result<T, ThreadError> join();
  24. String thread_name() const { return m_thread_name; }
  25. pthread_t tid() const { return m_tid; }
  26. bool is_started() const { return m_started; }
  27. private:
  28. explicit Thread(Function<intptr_t()> action, StringView thread_name = {});
  29. Function<intptr_t()> m_action;
  30. pthread_t m_tid { 0 };
  31. String m_thread_name;
  32. bool m_detached { false };
  33. bool m_started { false };
  34. };
  35. template<typename T>
  36. Result<T, ThreadError> Thread::join()
  37. {
  38. void* thread_return = nullptr;
  39. int rc = pthread_join(m_tid, &thread_return);
  40. if (rc != 0) {
  41. return ThreadError { rc };
  42. }
  43. m_tid = 0;
  44. if constexpr (IsVoid<T>)
  45. return {};
  46. else
  47. return { static_cast<T>(thread_return) };
  48. }
  49. }