CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
common_Trace.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_StringStream.h>
17 #include <nn/pia/common/common_EmptyStream.h>
18 #include <nn/pia/common/common_Time.h>
19 
20 
21 namespace nn
22 {
23 namespace pia
24 {
25 namespace common
26 {
27 
28 #if NN_PIA_ENABLE_TRACE
29 /*!
30 @cond PRIVATE
31 @brief トレース出力をします。
32  */
33 #define PIA_TRACE(FLAG, ...) \
34  \
35 { \
36  ::nn::pia::common::Trace* pNnPiaCommonTrace = ::nn::pia::common::Trace::GetInstance(); \
37  if (pNnPiaCommonTrace) \
38  { \
39  if (pNnPiaCommonTrace->IsFlagSet(FLAG)) \
40  { \
41  pNnPiaCommonTrace->WriteCaption(); \
42  pNnPiaCommonTrace->Write(__VA_ARGS__); \
43  pNnPiaCommonTrace->Write("\n"); \
44  } \
45  } \
46  \
47 }
48 //! @endcond
49 
50 /*!
51 @cond PRIVATE
52 @brief bool値を文字列に変換します。
53  */
54 #define PIA_BOOL_TO_TEXT(VALUE) ((VALUE) ? "true" : "false")
55 //! @endcond
56 
57 /*!
58 @cond PRIVATE
59 @brief 関数名を追加してトレース出力をします。
60  */
61 #if NN_PIA_A
62 #define PIA_TRACE_EX(FLAG, ...) \
63  \
64 { \
65  ::nn::pia::common::Trace* pNnPiaCommonTrace = ::nn::pia::common::Trace::GetInstance(); \
66  if (pNnPiaCommonTrace) \
67  { \
68  if (pNnPiaCommonTrace->IsFlagSet(FLAG)) \
69  { \
70  pNnPiaCommonTrace->WriteCaption(PIA_CODE_POSITION_FILE, PIA_CODE_POSITION_FUNC); \
71  pNnPiaCommonTrace->Write(__VA_ARGS__); \
72  } \
73  } \
74  \
75 }
76 #else
77 #define PIA_TRACE_EX(FLAG, ...) \
78  \
79 { \
80  ::nn::pia::common::Trace* pNnPiaCommonTrace = ::nn::pia::common::Trace::GetInstance(); \
81  if (pNnPiaCommonTrace) \
82  { \
83  if (pNnPiaCommonTrace->IsFlagSet(FLAG)) \
84  { \
85  pNnPiaCommonTrace->WriteCaption(); \
86  pNnPiaCommonTrace->Write("%s %s:", PIA_CODE_POSITION_FILE, PIA_CODE_POSITION_FUNC); \
87  pNnPiaCommonTrace->Write(__VA_ARGS__); \
88  pNnPiaCommonTrace->Write("\n"); \
89  } \
90  } \
91  \
92 }
93 #endif
94 //! @endcond
95 
96 
97 #else // else of NN_PIA_ENABLE_TRACE
98 
99 #define PIA_TRACE(FLAG, ...) (void)(FLAG)
100 #define PIA_BOOL_TO_TEXT(VALUE)
101 #define PIA_TRACE_EX(FLAG, ...) (void)(FLAG)
102 
103 #endif // end of NN_PIA_ENABLE_TRACE
104 
105 //n1589: モジュールごとに8ビット割り当てています。不足が出てきたら調整を検討します。
106 /*!
107  @brief トレースフラグです。
108 
109  @details PIA_TRACE()マクロの第一引数に渡すなどして使用します。
110  */
111 
112 typedef uint64_t TraceFlag;
113 
114 /*!
115  @name トレースフラグ
116  @anchor TraceFlag
117  @{
118 */
119 static const TraceFlag TraceFlagNever = 0ULL; //!< 常に表示されないことを示すフラグです。
120 static const TraceFlag TraceFlagAlways = 1ULL << 0; //!< 常に表示されることを示すフラグです。
121 
122 static const TraceFlag TraceFlagCommon = 1ULL << 1; //!< PiaCommon モジュールのトレースを示すフラグです。
123 static const TraceFlag TraceFlagCommonEvent = 1ULL << 2; //!< PiaCommon モジュールのイベント関係のトレースを示すフラグです。
124 static const TraceFlag TraceFlagCommonJob = 1ULL << 3; //!< PiaCommon モジュールのジョブ関係のトレースを示すフラグです。
125 static const TraceFlag TraceFlagCommonSocket = 1ULL << 4; //!< PiaCommon モジュールのソケット関係のトレースを示すフラグです。
126 static const TraceFlag TraceFlagCommonDetail = 1ULL << 5; //!< PiaCommon モジュールの詳細トレースを示すフラグです。
127 
128 static const TraceFlag TraceFlagLocal = 1ULL << 7; //!< PiaLocal モジュールのトレースを示すフラグです。
129 static const TraceFlag TraceFlagLocalTransport = 1ULL << 8; //!< PiaLocal モジュールの送受信処理関係のトレースを示すフラグです。
130 static const TraceFlag TraceFlagLocalMigration = 1ULL << 9; //!< PiaLocal モジュールのホストマイグレーション機能関係のトレースを示すフラグです。
131 
132 static const TraceFlag TraceFlagInet = 1ULL << 11; //!< PiaInet モジュールのトレースを示すフラグです。
133 static const TraceFlag TraceFlagInetInit = 1ULL << 12; //!< PiaInet モジュールの初期化、終了処理関係のトレースを示すフラグです。
134 static const TraceFlag TraceFlagInetStream = 1ULL << 13; //!< PiaInet モジュールの送受信処理関係のトレースを示すフラグです。
135 static const TraceFlag TraceFlagInetRelayStream = 1ULL << 14; //!< PiaInet モジュールのサーバーリレー送受信処理関係のトレースを示すフラグです。
136 static const TraceFlag TraceFlagInetReport = 1ULL << 15; //!< PiaInet モジュールのレポート処理関係のトレースを示すフラグです。
137 
138 static const TraceFlag TraceFlagInetNat = 1ULL << 16; //!< PiaInet モジュールの NAT トラバーサル処理のトレースを示すフラグです
139 static const TraceFlag TraceFlagInetNatDetail = 1ULL << 17; //!< PiaInet モジュールの NAT トラバーサル処理の詳細トレースを示すフラグです。
140 static const TraceFlag TraceFlagInetNatProbe = 1ULL << 18; //!< PiaInet モジュールの NAT トラバーサル処理のプルーブ関連のトレースを示すフラグです。
141 
142 static const TraceFlag TraceFlagTransport = 1ULL << 19; //!< PiaTransport モジュールのトレースを示すフラグです。
143 static const TraceFlag TraceFlagTransportInit = 1ULL << 20; //!< PiaTransport モジュールの初期化処理、終了処理関係のトレースを示すフラグです。
144 static const TraceFlag TraceFlagTransportKeepAlive = 1ULL << 21; //!< PiaTransport モジュールのキープアライブ関係のトレースを示すフラグです。
145 static const TraceFlag TraceFlagTransportRtt = 1ULL << 22; //!< PiaTransport モジュールのRTTプロトコル関係のトレースを示すフラグです。
146 static const TraceFlag TraceFlagTransportBuffer = 1ULL << 23; //!< PiaTransport モジュールのバッファ関係のトレースを示すフラグです。
147 static const TraceFlag TraceFlagTransportPacketSend = 1ULL << 24; //!< PiaTransport モジュールにおける Packet 送信に関係するトレースフラグです。
148 static const TraceFlag TraceFlagTransportPacketReceive = 1ULL << 25; //!< PiaTransport モジュールにおける Packet 受信に関係するトレースフラグです。
149 static const TraceFlag TraceFlagTransportProtocolmessageSend = 1ULL << 26; //!< PiaTransport モジュールにおける ProtocolMessage 送信に関係するトレースフラグです。
150 static const TraceFlag TraceFlagTransportProtocolmessageReceive = 1ULL << 27; //!< PiaTransport モジュールにおける ProtocolMessage 受信に関係するトレースフラグです。
151 static const TraceFlag TraceFlagTransportRelay = 1ULL << 28; //!< PiaTransport モジュールのリレー機能のトレースを示すフラグです。
152 static const TraceFlag TraceFlagTransportRelayDetail = 1ULL << 29; //!< PiaTransport モジュールのリレー機能の詳細のトレースを示すフラグです。
153 
154 static const TraceFlag TraceFlagSession = 1ULL << 30; //!< PiaSession モジュールのトレースを示すフラグです。
155 static const TraceFlag TraceFlagSessionConnect = 1ULL << 31; //!< PiaSession モジュールの接続処理関係のトレースを示すフラグです。
156 static const TraceFlag TraceFlagSessionLeave = 1ULL << 32; //!< PiaSession モジュールの切断処理関係のトレースを示すフラグです。
157 static const TraceFlag TraceFlagSessionUpdate = 1ULL << 33; //!< PiaSession モジュールの更新処理関係のトレースを示すフラグです。
158 static const TraceFlag TraceFlagSessionMigration = 1ULL << 34; //!< PiaSession モジュールのホストマイグレーション処理関係のトレースを示すフラグです。
159 static const TraceFlag TraceFlagSessionDetail = 1ULL << 35; //!< PiaSession モジュールの詳細トレースを示すフラグです。
160 static const TraceFlag TraceFlagSessionInit = 1ULL << 36; //!< PiaSession モジュールの初期化、終了処理に関係するトレースを示すフラグです。
161 static const TraceFlag TraceFlagSessionJoint = 1ULL << 37; //!< PiaSession モジュールのジョイントセッション処理関係のトレースを示すフラグです。
162 static const TraceFlag TraceFlagSessionClock = 1ULL << 38; //!< PiaSession モジュールの同期クロック関係のトレースを示すフラグです。
163 
164 static const TraceFlag TraceFlagSync = 1ULL << 39; //!< PiaSync モジュールのトレースを示すフラグです。
165 
166 static const TraceFlag TraceFlagClone = 1ULL << 41; //!< PiaClone モジュールのトレースを示すフラグです。
167 static const TraceFlag TraceFlagCloneDetail = 1ULL << 42; //!< PiaClone モジュールの詳細トレースを示すフラグです。
168 
169 static const TraceFlag TraceFlagReckoning = 1ULL << 43; //!< PiaReckoning モジュールのトレースを示すフラグです。
170 
171 static const TraceFlag TraceFlagChat = 1ULL << 45; //!< PiaChat モジュールのトレースを示すフラグです。
172 static const TraceFlag TraceFlagChatDetail = 1ULL << 46; //!< PiaChat モジュールの詳細トレースを示すフラグです。
173 
174 static const TraceFlag TraceFlagService = 1ULL << 49; //!< PiaService モジュールのトレースを示すフラグです。
175 static const TraceFlag TraceFlagServiceTransport = 1ULL << 50; //!< PiaService モジュールのトレースを示すフラグです。
176 static const TraceFlag TraceFlagServiceTransportDetail = 1ULL << 51; //!< PiaService モジュールのトレースを示すフラグです。
177 static const TraceFlag TraceFlagServiceRelayServer = 1ULL << 52; //!< PiaService モジュールのトレースを示すフラグです。
178 static const TraceFlag TraceFlagServiceMonitoringServer = 1ULL << 53; //!< PiaService モジュールのトレースを示すフラグです。
179 
180 static const TraceFlag TraceFlagBrain = 1ULL << 54; //!< PiaBrain モジュールのトレースを示すフラグです。
181 static const TraceFlag TraceFlagBrainDetail = 1ULL << 55; //!< PiaBrain モジュールのトレースを示すフラグです。
182 static const TraceFlag TraceFlagBrainBehaviorExecution = 1ULL << 56; //!< PiaBrain モジュールのトレースを示すフラグです。
183 
184 static const TraceFlag TraceFlagFramework = 1ULL << 58; //!< PiaFramework モジュールのトレースを示すフラグです。
185 
186 static const TraceFlag TraceFlagLan = 1ULL << 60; //!< PiaLan モジュールのトレースを示すフラグです。
187 static const TraceFlag TraceFlagLanDetail = 1ULL << 61; //!< PiaLan モジュールの詳細トレースを示すフラグです。
188 
189 static const TraceFlag TraceFlagPlugin = 1ULL << 62; //!< PiaPlugin のトレースを示すフラグです。
190 
191 static const TraceFlag TraceFlagDirect = 1ULL << 63; //!< PiaDirect のトレースを示すフラグです。
192 
193 static const TraceFlag TraceFlagAll = TraceFlagAlways; //!< 全てのトレースで表示されることを示すフラグです。
194 
195 static const TraceFlag TraceFlagDefault = TraceFlagAlways; //!< TraceFlag のデフォルト値です。
196 
197 /*!
198  end of name トレースフラグ
199  @}
200  */
201 
202 
203 /*!
204  @brief トレースのクラスです。
205 
206  @details Releaseビルドでは、トレースのコードは無効化されます。
207  <br>
208  */
210 {
211 public:
212  /*!
213  @brief Trace クラスのインスタンスを作成します(シングルトンパターン)。
214 
215  @details この API は、 nn::pia::common::BeginSetup() を呼び出してから、
216  nn::pia::common::EndSetup() を呼び出すまでの間に呼び出す必要があります。
217 
218  @return インスタンスの作成に成功すれば、成功の Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
219 
220  @retval ResultAlreadyExists 既にインスタンスは作成されています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
221  @retval ResultNotInitialized common モジュールが初期化されていません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
222  @retval ResultInvalidState BeginSetup() ~ EndSetup() 間で呼び出されていません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
223  */
224  static Result CreateInstance(void);
225 
226 
227  /*!
228  @brief Trace クラスのインスタンスを破棄します(シングルトンパターン)。
229 
230  @details Trace クラスのインスタンスを破棄します。インスタンスが作成されて
231  いない状態の時にこのAPIを呼び出した場合は、何も起こらずに返ります。
232  */
233  static void DestroyInstance(void);
234 
235 
236  /*!
237  @brief Trace クラスのインスタンスを得ます(シングルトンパターン)
238 
239  @details 事前に @ref CreateInstance でインスタンスを作成していなかった場合は、
240  NULLポインタが返されます。
241 
242  @return Trace インスタンスへのポインタ。
243  */
244  static Trace* GetInstance(void)
245  {
246  return s_pInstance;
247  }
248 
249  //n1589:IsFlagSetチェックのコードを最短化
250  /*!
251  @cond PRIVATE
252  */
253  static bool IsFlagSetStatic(uint64_t flag)
254  {
255 #if NN_PIA_ENABLE_TRACE
256  if (Trace::GetInstance() == NULL)
257  {
258  return false;
259  }
260 
261  return Trace::GetInstance()->IsFlagSet(flag);
262 #else
263  NN_PIA_UNUSED(flag);
264  return false;
265 #endif
266  }
267  //! @endcond
268 
269  /*!
270  @cond PRIVATE
271  @brief 文字列を出力します。
272  マクロから呼び出されるので直接呼んではいけません。
273  */
274  void Write(const char* pFmt, ...);
275  //! @endcond
276 
277 
278  /*!
279  @cond PRIVATE
280  @brief キャプション文字列を出力します。
281  マクロから呼び出されるので直接呼んではいけません。
282  */
283  void WriteCaption();
284  //! @endcond
285 
286  /*!
287  @cond PRIVATE
288  @brief キャプション文字列とファイル名、関数名を出力します。
289  マクロから呼び出されるので直接呼んではいけません。
290  */
291  void WriteCaption(const char* pFile, const char* pFunction);
292  //! @endcond
293 
294  /*!
295  @brief トレースフラグをアクティブに設定します。
296 
297  @details このメソッドを使用して、追加のトレースフラグをアクティブに設定します。
298  <br>
299  @param[in] flags アクティブにする @ref TraceFlag の論理和です。
300  */
301  void SetFlag(uint64_t flags)
302  {
303  m_flags |= flags;
304  }
305 
306  /*!
307  @brief 指定したトレースフラグを非アクティブに設定します。
308 
309  @details 指定したトレースフラグを非アクティブに設定します。
310  ただし、 TraceFlagAlways は除きます。
311 
312  @param[in] flags 非アクティブにする @ref TraceFlag の論理和です。
313  */
314  void ClearFlag(uint64_t flags)
315  {
316  m_flags = m_flags & (~flags);
317  }
318 
319  /*!
320  @brief 特定のフラグが設定されているかどうかを返します。
321 
322  @details なお、 IsFlasSet ( TraceFlagNever ) の結果は true となります。
323  引数で複数のフラグを指定した際は、指定したフラグのいずれかが設定されていれば
324  true が返されます。
325  <br>
326  @return 特定のフラグが設定されていれば true 、そうでなければ false を返します。
327 
328  @param[in] flag 問い合わせるトレースフラグ。
329  */
330  bool IsFlagSet(uint64_t flag) const
331  {
332 #if NN_PIA_ENABLE_TRACE
333  return (m_flags & flag) != 0;
334 #else
335  NN_PIA_UNUSED(flag);
336  return false;
337 #endif
338  }
339 
340  /*!
341  @brief TraceFlagAlways を除き、トレースフラグを全てクリアします。
342  */
343  void ClearFlag(void)
344  {
345  m_flags = TraceFlagDefault;
346  }
347 
348 
349  /*!
350  @brief 時刻表示の ON / OFF を切り替えます。
351  ON の時は "[Pia:12345] ..." のように基準時刻からの経過時間をミリ秒単位で表示します。
352  @param[in] isPrint true なら時刻を表示します。
353  */
354  void SetPrintTime(bool isPrint)
355  {
356  m_IsPrintTime = isPrint;
357  }
358 
359 
360  /*!
361  @brief 時刻表示の ON / OFF を取得します。
362  @return 時刻表示が ON になっていれば true を返します。
363  */
364  bool IsPrintTime() const
365  {
366  return m_IsPrintTime;
367  }
368 
369 
370  /*!
371  @brief 時刻表示の基準時刻を現在の時刻にします。
372  */
374  {
375  m_BaseTime.SetNow();
376  }
377 
378 private:
379  /*!
380  @brief コンストラクタです。フラグは TraceFlagAlways のみセットされます。
381  */
382  Trace();
383 
384  /*!
385  @brief デストラクタです。
386  */
387  ~Trace(void)
388  {
389  }
390 
391 
392  uint64_t m_flags;
393  Time m_BaseTime;
394  bool m_IsPrintTime;
395 
396  static Trace* s_pInstance;
397 
398  NN_PIA_DISALLOW_COPY(Trace);
399 };
400 }
401 }
402 } // end of namespace nn::pia::common