Thread.cpp.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  *  OpenKore C++ Standard Library
  3.  *  Copyright (C) 2006  VCL
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Lesser General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Lesser General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Lesser General Public
  16.  *  License along with this library; if not, write to the Free Software
  17.  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18.  *  MA  02110-1301  USA
  19.  */
  20. #include "Thread.h"
  21. #ifdef WIN32
  22. #define WIN32_LEAN_AND_MEAN
  23. #include <windows.h>
  24. #else
  25. #include <pthread.h>
  26. #endif
  27. namespace OSL {
  28. ThreadException::ThreadException(const char *msg, int code)
  29. : Exception(msg, code)
  30. {
  31. }
  32. namespace {
  33. /**
  34. * An interface which implements an operating-specific thread.
  35. */
  36. class ThreadImplementation: public Object {
  37. public:
  38. virtual ~ThreadImplementation() {}
  39. /**
  40. * Start a new thread which runs <tt>runnable</tt>.
  41. * This function may only be called once.
  42. *
  43. * If the thread was successfully started, then the reference count
  44. * will be incremented by 1.
  45. *
  46. * @param detached  Whether to start the thread in detached mode.
  47. * @param runnableShouldBeFreed   Whether <tt>runnable</tt> should be freed
  48. *                  after the thread has exited, but only if <tt>detached</tt>
  49. *                  is set to true.
  50. * @require runnable != NULL
  51. * @throws ThreadException  If the thread cannot be started.
  52. */
  53. virtual void start(Runnable *runnable, bool detached,
  54. bool runnableShouldBeFreed) throw(ThreadException) = 0;
  55. /**
  56. * Join this thread. This function may only be called once.
  57. *
  58. * @require  start() has been called before.
  59. */
  60. virtual void join() = 0;
  61. };
  62. #ifdef WIN32
  63. #include "Win32/Thread.cpp"
  64. #else
  65. #include "Unix/Thread.cpp"
  66. #endif
  67. }
  68. Thread::Thread(bool detached) {
  69. runnable = NULL;
  70. init(detached);
  71. }
  72. Thread::Thread(Runnable *runnable, bool detached) {
  73. this->runnable = runnable;
  74. init(detached);
  75. }
  76. Thread::~Thread() {
  77. if (runnable != NULL && !detached) {
  78. delete runnable;
  79. }
  80. static_cast<ThreadImplementation *>(impl)->unref();
  81. }
  82. void
  83. Thread::init(bool detached) {
  84. this->detached = detached;
  85. #ifdef WIN32
  86. impl = new Win32Thread();
  87. #else
  88. impl = new PosixThread();
  89. #endif
  90. }
  91. void
  92. Thread::start() throw(ThreadException) {
  93. if (runnable != NULL) {
  94. static_cast<ThreadImplementation *>(impl)->start(runnable, detached, true);
  95. } else {
  96. static_cast<ThreadImplementation *>(impl)->start(this, detached, false);
  97. }
  98. }
  99. void
  100. Thread::interrupt() {
  101. }
  102. void
  103. Thread::join() {
  104. static_cast<ThreadImplementation *>(impl)->join();
  105. }
  106. void
  107. Thread::run() {
  108. // Default implementation does nothing.
  109. }
  110. }