llworkerthread.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llworkerthread.h
  3.  *
  4.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2004-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #ifndef LL_LLWORKERTHREAD_H
  32. #define LL_LLWORKERTHREAD_H
  33. #include <queue>
  34. #include <string>
  35. #include <map>
  36. #include <set>
  37. #include "llqueuedthread.h"
  38. #include "llapr.h"
  39. #define USE_FRAME_CALLBACK_MANAGER 0
  40. //============================================================================
  41. class LLWorkerClass;
  42. //============================================================================
  43. // Note: ~LLWorkerThread is O(N) N=# of worker threads, assumed to be small
  44. //   It is assumed that LLWorkerThreads are rarely created/destroyed.
  45. class LL_COMMON_API LLWorkerThread : public LLQueuedThread
  46. {
  47. friend class LLWorkerClass;
  48. public:
  49. class WorkRequest : public LLQueuedThread::QueuedRequest
  50. {
  51. protected:
  52. virtual ~WorkRequest(); // use deleteRequest()
  53. public:
  54. WorkRequest(handle_t handle, U32 priority, LLWorkerClass* workerclass, S32 param);
  55. S32 getParam()
  56. {
  57. return mParam;
  58. }
  59. LLWorkerClass* getWorkerClass()
  60. {
  61. return mWorkerClass;
  62. }
  63. /*virtual*/ bool processRequest();
  64. /*virtual*/ void finishRequest(bool completed);
  65. /*virtual*/ void deleteRequest();
  66. private:
  67. LLWorkerClass* mWorkerClass;
  68. S32 mParam;
  69. };
  70. private:
  71. typedef std::list<LLWorkerClass*> delete_list_t;
  72. delete_list_t mDeleteList;
  73. LLMutex* mDeleteMutex;
  74. public:
  75. LLWorkerThread(const std::string& name, bool threaded = true);
  76. ~LLWorkerThread();
  77. /*virtual*/ S32 update(U32 max_time_ms);
  78. handle_t addWorkRequest(LLWorkerClass* workerclass, S32 param, U32 priority = PRIORITY_NORMAL);
  79. S32 getNumDeletes() { return (S32)mDeleteList.size(); } // debug
  80. private:
  81. void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion
  82. };
  83. //============================================================================
  84. // This is a base class which any class with worker functions should derive from.
  85. // Example Usage:
  86. //  LLMyWorkerClass* foo = new LLMyWorkerClass();
  87. //  foo->fetchData(); // calls addWork()
  88. //  while(1) // main loop
  89. //  {
  90. //     if (foo->hasData()) // calls checkWork()
  91. //        foo->processData();
  92. //  }
  93. //
  94. // WorkerClasses only have one set of work functions. If they need to do multiple
  95. //  background tasks, use 'param' to switch amnong them.
  96. // Only one background task can be active at a time (per instance).
  97. //  i.e. don't call addWork() if haveWork() returns true
  98. class LL_COMMON_API LLWorkerClass
  99. {
  100. friend class LLWorkerThread;
  101. friend class LLWorkerThread::WorkRequest;
  102. public:
  103. typedef LLWorkerThread::handle_t handle_t;
  104. enum FLAGS
  105. {
  106. WCF_HAVE_WORK = 0x01,
  107. WCF_WORKING = 0x02,
  108. WCF_WORK_FINISHED = 0x10,
  109. WCF_WORK_ABORTED = 0x20,
  110. WCF_DELETE_REQUESTED = 0x40,
  111. WCF_ABORT_REQUESTED = 0x80
  112. };
  113. public:
  114. LLWorkerClass(LLWorkerThread* workerthread, const std::string& name);
  115. virtual ~LLWorkerClass();
  116. // pure virtual, called from WORKER THREAD, returns TRUE if done
  117. virtual bool doWork(S32 param)=0; // Called from WorkRequest::processRequest()
  118. // virtual, called from finishRequest() after completed or aborted
  119. virtual void finishWork(S32 param, bool completed); // called from finishRequest() (WORK THREAD)
  120. // virtual, returns true if safe to delete the worker
  121. virtual bool deleteOK(); // called from update() (WORK THREAD)
  122. // schedlueDelete(): schedules deletion once aborted or completed
  123. void scheduleDelete();
  124. bool haveWork() { return getFlags(WCF_HAVE_WORK); } // may still be true if aborted
  125. bool isWorking() { return getFlags(WCF_WORKING); }
  126. bool wasAborted() { return getFlags(WCF_ABORT_REQUESTED); }
  127. // setPriority(): changes the priority of a request
  128. void setPriority(U32 priority);
  129. U32  getPriority() { return mRequestPriority; }
  130. const std::string& getName() const { return mWorkerClassName; }
  131. protected:
  132. // called from WORKER THREAD
  133. void setWorking(bool working);
  134. // Call from doWork only to avoid eating up cpu time.
  135. // Returns true if work has been aborted
  136. // yields the current thread and calls mWorkerThread->checkPause()
  137. bool yield();
  138. void setWorkerThread(LLWorkerThread* workerthread);
  139. // addWork(): calls startWork, adds doWork() to queue
  140. void addWork(S32 param, U32 priority = LLWorkerThread::PRIORITY_NORMAL);
  141. // abortWork(): requests that work be aborted
  142. void abortWork(bool autocomplete);
  143. // checkWork(): if doWork is complete or aborted, call endWork() and return true
  144. bool checkWork(bool aborting = false);
  145. private:
  146. void setFlags(U32 flags) { mWorkFlags = mWorkFlags | flags; }
  147. void clearFlags(U32 flags) { mWorkFlags = mWorkFlags & ~flags; }
  148. U32  getFlags() { return mWorkFlags; }
  149. public:
  150. bool getFlags(U32 flags) { return mWorkFlags & flags ? true : false; }
  151. private:
  152. // pure virtuals
  153. virtual void startWork(S32 param)=0; // called from addWork() (MAIN THREAD)
  154. virtual void endWork(S32 param, bool aborted)=0; // called from doWork() (MAIN THREAD)
  155. protected:
  156. LLWorkerThread* mWorkerThread;
  157. std::string mWorkerClassName;
  158. handle_t mRequestHandle;
  159. U32 mRequestPriority; // last priority set
  160. private:
  161. LLMutex mMutex;
  162. LLAtomicU32 mWorkFlags;
  163. };
  164. //============================================================================
  165. #endif // LL_LLWORKERTHREAD_H