CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
common_Scheduler.h
1 /*--------------------------------------------------------------------------------*
2  Copyright (C)Nintendo All rights reserved.
3 
4  These coded instructions, statements, and computer programs contain proprietary
5  information of Nintendo and/or its licensed developers and are protected by
6  national and international copyright laws. They may not be disclosed to third
7  parties or copied or duplicated in any form, in whole or in part, without the
8  prior written consent of Nintendo.
9 
10  The content herein is highly confidential and should be handled accordingly.
11  *--------------------------------------------------------------------------------*/
12 
13 
14 #pragma once
15 
16 #include <nn/pia/common/common_Definitions.h>
17 #include <nn/pia/common/common_OffsetList.h>
18 #include <nn/pia/common/common_Time.h>
19 #include <nn/pia/common/common_CriticalSection.h>
20 
21 
22 namespace nn
23 {
24 namespace pia
25 {
26 namespace common
27 {
28 
29 class Time;
30 class Job;
31 class BackgroundScheduler;
32 
33 /*!
34  @brief ジョブのスケジューラです。
35 
36  @details スケジューラは、ジョブのクラスで定義されている処理を非同期に
37  実行するためのオブジェクトです。
38  なお、このクラスはスレッドセーフではありません。
39 
40  */
42 {
43 public:
44 /*!
45  @brief バックグラウンドスケジューラ用スレッドの優先度のデフォルト値です。
46  */
47 #if NN_PIA_CTR
48  static const int32_t DefaultBackgroundThreadPriority = 24;
49 #elif NN_PIA_WIN
50  static const int32_t DefaultBackgroundThreadPriority = THREAD_PRIORITY_BELOW_NORMAL;
51 #elif NN_PIA_CAFE
52  static const int32_t DefaultBackgroundThreadPriority = 24;
53 #elif NN_PIA_NINTENDOSDK
54  static const int32_t DefaultBackgroundThreadPriority = 24;
55 #elif NN_PIA_A
56  //n1849
57  //10 THREAD_PRIORITY_BACKGROUND バックグラウンド処理に最適な優先度です。
58  //0 THREAD_PRIORITY_DEFAULT アプリのスレッドとして標準的な優先度です
59  //-8 THREAD_PRIORITY_URGENT_DISPLAY システムが画面描画やInputDevice情報を処理するための設定値です。非常に優先度が高いため、通常、アプリ開発者は使用しません
60  static const int32_t DefaultBackgroundThreadPriority = 10;
61 #elif NN_PIA_B
62  //todo:n3389:とりあえずな値
63  static const int32_t DefaultBackgroundThreadPriority = 10;
64 #else
65 #error "invalid platform";
66 #endif
67 
68 
69  /*!
70  @brief インスタンスを作成します(シングルトンパターン)。
71 
72  @details このAPIは、 nn::pia::common::BeginSetup() を呼び出してから、
73  nn::pia::common::EndSetup() を呼び出すまでの間に呼び出す必要があります。
74 
75  @param[in] backgroundThreadPriority バックグラウンドスケジューラ用スレッドの優先度です。 Pia の各 API を呼び出すスレッドより低い優先度を指定する必要があります。
76 
77  @return インスタンスの作成に成功すれば、成功の Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
78 
79  @retval ResultAlreadyExists 既にインスタンスは作成されています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
80  @retval ResultNotInitialized commonモジュールが初期化されていません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
81  @retval ResultInvalidState BeginSetup() ~ EndSetup() 間で呼び出されていません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
82  @retval ResultInvalidArgument 引数が間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
83  */
84  static Result CreateInstance(int32_t backgroundThreadPriority = DefaultBackgroundThreadPriority);
85 
86 
87  /*!
88  @brief インスタンスを破棄します(シングルトンパターン)。
89 
90  @details インスタンスが作成されていないときにこの関数が呼び出された場合は、
91  何も実行せずに関数から返ります。
92  */
93  static void DestroyInstance();
94 
95 
96  /*!
97  @brief Scheduler インスタンスへのポインタを取得します(シングルトンパターン)。
98 
99  @return インスタンスが作成されていないときは、 NULL ポインタが返ります。
100  */
102  {
103  return s_pInstance;
104  }
105 
106 
107  /*!
108  @brief ジョブをディスパッチします。
109 
110  @details この関数を呼び出すことでジョブが実行されます。
111  <br>
112  @param[in] timeout ジョブ実行の上限となる、タイムアウト時間を指定します。単位はミリ秒です。
113  ただし、必ずこのタイムアウト時間以下に収まることを保証するものではありません。
114  ゼロを与えると、無制限の時間を指定したと解釈されます。
115  */
116  void Dispatch(uint32_t timeout = 0);
117 
118 
119  /*!
120  @cond PRIVATE
121  @brief ジョブを登録します。
122 
123  @details この関数は Job から呼ばれますので、他から呼び出してはいけません。
124  */
125  void EntryJob(Job* pJob, bool isBackground);
126  //! @endcond
127 
128 
129  /*!
130  @cond PRIVATE
131  @brief 次の Dispatch() まで待機させるジョブを登録します。
132 
133  @details この関数は Job から呼ばれますので、他から呼び出してはいけません。
134  */
135  void EntryJobNext(Job* pJob);
136  //! @endcond
137 
138 
139  /*!
140  @cond PRIVATE
141  @brief ジョブを削除します。
142 
143  @details この関数は Job から呼ばれますので、他から呼び出してはいけません。
144  */
145  void ResetJob(Job* pJob);
146  //! @endcond
147 
148 
149  /*!
150  @cond PRIVATE
151  @brief Dispatch() が呼ばれたタイミングの Time です。
152  */
153  const Time& GetDispatchedTime() const
154  {
155  return m_DispatchedTime;
156  }
157  //! @endcond
158 
159 
160  /*!
161  @cond PRIVATE
162  @brief ジョブ関連の CriticalSection を取得します。
163  */
164  CriticalSection* GetCriticalSection()
165  {
166  return &m_CriticalSection;
167  }
168  //! @endcond
169  /*!
170  @cond PRIVATE
171  @brief 待機中のジョブ数を取得します。
172  */
173  uint32_t GetJobNum() const;
174  //! @endcond
175 
176 
177  /*!
178  @cond PRIVATE
179  @brief モニタリングデータをセットします。
180  */
181  void SetMonitoringData();
182  //! @endcond
183 
184 
185  /*!
186  @brief デバッグに有用な情報をプリントします。
187 
188  @param[in] flag トレースフラグの論理和。詳細は @ref TraceFlag 型を参照してください。
189  */
190  virtual void Trace(uint64_t flag) const;
191 
192 private:
193  /*!
194  @brief スケジューラのコンストラクタです。
195  */
196  explicit Scheduler(int32_t backgroundThreadPriority);
197 
198  /*!
199  @brief スケジューラのデストラクタです。
200  */
201  virtual ~Scheduler();
202 
203 
204  Scheduler(const Scheduler&);
205  Scheduler& operator=(const Scheduler&);
206 
207  // シングルトンインスタンスへのポインタです。
208  static Scheduler* s_pInstance;
209 
210 
211  //! ジョブリスト型
212  typedef OffsetList<Job> JobList;
213 
214  //! ジョブリスト
215  JobList m_JobList;
216  JobList m_CountBasedJobList;
217 
218  //! Dispatch時刻
219  Time m_DispatchedTime;
220 
221  //! Dispatch 呼び出し回数
222  uint32_t m_DispatchCalls;
223 
224  mutable CriticalSection m_CriticalSection;
225 
226  BackgroundScheduler* m_pBackgroundScheduler;
227 };
228 }
229 }
230 } // end of namespace nn::pia::common