You.i Engine
YiSignalBase.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_SIGNAL_BASE_H_
3 #define _YI_SIGNAL_BASE_H_
4 
9 
10 #include <list>
11 
24 {
25  friend class CYISignalHandler;
26 
27 public:
30 
39  virtual bool IsConnected() const override;
40 
61  virtual bool IsConnected(const CYISignalBase &rSignal) const override;
62 
71  bool IsConnected(const CYISignalHandler &rSignalHandler) const;
72 
80  bool IsConnected(const CYISignalConnectionID &connectionID) const;
81 
94  void Disconnect(CYISignalHandler &rSignalHandler);
95 
102  void Disconnect(const CYISignalConnectionID &connectionID);
103 
113  void Disconnect(CYISignalBase &rSignal);
114 
115 protected:
117  {
118  SignalObjects();
119 
124 
129 
134 
138  std::list<std::unique_ptr<CYISignalAbstractConnection>> m_connectionList;
139 
144  std::list<std::unique_ptr<CYISignalAbstractConnection>>::const_iterator m_currentConnectionIt;
145 
146 #ifdef YI_DEBUG
147 
150  bool m_bEmitting;
151 #endif
152  };
153 
154  CYISignalBase();
155  CYISignalBase(const CYISignalBase &rSignal);
156  virtual ~CYISignalBase();
157  CYISignalBase &operator=(const CYISignalBase &rSignal);
158 
168  void RemoveConnection(CYISignalHandler &rSignalHandler, YI_NOTIFY_FLAG notifyHandler);
169 
176  void RemoveAllConnections(YI_NOTIFY_FLAG notifyHandler);
177 
183  void RegisterToSignalHandler(const CYISignalHandler &rSignalHandler);
184 
190  void UnregisterFromSignalHandler(CYISignalHandler &rSignalHandler);
191 
201  void ExclusiveLock(CYIRecursiveMutex &signalMutex) const;
202 
212  void ExclusiveLock(const CYISignalHandler &rSignalHandler, CYIRecursiveMutex &signalMutex) const;
213 
219  void ExclusiveUnlock(CYIRecursiveMutex &signalMutex) const;
220 
226  void ExclusiveUnlock(const CYISignalHandler &rSignalHandler, CYIRecursiveMutex &rSignalMutex) const;
227 
233  bool HasConnection(const CYISignalHandler &rSignalHandler) const;
234 
242  template<class YI_SIGNAL_EMIT_EVENT>
243  void EmitAsync(const CYISignalAbstractConnection *pConnection, YI_CONNECTION_TYPE connectionType, std::unique_ptr<YI_SIGNAL_EMIT_EVENT> pEvent, const std::shared_ptr<CYIEventDispatcher> &pDispatcher);
244 
246 
247 private:
248  void DisconnectFromAllSlots();
249  void UnblockAsyncBlock();
250  std::list<std::unique_ptr<CYISignalAbstractConnection>>::const_iterator FindConnection(const CYISignalConnectionID &connectionID) const;
251  void CloneConnections(const CYISignalHandler &rSourceSignalHandler, CYISignalHandler &rDestinationSignalHandler);
252  void CopySignal(const CYISignalBase &rSignal);
253  void CloneConnectionAndConnect(const CYISignalAbstractConnection *pConnection);
254 };
255 
260 template<class YI_SIGNAL_EMIT_EVENT>
261 void CYISignalBase::EmitAsync(const CYISignalAbstractConnection *pConnection, YI_CONNECTION_TYPE connectionType, std::unique_ptr<YI_SIGNAL_EMIT_EVENT> pEvent, const std::shared_ptr<CYIEventDispatcher> &pDispatcher)
262 {
263  pEvent->Signal.CloneConnectionAndConnect(pConnection);
264  if (connectionType == YI_CONNECTION_ASYNC_BLOCK)
265  {
266  SignalObjects *pSignalObjects = m_signalObjects.Get();
267  pSignalObjects->m_asyncBlockMutex.Lock();
268  pEvent->Signal.Connect(*this, &CYISignalBase::UnblockAsyncBlock, YI_CONNECTION_SYNC);
269  pDispatcher->PostEvent(std::move(pEvent), pDispatcher->GetSignalEmitEventHandler());
270  pSignalObjects->m_asyncBlockCondition.Wait(pSignalObjects->m_asyncBlockMutex);
271  pSignalObjects->m_asyncBlockMutex.Unlock();
272  }
273  else
274  {
275  pDispatcher->PostEvent(std::move(pEvent), pDispatcher->GetSignalEmitEventHandler());
276  }
277 }
278 
279 #endif /* _YI_SIGNAL_BASE_H_ */
virtual bool IsConnected() const override
void RegisterToSignalHandler(const CYISignalHandler &rSignalHandler)
CYIWaitCondition m_asyncBlockCondition
Definition: YiSignalBase.h:133
void ExclusiveLock(CYIRecursiveMutex &signalMutex) const
CYILazy< SignalObjects > m_signalObjects
Definition: YiSignalBase.h:245
Definition: YiMutex.h:110
bool Unlock()
virtual ~CYISignalBase()
Definition: YiSignalAbstractConnection.h:38
Definition: YiRecursiveMutex.h:15
CYIRecursiveMutex m_signalMutex
Definition: YiSignalBase.h:123
void Disconnect(CYISignalHandler &rSignalHandler)
CYILazy is a thread-safe lazy initializer of a class. The instance pointer remains null until CYILazy...
Definition: YiLazy.h:48
The base abstract class for CYISignal.
Definition: YiSignalBase.h:23
An object used to identify a specific CYISignal connection.
Definition: YiSignalConnectionID.h:14
bool Lock()
The base abstract class for signal connections.
Definition: YiSignalAbstractConnection.h:69
Definition: YiSignalAbstractConnection.h:61
std::list< std::unique_ptr< CYISignalAbstractConnection > > m_connectionList
Definition: YiSignalBase.h:138
void Disconnect(CYISignalBase &rSignal)
void UnregisterFromSignalHandler(CYISignalHandler &rSignalHandler)
CYIMutex m_asyncBlockMutex
Definition: YiSignalBase.h:128
void ExclusiveUnlock(CYIRecursiveMutex &signalMutex) const
void RemoveAllConnections(YI_NOTIFY_FLAG notifyHandler)
Definition: YiSignalHandler.h:174
CYISignalBase & operator=(const CYISignalBase &rSignal)
std::list< std::unique_ptr< CYISignalAbstractConnection > >::const_iterator m_currentConnectionIt
Definition: YiSignalBase.h:144
virtual bool IsConnected() const
void EmitAsync(const CYISignalAbstractConnection *pConnection, YI_CONNECTION_TYPE connectionType, std::unique_ptr< YI_SIGNAL_EMIT_EVENT > pEvent, const std::shared_ptr< CYIEventDispatcher > &pDispatcher)
Definition: YiSignalBase.h:261
YI_CONNECTION_TYPE
Definition: YiSignalAbstractConnection.h:18
bool Wait(CYIMutex &rMutex)
A class used to block a thread until a condition is met, as signaled by a different thread...
Definition: YiWaitCondition.h:64
bool HasConnection(const CYISignalHandler &rSignalHandler) const
Definition: YiSignalBase.h:116
void RemoveConnection(CYISignalHandler &rSignalHandler, YI_NOTIFY_FLAG notifyHandler)