OpendTect  6.6
monitoredobject.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Bert
8  Date: April 2016
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "notify.h"
14 #include "ptrman.h"
15 #include "refcount.h"
16 
17 
77 {
78 public:
79 
80  class ChangeData;
81 
82 
84  typedef int ChangeType;
85  typedef od_int64 IDType;
87 
89  virtual ~MonitoredObject();
90  MonitoredObject& operator =(const MonitoredObject&);
91  bool operator ==(const MonitoredObject&) const;
92  virtual MonitoredObject* clone() const { return getClone(); }
93 
95  { return mSelf().chgnotif_; }
97  { return mSelf().delnotif_; }
100 
101  virtual void touch() const { dirtycount_++; }
102  virtual DirtyCountType dirtyCount() const { return dirtycount_; }
103  virtual ChangeType compareWith(const MonitoredObject&) const;
104 
106  { return ChangeData::cEntireObjectChgType(); }
107  static inline ChangeType cNoChange()
108  { return ChangeData::cNoChgType(); }
110  { return ChangeData::cUnspecChgID(); }
112  { return ChangeData::cUnspecChgID(); }
113 
114  mExpClass(Basic) ChangeData : public std::pair<ChangeType,IDType>
115  {
116  public:
117 
118  class AuxData;
119 
120  ChangeData( ChangeType typ, IDType id, AuxData* data=0 )
121  : std::pair<ChangeType,IDType>(typ,id)
122  , auxdata_(data) {}
124  virtual ~ChangeData() {}
125  ChangeData& operator =(const ChangeData&);
126 
127  ChangeType changeType() const { return first; }
128  IDType ID() const { return second; }
129  bool isEntireObject() const { return first == -1; }
130  bool isNoChange() const { return mIsUdf(first); }
131  bool hasUnspecID() const { return second == -1; }
132  bool includes( ChangeType ct ) const
133  { return ct == first || isEntireObject(); }
134 
135  static inline ChangeType cEntireObjectChgType() { return -1; }
136  static inline ChangeType cNoChgType() { return 0; }
137  static inline IDType cUnspecChgID() { return -1; }
138  static inline ChangeData AllChanged() { return ChangeData(-1,-1); }
139  static inline ChangeData NoChange() { return ChangeData(0,-1); }
140 
141  mExpClass(Basic) AuxData : public RefCount::Referenced
142  {
143  protected:
144  virtual ~AuxData() {}
145  };
146 
148  template<class T> inline
149  const T* auxDataAs() const
150  { return static_cast<const T*>( auxdata_.ptr() ); }
151  template<class T> inline
153  { return static_cast<T*>( auxdata_.ptr() ); }
154  };
156  void sendChangeNotification(const ChangeData&) const;
159  const CallBacker* onlyfor=0) const;
160 
162  {
163  public:
164 
165  AccessLocker(const MonitoredObject&,bool forread=true);
167  AccessLocker& operator =(const AccessLocker&);
169 
170  bool isLocked() const;
171  void unlockNow();
172  void reLock(Locker::WaitType wt=Locker::WaitIfLocked);
174 
175  static void enableLocking(bool yn);
177 
178  Locker* theLock() { return thelock_; }
179 
180  protected:
181 
182  Locker* thelock_ = nullptr;
183 
184  };
185 
186 protected:
187 
189  virtual MonitoredObject* getClone() const = 0;
190 
192 
193  void copyAll(const MonitoredObject&);
194  void sendChgNotif(AccessLocker&,const ChangeData&) const;
198  void sendDelNotif() const;
200  { chgnotifblocklevel_++; }
202 
203  template <class T>
204  inline T getMemberSimple(const T&) const;
205  template <class TMember,class TSetTo>
206  inline void setMemberSimple(TMember&,TSetTo,ChangeType,IDType);
207 
208 private:
209 
212 
215  mutable bool delalreadytriggered_;
216 
217  friend class MonitorLock;
218  friend class ChangeNotifyBlocker;
219 
221 
222 };
223 
224 
225 #define mGetMonitoredChgData(cb,chgdata) \
226  mCBCapsuleUnpack( MonitoredObject::ChangeData, chgdata, cb )
227 
228 #define mGetMonitoredChgDataWithAux(cb,chgdata,T,auxvar) \
229  mCBCapsuleUnpack( MonitoredObject::ChangeData, chgdata, cb ); \
230  T* auxvar = chgdata.auxDataAs<T>()
231 
232 #define mGetMonitoredChgDataWithCaller(cb,chgdata,caller) \
233  mCBCapsuleUnpackWithCaller( MonitoredObject::ChangeData, chgdata, caller, cb )
234 
235 #define mGetMonitoredChgDataWithAuxAndCaller(cb,chgdata,T,auxvar,caller) \
236  mGetMonitoredChgDataWithCaller(cb,chgdata,caller); \
237  T* auxvar = chgdata.auxDataAs<T>()
238 
239 #define mGetMonitoredChgDataDoAll(cb,chgdata,doallact) \
240  mGetMonitoredChgData(chgdata,cb); \
241  if ( chgdata.changeType() == Monitored::cEntireObjectChange() ) \
242  { doallact; }
243 
244 #define mGetIDFromChgData( typ, var, chgdata ) \
245  const typ var = typ::get( (typ::IDType)chgdata.ID() )
246 
247 
275 {
276 public:
279 
280  void unlockNow();
281  void reLock();
282 
283 protected:
284 
286  bool unlocked_;
287 
288 };
289 
290 
300 {
301 public:
303  bool send_notif=true);
305 
306  void unBlockNow();
307  void reBlock();
308 
309 protected:
310 
314 
315 };
316 
317 
318 
338 template <class Mon> inline
340  const Mon* newptr, CallBacker* only_for )
341 {
342  const Mon* curptr = ref.ptr();
343  if ( curptr == newptr )
344  return false;
345 
347  if ( (newptr && !curptr) || (!newptr && curptr) )
349  else if ( curptr && newptr )
350  {
351  ct = curptr->compareWith( *newptr );
352  curptr->transferNotifsTo( *newptr, only_for );
353  }
354 
355  ref = newptr;
356  return ct;
357 }
358 
359 template <class Mon> inline
361  const Mon& newref, CallBacker* only_for )
362 {
363  return replaceMonitoredRef( ref, &newref, only_for );
364 }
365 
366 template <class Mon> inline
368  ConstRefMan<Mon>& newref, CallBacker* only_for )
369 {
370  return replaceMonitoredRef( ref, newref.ptr(), only_for );
371 }
372 
373 template <class Mon> inline
375  CallBacker* only_for )
376 {
377  return replaceMonitoredRef( (ConstRefMan<Mon>&)ref, (const Mon*)newptr,
378  only_for );
379 }
380 
381 template <class Mon> inline
383  CallBacker* only_for )
384 {
385  return replaceMonitoredRef( ref, &newref, only_for );
386 }
387 
388 template <class Mon> inline
390  CallBacker* only_for )
391 {
392  return replaceMonitoredRef( ref, newref.ptr(), only_for );
393 }
ConstRefMan
Definition: ptrman.h:233
MonitoredObject::Locker
Threads ::Locker Locker
Definition: monitoredobject.h:80
MonitoredObject::AccessLocker::AccessLocker
AccessLocker(const MonitoredObject &, bool forread=true)
MonitoredObject::ChangeData::ID
IDType ID() const
Definition: monitoredobject.h:128
MonitoredObject::sendEntireObjectChangeNotification
void sendEntireObjectChangeNotification() const
MonitorLock::locker_
MonitoredObject::AccessLocker locker_
Definition: monitoredobject.h:285
MonitoredObject::chgnotifblocklevel_
Threads::Atomic< int > chgnotifblocklevel_
Definition: monitoredobject.h:211
mDeclInstanceCreatedNotifierAccess
#define mDeclInstanceCreatedNotifierAccess(clss)
Definition: notify.h:248
mUseType
#define mUseType(scope, typ)
Definition: commondefs.h:146
MonitoredObject::objectToBeDeleted
virtual Notifier< MonitoredObject > & objectToBeDeleted() const
Definition: monitoredobject.h:96
MonitoredObject::sendChgNotif
void sendChgNotif(AccessLocker &, const ChangeData &) const
calls objectChanged with released lock
MonitoredObject::AccessLocker::convertToWrite
bool convertToWrite()
notify.h
MonitoredObject::IDType
int64_t IDType
Definition: monitoredobject.h:85
mIsUdf
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:289
od_int64
#define od_int64
Definition: plftypes.h:35
ChangeNotifyBlocker::reBlock
void reBlock()
MonitorLock::MonitorLock
MonitorLock(const MonitoredObject &)
MonitorLock
protects a MonitoredObject against change.
Definition: monitoredobject.h:275
mExpClass
#define mExpClass(module)
Definition: commondefs.h:177
MonitoredObject::~MonitoredObject
virtual ~MonitoredObject()
ChangeNotifyBlocker
prevents change notifications coming out of a MonitoredObject.
Definition: monitoredobject.h:300
MonitoredObject::AccessLocker::unlockNow
void unlockNow()
MonitoredObject::stopChangeNotifications
void stopChangeNotifications() const
Definition: monitoredobject.h:199
ChangeNotifyBlocker::obj_
const MonitoredObject & obj_
Definition: monitoredobject.h:311
MonitoredObject::ChangeData::isEntireObject
bool isEntireObject() const
Definition: monitoredobject.h:129
MonitorLock::reLock
void reLock()
MonitoredObject::AccessLocker::reLock
void reLock(Locker::WaitType wt=Locker::WaitIfLocked)
CallBacker
Inherit from this class to be able to send and/or receive CallBacks.
Definition: callback.h:185
MonitoredObject::dirtyCount
virtual DirtyCountType dirtyCount() const
Definition: monitoredobject.h:102
operator==
bool operator==(const ArrayNDInfo &a1, const ArrayNDInfo &a2)
Definition: arrayndinfo.h:81
MonitorLock::unlockNow
void unlockNow()
MonitoredObject::MonitoredObject
MonitoredObject(const MonitoredObject &)
MonitoredObject::ChangeType
int ChangeType
Definition: monitoredobject.h:84
MonitoredObject::delalreadytriggered_
bool delalreadytriggered_
Definition: monitoredobject.h:215
MonitoredObject::ChangeData::cUnspecChgID
static IDType cUnspecChgID()
Definition: monitoredobject.h:137
MonitoredObject::getClone
virtual MonitoredObject * getClone() const =0
MonitoredObject::ChangeData::isNoChange
bool isNoChange() const
Definition: monitoredobject.h:130
MonitoredObject::cUnspecChgID
static IDType cUnspecChgID()
Definition: monitoredobject.h:109
ChangeNotifyBlocker::~ChangeNotifyBlocker
~ChangeNotifyBlocker()
MonitoredObject::cNoChange
static ChangeType cNoChange()
Definition: monitoredobject.h:107
MonitoredObject::ChangeData::auxDataAs
const T * auxDataAs() const
Definition: monitoredobject.h:149
MonitoredObject::ChangeData::changeType
ChangeType changeType() const
Definition: monitoredobject.h:127
MonitoredObject::ChangeData::ChangeData
ChangeData(ChangeType typ, IDType id, AuxData *data=0)
Definition: monitoredobject.h:120
ptrman.h
MonitoredObject::chgnotif_
ChangeDataNotifier chgnotif_
Definition: monitoredobject.h:213
MonitoredObject::clone
virtual MonitoredObject * clone() const
Definition: monitoredobject.h:92
MonitoredObject::dirtycount_
DirtyCounter dirtycount_
Definition: monitoredobject.h:210
MonitoredObject::objectChanged
virtual ChangeDataNotifier & objectChanged() const
Definition: monitoredobject.h:94
MonitoredObject::compareWith
virtual ChangeType compareWith(const MonitoredObject &) const
NonConstPtrManBase::ptr
const T * ptr() const
Definition: ptrman.h:100
Notifier< MonitoredObject >
MonitoredObject::ChangeData::cNoChgType
static ChangeType cNoChgType()
Definition: monitoredobject.h:136
MonitoredObject::compareClassData
ChangeType compareClassData(const MonitoredObject &) const
ChangeNotifyBlocker::unBlockNow
void unBlockNow()
ChangeNotifyBlocker::ChangeNotifyBlocker
ChangeNotifyBlocker(const MonitoredObject &, bool send_notif=true)
MonitoredObject::changeNotificationTypeOf
static ChangeType changeNotificationTypeOf(CallBacker *)
MonitorLock::~MonitorLock
~MonitorLock()
MonitoredObject::AccessLocker::enableLocking
static void enableLocking(bool yn)
don't use unless you understand the implications
MonitoredObject::ChangeData::cEntireObjectChgType
static ChangeType cEntireObjectChgType()
Definition: monitoredobject.h:135
MonitoredObject::cEntireObjectChgID
static IDType cEntireObjectChgID()
Definition: monitoredobject.h:111
MonitoredObject::copyAll
void copyAll(const MonitoredObject &)
MonitorLock::unlocked_
bool unlocked_
Definition: monitoredobject.h:286
MonitoredObject::ChangeData::auxdata_
RefMan< AuxData > auxdata_
Definition: monitoredobject.h:147
MonitoredObject::AccessLocker
Definition: monitoredobject.h:162
MonitoredObject::AccessLocker::theLock
Locker * theLock()
Definition: monitoredobject.h:178
MonitoredObject::ChangeData::~ChangeData
virtual ~ChangeData()
Definition: monitoredobject.h:124
replaceMonitoredRef
MonitoredObject::ChangeType replaceMonitoredRef(ConstRefMan< Mon > &ref, const Mon *newptr, CallBacker *only_for)
replaces a ref to a MonitoredObject with a new one.
Definition: monitoredobject.h:339
MonitoredObject::ChangeData::includes
bool includes(ChangeType ct) const
Definition: monitoredobject.h:132
MonitoredObject::ChangeData::AuxData::~AuxData
virtual ~AuxData()
Definition: monitoredobject.h:144
MonitoredObject::ChangeData::ChangeData
ChangeData(const ChangeData &)
MonitoredObject::transferNotifsTo
void transferNotifsTo(const MonitoredObject &, const CallBacker *onlyfor=0) const
MonitoredObject::AccessLocker::~AccessLocker
~AccessLocker()
std
Definition: fixedstreambuf.h:20
MonitoredObject::ChangeData
Definition: monitoredobject.h:115
mSelf
#define mSelf()
Definition: commondefs.h:144
MonitoredObject::ChangeData::NoChange
static ChangeData NoChange()
Definition: monitoredobject.h:139
MonitoredObject::delnotif_
Notifier< MonitoredObject > delnotif_
Definition: monitoredobject.h:214
MonitoredObject::sendChgNotif
void sendChgNotif(AccessLocker &, ChangeType, IDType) const
calls objectChanged with released lock
refcount.h
MonitoredObject::sendDelNotif
void sendDelNotif() const
MonitoredObject::ChangeData::hasUnspecID
bool hasUnspecID() const
Definition: monitoredobject.h:131
ChangeNotifyBlocker::unblocked_
bool unblocked_
Definition: monitoredobject.h:312
MonitoredObject::sendChangeNotification
void sendChangeNotification(const ChangeData &) const
ConstPtrManBase::ptr
const T * ptr() const
Definition: ptrman.h:82
MonitoredObject::accesslock_
Threads::Lock accesslock_
Definition: monitoredobject.h:191
MonitoredObject::MonitoredObject
MonitoredObject()
MonitoredObject::AccessLocker::isLocked
bool isLocked() const
MonitoredObject::ChangeData::auxDataAs
T * auxDataAs()
Definition: monitoredobject.h:152
MonitoredObject::ChangeData::AllChanged
static ChangeData AllChanged()
Definition: monitoredobject.h:138
ChangeNotifyBlocker::sendnotif_
bool sendnotif_
Definition: monitoredobject.h:313
MonitoredObject::touch
virtual void touch() const
Definition: monitoredobject.h:101
Threads
interface to threads that should be portable.
Definition: atomic.h:23
MonitoredObject::ChangeDataNotifier
CNotifier< MonitoredObject, ChangeData > ChangeDataNotifier
Definition: monitoredobject.h:86
Threads::Lock
A lock of a type that (hopefully) suits your needs. To use it, you need the Locker class.
Definition: threadlock.h:53
MonitoredObject::ChangeData::AuxData
Definition: monitoredobject.h:142
CNotifier< MonitoredObject, ChangeData >
Threads::Atomic< DirtyCountType >
MonitoredObject::AccessLocker::AccessLocker
AccessLocker(const AccessLocker &)
MonitoredObject
Object that can be MT-safely monitored from cradle to grave.
Definition: monitoredobject.h:77
MonitoredObject::resumeChangeNotifications
void resumeChangeNotifications() const
RefMan
Definition: ptrman.h:206
DirtyCountType
od_int64 DirtyCountType
Definition: commontypes.h:36
MonitoredObject::cEntireObjectChange
static ChangeType cEntireObjectChange()
Definition: monitoredobject.h:105

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B.V. 1995-2021