ROOT logo
// $Id: ZQueen.h 2486 2011-06-25 04:07:48Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#ifndef GledCore_ZQueen_H
#define GledCore_ZQueen_H

#include <Glasses/ZNameMap.h>
#include <Gled/GTime.h>

class ZKing; class ZQueen;
class ZHashList;
class SaturnInfo; class EyeInfo; class Ray; class EyeInfoVector;
class ZComet;

class ZQueen : public ZNameMap,
	       public An_ID_Demangler,
	       public MIR_Priest
{
  MAC_RNR_FRIENDS(ZQueen);

  friend class ZKing;
  friend class Saturn;

public:
  //enum Contents_e { QC_Static = 0, QT_Dynamic = 1 };

  enum AuthMode_e { AM_None=0, AM_Queen, AM_Lens,
		    AM_QueenThenLens, AM_LensThenQueen };
  enum Align_e    { A_Good=0, A_Evil };

  enum QueenState_e { QS_Sleeping, QS_Awakening,
		      QS_Dreaming, QS_Nightmare,
		      QS_AwaitingSceptre, QS_Ruling,
		      QS_RelinquishingSceptre };

  enum ZeroRCPolicy_e { ZRCP_Delete, ZRCP_ToOrphanage, ZRCP_Ignore };

  enum LensState_e    { LS_Undef, LS_Alive, LS_Purged, LS_Dead };

  struct LensDetails
  {
    ZGlass*	mLens;
    LensState_e mState;
    GTime	mCreationTime;
    GTime	mDeletionTime;

    LensDetails(ZGlass* l, LensState_e ls=LS_Alive) :
      mLens(l), mState(ls), mCreationTime(GTime::I_Now) {}
  };

private:
  void _init();

protected:

  ZKing*	mKing;		  //! X{g}

  Bool_t	bMandatory;	  //  X{gS} 7 Bool(-join=>1)
  Bool_t	bFollowDeps;	  //  X{gS} 7 Bool() Used by fire-space queens

  Bool_t	bRuling;	  //! X{gS} 7 BoolOut(-join=>1)
  Bool_t	bAwaitingSceptre; //! X{gS} 7 BoolOut()
  QueenState_e	mState;	          //! X{gS} 7 PhonyEnum(-const=>1, -width=>12)

  ID_t		mMinID;		// X{g} 7 ValOut(-range=>[0,MAX_ID], -width=>8, -join=>1)
  ID_t		mMaxID;		// X{g} 7 ValOut(-range=>[0,MAX_ID], -width=>8)
  ID_t		mIDSpan;	// X{g} 7 ValOut(-join=>1)
  ID_t		mIDsUsed;	// X{g} 7 ValOut()
  ID_t		mIDsPurged;	// X{g} 7 ValOut(-join=>1)
  ID_t		mIDsFree;	// X{g} 7 ValOut()

  typedef map<ID_t, LensDetails*>		QueenIDMap_t;
  typedef map<ID_t, LensDetails*>::iterator	QueenIDMap_i;

  QueenIDMap_t  mIDMap;		//!

  ID_t		mCreationID;	//  Creation point ID
  lID_t		mPurgatory;	//  List of released but still reserved ids
  lpZGlass_t	mZombies;	//! Lenses that are dead but still need to be deleted.

  UShort_t	mAvgPurgLen;	// X{gS} 7 Value(-range=>[1,65000,1], -width=>5, -join=>1)
  Float_t	mSgmPurgLen;	// X{gS} 7 Value(-range=>[0,1,1,100], -width=>5)
  UInt_t	mPurgedMS;	// X{gS} 7 Value(-range=>[100,1e6,10], -width=>7, -join=>1)
  UInt_t	mDeletedMS;	// X{gS} 7 Value(-range=>[100,1e6,10], -width=>7)

  ZeroRCPolicy_e mZeroRCPolicy; // X{gS} 7 PhonyEnum()

  Bool_t	bStamping;	// X{GS} 7 Bool(-join=>1)
  Bool_t	bStampIdOps;	// X{GS} 7 Bool()

  UChar_t	mAuthMode;      // X{gS} 7 PhonyEnum(-type=>AuthMode_e, -width=>12)
  UChar_t	mAlignment;     // X{gS} 7 PhonyEnum(-type=>Align_e)
  UChar_t	mMapNoneTo;     // X{gS} 7 PhonyEnum(-type=>ZMirFilter::Result_e,
                                //                   -names=>[R_Allow,R_Deny])

  ZLink<ZMirFilter>	mProtector;     // X{gS} L{}

  ZLink<ZHashList>	mDeps;          // X{gS} L{}
  ZLink<ZHashList>	mOrphans;       // X{gS} L{}

  typedef list<SaturnInfo*>           lpSaturnInfo_t;
  typedef list<SaturnInfo*>::iterator lpSaturnInfo_i;

  lpSaturnInfo_t  mReflectors;	//!
  EyeInfoVector  *mObservers;   //!

  // Mutexen
  GMutex mSubjectWriteMutex;    //!
  GMutex mSubjectRefCntMutex;   //!
  GMutex mRayMutex;             //!

  virtual void bootstrap();
  virtual void embrace_of_life(ZComet& comet);

  bool                 has_free_ids(ID_t n_needed);
  ID_t                 next_free_id(QueenIDMap_i i);
  ID_t                 assign_id(ZGlass* lens);
  virtual LensDetails* produce_lens_details(ID_t id, ZGlass* lens);
  void                 release_purgatory(ID_t n_needed);
  void                 release_moon_purgatory(ID_t n_to_release); // X{E}
  int		       release_zombies();

  virtual ZGlass* instantiate(FID_t fid,
		    const Text_t* name=0, const Text_t* title=0); // X{E}

  // reflector handling; called by Saturn
  void add_reflector(SaturnInfo* moon);
  void remove_reflector(SaturnInfo* moon);

  void put_lens_to_purgatory(ZGlass* lens);
  void remove_lens(ZGlass* lens);
  void remove_lenses(AList* list, Bool_t recurse, Bool_t syncmode);

public:
  ZQueen(const Text_t* n="ZQueen", const Text_t* t=0);
  ZQueen(ID_t span, const Text_t* n="ZQueen", const Text_t* t=0);
  virtual ~ZQueen();

  // Subject Write/RefCnt locks.
  void SubjectWriteLock()    { mSubjectWriteMutex.Lock(); }
  void SubjectWriteUnlock()  { mSubjectWriteMutex.Unlock(); }
  void SubjectRefCntLock()   { mSubjectRefCntMutex.Lock(); }
  void SubjectRefCntUnlock() { mSubjectRefCntMutex.Unlock(); }

  // ID & Lens management
  virtual ZGlass* DemangleID(ID_t id);
  ID_t CheckIn(ZGlass* lens);

  // MIR blessing
  virtual void BlessMIR(ZMIR& mir);
  virtual void DepCheckMIR(ZMIR& mir);

  // Instantiation methods
  ID_t InstantiateWAttach(LID_t new_lid, CID_t new_cid,
			  const Text_t* name=0, const Text_t* title=0
			  ); // X{E} T{ZQueen::Instantiate}

  ID_t IncarnateWAttach();   // X{E} T{ZQueen::Instantiate}

  // instantiate URL

  // Lens mir-activity
  void MIRActivateLens(ZGlass* lens);                   // X{E}  C{1}
  void MIRDeactivateLens(ZGlass* lens);                 // X{E}  C{1}

  // Lens deletion
 protected:
  void PutLensToPurgatory(ZGlass* lens);                // X{E}  C{1}
  void PutListElementsToPurgatory(AList* list);         // X{E}  C{1}
  void PutLensToVoid(ID_t lens_id);                     // X{E}
 public:
  void RemoveLens(ZGlass* lens);                        // X{E}  C{1}
  void RemoveLenses(AList* list, Bool_t recurse=false); // X{Ed} C{1}

  // ZeroRefCount and management of Orphans
  void ZeroRefCount(ZGlass* lens);
  void CleanOrphanage();           // X{E} 7 MButt()

  // Mandatory queens are pushed to all lower Saturns
  // being processed ...
  // void SetMandatory(Bool_t mandp);

  // Dependencies
  void AddDependency(ZQueen* new_dep);  // X{E} C{1}
  //void RemoveDependency(ZQueen* dep); // X{E} C{1}
  Bool_t DependsOn(ZQueen* some_queen);

  // Reflections ... operated by Kings
  virtual void CreateReflection(TBuffer& buf);
  virtual void InvokeReflection(TBuffer& buf);
  virtual void RevokeReflection();

  // Comet operations
  ZComet* MakeComet();
  void AdoptComet(AList* top_dest, AList* orphan_dest, ZComet* comet); // X{E} C{2}
  virtual void UnfoldFrom(ZComet& comet);

  // Maintenance of non-ruling queen reflections
  void BroadcastMIRToNonRulingReflections(ZMIR& mir);
  void BasicQueenChange(ZMIR& mir);

  // lens stamping
  void AddObserver(EyeInfo* ei);
  void RemoveObserver(EyeInfo* ei);
  void EmitRay(auto_ptr<Ray>& ray);
  void PrintEyeConnections();                        //! X{E} 7 MButt(-join=>1)
  void PrintObservedLenses(Bool_t dump_views=false); //! X{E} 7 MCWButt()

  // tmp
  void ListAll(); //! X{E} 7 MButt()

#include "ZQueen.h7"
  ClassDef(ZQueen, 1);
}; // endclass ZQueen


// Attempt at server exec + broadcast
#ifndef __CINT__
#define CALL_AND_BROADCAST(_lens_, _method_, ...) \
  _lens_->_method_(__VA_ARGS__); \
  { auto_ptr<ZMIR> _mir_(_lens_->S_##_method_(__VA_ARGS__)); \
    mSaturn->markup_posted_mir(*_mir_); \
    mSaturn->BroadcastMIR(*_mir_, mReflectors); }
#endif

#endif
 ZQueen.h:1
 ZQueen.h:2
 ZQueen.h:3
 ZQueen.h:4
 ZQueen.h:5
 ZQueen.h:6
 ZQueen.h:7
 ZQueen.h:8
 ZQueen.h:9
 ZQueen.h:10
 ZQueen.h:11
 ZQueen.h:12
 ZQueen.h:13
 ZQueen.h:14
 ZQueen.h:15
 ZQueen.h:16
 ZQueen.h:17
 ZQueen.h:18
 ZQueen.h:19
 ZQueen.h:20
 ZQueen.h:21
 ZQueen.h:22
 ZQueen.h:23
 ZQueen.h:24
 ZQueen.h:25
 ZQueen.h:26
 ZQueen.h:27
 ZQueen.h:28
 ZQueen.h:29
 ZQueen.h:30
 ZQueen.h:31
 ZQueen.h:32
 ZQueen.h:33
 ZQueen.h:34
 ZQueen.h:35
 ZQueen.h:36
 ZQueen.h:37
 ZQueen.h:38
 ZQueen.h:39
 ZQueen.h:40
 ZQueen.h:41
 ZQueen.h:42
 ZQueen.h:43
 ZQueen.h:44
 ZQueen.h:45
 ZQueen.h:46
 ZQueen.h:47
 ZQueen.h:48
 ZQueen.h:49
 ZQueen.h:50
 ZQueen.h:51
 ZQueen.h:52
 ZQueen.h:53
 ZQueen.h:54
 ZQueen.h:55
 ZQueen.h:56
 ZQueen.h:57
 ZQueen.h:58
 ZQueen.h:59
 ZQueen.h:60
 ZQueen.h:61
 ZQueen.h:62
 ZQueen.h:63
 ZQueen.h:64
 ZQueen.h:65
 ZQueen.h:66
 ZQueen.h:67
 ZQueen.h:68
 ZQueen.h:69
 ZQueen.h:70
 ZQueen.h:71
 ZQueen.h:72
 ZQueen.h:73
 ZQueen.h:74
 ZQueen.h:75
 ZQueen.h:76
 ZQueen.h:77
 ZQueen.h:78
 ZQueen.h:79
 ZQueen.h:80
 ZQueen.h:81
 ZQueen.h:82
 ZQueen.h:83
 ZQueen.h:84
 ZQueen.h:85
 ZQueen.h:86
 ZQueen.h:87
 ZQueen.h:88
 ZQueen.h:89
 ZQueen.h:90
 ZQueen.h:91
 ZQueen.h:92
 ZQueen.h:93
 ZQueen.h:94
 ZQueen.h:95
 ZQueen.h:96
 ZQueen.h:97
 ZQueen.h:98
 ZQueen.h:99
 ZQueen.h:100
 ZQueen.h:101
 ZQueen.h:102
 ZQueen.h:103
 ZQueen.h:104
 ZQueen.h:105
 ZQueen.h:106
 ZQueen.h:107
 ZQueen.h:108
 ZQueen.h:109
 ZQueen.h:110
 ZQueen.h:111
 ZQueen.h:112
 ZQueen.h:113
 ZQueen.h:114
 ZQueen.h:115
 ZQueen.h:116
 ZQueen.h:117
 ZQueen.h:118
 ZQueen.h:119
 ZQueen.h:120
 ZQueen.h:121
 ZQueen.h:122
 ZQueen.h:123
 ZQueen.h:124
 ZQueen.h:125
 ZQueen.h:126
 ZQueen.h:127
 ZQueen.h:128
 ZQueen.h:129
 ZQueen.h:130
 ZQueen.h:131
 ZQueen.h:132
 ZQueen.h:133
 ZQueen.h:134
 ZQueen.h:135
 ZQueen.h:136
 ZQueen.h:137
 ZQueen.h:138
 ZQueen.h:139
 ZQueen.h:140
 ZQueen.h:141
 ZQueen.h:142
 ZQueen.h:143
 ZQueen.h:144
 ZQueen.h:145
 ZQueen.h:146
 ZQueen.h:147
 ZQueen.h:148
 ZQueen.h:149
 ZQueen.h:150
 ZQueen.h:151
 ZQueen.h:152
 ZQueen.h:153
 ZQueen.h:154
 ZQueen.h:155
 ZQueen.h:156
 ZQueen.h:157
 ZQueen.h:158
 ZQueen.h:159
 ZQueen.h:160
 ZQueen.h:161
 ZQueen.h:162
 ZQueen.h:163
 ZQueen.h:164
 ZQueen.h:165
 ZQueen.h:166
 ZQueen.h:167
 ZQueen.h:168
 ZQueen.h:169
 ZQueen.h:170
 ZQueen.h:171
 ZQueen.h:172
 ZQueen.h:173
 ZQueen.h:174
 ZQueen.h:175
 ZQueen.h:176
 ZQueen.h:177
 ZQueen.h:178
 ZQueen.h:179
 ZQueen.h:180
 ZQueen.h:181
 ZQueen.h:182
 ZQueen.h:183
 ZQueen.h:184
 ZQueen.h:185
 ZQueen.h:186
 ZQueen.h:187
 ZQueen.h:188
 ZQueen.h:189
 ZQueen.h:190
 ZQueen.h:191
 ZQueen.h:192
 ZQueen.h:193
 ZQueen.h:194
 ZQueen.h:195
 ZQueen.h:196
 ZQueen.h:197
 ZQueen.h:198
 ZQueen.h:199
 ZQueen.h:200
 ZQueen.h:201
 ZQueen.h:202
 ZQueen.h:203
 ZQueen.h:204
 ZQueen.h:205
 ZQueen.h:206
 ZQueen.h:207
 ZQueen.h:208
 ZQueen.h:209
 ZQueen.h:210
 ZQueen.h:211
 ZQueen.h:212
 ZQueen.h:213
 ZQueen.h:214
 ZQueen.h:215
 ZQueen.h:216
 ZQueen.h:217
 ZQueen.h:218
 ZQueen.h:219
 ZQueen.h:220
 ZQueen.h:221
 ZQueen.h:222
 ZQueen.h:223
 ZQueen.h:224
 ZQueen.h:225
 ZQueen.h:226
 ZQueen.h:227
 ZQueen.h:228
 ZQueen.h:229