Thread.h 1.1 KB

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