#ifndef GledCore_ZQueen_H
#define GledCore_ZQueen_H
#include <Glasses/ZNameMap.h>
#include <Glasses/SaturnInfo.h>
#include <Gled/GTime.h>
class ZKing; class ZQueen;
class ZComet;
class Ray;
typedef set<ZQueen*> spZQueen_t;
typedef set<ZQueen*>::iterator spZQueen_i;
class ZQueen : public ZNameMap,
public An_ID_Demangler, public MIR_Priest
{
MAC_RNR_FRIENDS(ZQueen);
friend class ZKing;
friend class Saturn;
public:
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 };
class LensDetails {
public:
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;
Bool_t bMandatory;
Bool_t bFollowDeps;
Bool_t bRuling;
Bool_t bAwaitingSceptre;
QueenState_e mState;
ID_t mMinID;
ID_t mMaxID;
ID_t mIDSpan;
ID_t mIDsUsed;
ID_t mIDsPurged;
ID_t mIDsFree;
typedef map<ID_t, LensDetails*> QueenIDMap_t;
typedef map<ID_t, LensDetails*>::iterator QueenIDMap_i;
QueenIDMap_t mIDMap;
ID_t mCreationID;
lID_t mPurgatory;
lpZGlass_t mZombies;
UShort_t mAvgPurgLen;
Float_t mSgmPurgLen;
UInt_t mPurgedMS;
UInt_t mDeletedMS;
ZeroRCPolicy_e mZeroRCPolicy;
Bool_t bStamping;
Bool_t bStampIdOps;
UChar_t mAuthMode;
UChar_t mAlignment;
UChar_t mMapNoneTo;
ZLink<ZMirFilter> mProtector;
ZLink<ZHashList> mDeps;
ZLink<ZHashList> mOrphans;
lpSaturnInfo_t mReflectors;
GMutex mSubjectWriteMutex;
GMutex mSubjectRefCntMutex;
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);
int release_zombies();
virtual ZGlass* instantiate(FID_t fid,
const Text_t* name=0, const Text_t* title=0);
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) :
ZNameMap(n,t), mIDSpan(0),
mSubjectWriteMutex(GMutex::recursive),
mSubjectRefCntMutex(GMutex::recursive)
{ _init(); }
ZQueen(ID_t span, const Text_t* n="ZQueen", const Text_t* t=0) :
ZNameMap(n,t), mIDSpan(span),
mSubjectWriteMutex(GMutex::recursive),
mSubjectRefCntMutex(GMutex::recursive)
{ _init(); }
void SubjectWriteLock() { mSubjectWriteMutex.Lock(); }
void SubjectWriteUnlock() { mSubjectWriteMutex.Unlock(); }
void SubjectRefCntLock() { mSubjectRefCntMutex.Lock(); }
void SubjectRefCntUnlock() { mSubjectRefCntMutex.Unlock(); }
virtual ZGlass* DemangleID(ID_t id);
ID_t CheckIn(ZGlass* lens);
virtual void BlessMIR(ZMIR& mir);
virtual void DepCheckMIR(ZMIR& mir);
ID_t InstantiateWAttach(LID_t new_lid, CID_t new_cid,
const Text_t* name=0, const Text_t* title=0
);
ID_t IncarnateWAttach();
void MIRActivateLens(ZGlass* lens);
void MIRDeactivateLens(ZGlass* lens);
protected:
void PutLensToPurgatory(ZGlass* lens);
void PutListElementsToPurgatory(AList* list);
void PutLensToVoid(ID_t lens_id);
public:
void RemoveLens(ZGlass* lens);
void RemoveLenses(AList* list, Bool_t recurse=false);
void ZeroRefCount(ZGlass* lens);
void CleanOrphanage();
void AddDependency(ZQueen* new_dep);
Bool_t DependsOn(ZQueen* some_queen);
virtual void CreateReflection(TBuffer& buf);
virtual void InvokeReflection(TBuffer& buf);
virtual void RevokeReflection();
ZComet* MakeComet();
void AdoptComet(AList* top_dest, AList* orphan_dest, ZComet* comet);
virtual void UnfoldFrom(ZComet& comet);
void BroadcastMIRToNonRulingReflections(ZMIR& mir);
void BasicQueenChange(ZMIR& mir);
void EmitRay(auto_ptr<Ray>& ray);
void ListAll();
#include "ZQueen.h7"
ClassDef(ZQueen, 1);
};
#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