CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
clone_AtomicSharingClone.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/clone/clone_Definitions.h>
17 #include <nn/pia/clone/clone_SharingClone.h>
18 
19 namespace nn
20 {
21 namespace pia
22 {
23 namespace clone
24 {
25 
26 
27 /*!
28  @brief 排他的に送信権を制御して双方向の送受信を行う CloneBase 派生クラスです。
29  */
31 {
32 public:
33  /*!
34  @brief デフォルトコンストラクタです。
35  */
37 
38 
39  /*!
40  @brief デストラクタです。
41  */
42  virtual ~AtomicSharingClone();
43 
44 
45  /*!
46  @brief 送信権の取得を試みます。
47  @details @ref LockStatus_Unlocked の時に呼び出すと、 @ref LockStatus_TryLock に遷移します。
48  その後送信権の取得に成功したら、 @ref LockStatus_Locked に遷移します。
49  他のステーションが送信権を持っていて送信権の取得に失敗したら、 @ref LockStatus_Unlocked に戻ります。
50  @ref LockStatus_TryLock, @ref LockStatus_Locked の時に呼び出しても何も起こりません。
51  @return 成功すれば、IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
52  @retval ResultInvalidState 動作中ではありません。(IsActive() が false です。)プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
53  */
54  Result TryLock();
55 
56 
57  /*!
58  @brief 送信権を放棄します。
59  @details @ref LockStatus_Locked の時に呼び出すと、 @ref LockStatus_Unlocked に遷移して、他のステーションが送信権を取得できるようになります。
60  @ref LockStatus_TryLock の時に呼び出すと、送信権の取得を中断して @ref LockStatus_Unlocked に遷移します。
61  @ref LockStatus_Unlocked の時に呼び出しても何も起こりません。
62  @return 成功すれば、IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
63  @retval ResultInvalidState 動作中ではありません。(IsActive() が false です。)プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
64  */
65  Result Unlock();
66 
67 
68  /*!
69  @brief 送信権の保持状態を表します。
70  */
72  {
73  LockStatus_Unlocked = 0x10, //!< 送信権を持っていません。
74  LockStatus_TryLock = 0x20, //!< 送信権を取得しようとしています。
75  LockStatus_Locked = 0x30 //!< 送信権を持っています。
76  };
77 
78 
79  /*!
80  @brief 送信権の保持状態を取得します。
81  @return 送信権の保持状態です。
82  */
84  {
85  return static_cast<LockStatus>(m_LockStatus & cLockStatusMask);
86  }
87 
88 
89  /*!
90  @brief デバッグに有用な情報をプリントします。
91 
92  @param[in] flag トレースフラグの論理和。詳細は @ref TraceFlag 型を参照してください。
93  */
94  virtual void Trace(uint64_t flag) const;
95 
96 
97  //! @cond PRIVATE
98 
99 protected:
100  virtual void OnStartup();
101  virtual void OnCleanup();
102  virtual void OnEnd();
103 
104  virtual void OnExit(StationIndex stationIndex);
105  virtual void OnDisconnect(StationIndex stationIndex, bool isValid);
106 
107  virtual void OnAddParticipant(StationIndex stationIndex);
108 
109 public:
110  virtual void ReceiveReject(StationIndex src, ClockValue clock);
111  virtual void ReceiveStop(StationIndex src);
112 
113  enum LockResult
114  {
115  LockResult_Ok,
116  LockResult_Ng,
117  LockResult_Defer
118  };
119 
120  LockResult ReceiveTryLock(StationIndex src, ClockValue clock, uint32_t participantBitmap);
121  void ReceiveLockOK(StationIndex src, ClockValue clock, uint8_t count, uint32_t participantBitmap);
122  void ReceiveLockNG(StationIndex src, ClockValue clock);
123 
124 public:
125  static Type GetTypeStatic()
126  {
127  return Type_Atomic;
128  }
129  static Key ToKey(Id id)
130  {
131  return CloneBase::ToKey(Type_Atomic, StationIndex_Invalid, id);
132  }
133  virtual Type GetTypeVirtual() const
134  {
135  return GetTypeStatic();
136  }
137 
138 public:
139  class LockCommandToken : public ClockCommandToken
140  {
141  public:
142  explicit LockCommandToken(AtomicSharingClone* pClone)
143  : ClockCommandToken(pClone), m_DestBitmap(0)
144  {
145  }
146  virtual CommandType GetType() const
147  {
148  return CommandType_Lock;
149  }
150  virtual uint32_t GetDestStationBitmap() const
151  {
152  return m_DestBitmap;
153  }
154  void SetDestBitmap(uint32_t destBitmap)
155  {
156  PIA_TRACE_EX(common::TraceFlagClone, "called LockCommandToken key:0x%016llx state:%d dest:0x%08x -> 0x%08x", GetClone() != NULL ? GetClone()->GetKey() : 0, GetClone() != NULL ? GetClone()->GetState() : 0, m_DestBitmap, destBitmap);
157  m_DestBitmap = destBitmap;
158  }
159  void Exit(StationIndex stationIndex)
160  {
161  PIA_TRACE_EX(common::TraceFlagClone, "called LockCommandToken key:0x%016llx state:%d dest:0x%08x -> 0x%08x", GetClone() != NULL ? GetClone()->GetKey() : 0, GetClone() != NULL ? GetClone()->GetState() : 0, m_DestBitmap, m_DestBitmap & ~(0x1 << stationIndex));
162  m_DestBitmap &= ~(0x1 << stationIndex);
163  }
164  virtual ClockValue GetClock() const
165  {
166  return static_cast<const AtomicSharingClone*>(GetClone())->m_LockClock;
167  }
168 
169  private:
170  ClockValue m_DestBitmap;
171  };
172 
173  virtual bool IsReadyToSetValue() const;
174 
175 private:
176  enum InnerLockStatus
177  {
178  InnerLockStatus_Unlocked = LockStatus_Unlocked | 0x1,
179  InnerLockStatus_KeepLock = LockStatus_Unlocked | 0x2,
180  InnerLockStatus_TryLock = LockStatus_TryLock | 0x1,
181  InnerLockStatus_Locked = LockStatus_Locked | 0x1
182  };
183 
184  enum
185  {
186  cLockStatusMask = 0xf0
187  };
188 
189  InnerLockStatus m_LockStatus;
190  ClockValue m_LockClock;
191  ClockValue m_UnlockClock;
192 
193  LockCommandToken m_LockCommandToken;
194 
195 public:
196  template <int TEST_ID, typename Arg>
197  static void Test(const AtomicSharingClone& obj, Arg* pArg = NULL);
198 
199  NN_PIA_DISALLOW_COPY(AtomicSharingClone);
200  //! @endcond
201 };
202 }
203 }
204 } // end of namespace nn::pia::clone