csHandlerID csEventHandlerRegistry::GetGenericPostBoundID (csHandlerID id) { CS::Threading::ScopedReadLock lock(mutex); if (IsInstance(id)) return GetGenericPostBoundID(instantiation.Get(id, CS_HANDLER_INVALID)); return handlerPosts.Get(id, CS_HANDLER_INVALID); }
bool csEventHandlerRegistry::IsInstanceOf (csHandlerID instanceid, csHandlerID genericid) { CS_ASSERT(IsInstance(instanceid)); CS::Threading::ScopedReadLock lock(mutex); return (instantiation.Get (instanceid, CS_HANDLER_INVALID) == genericid); }
iEventHandler *csEventHandlerRegistry::GetHandler (csHandlerID id) { CS_ASSERT(IsInstance(id)); mutex.ReadLock(); const KnownEventHandler* knownHandler = idToHandler.GetElementPointer (id); mutex.ReadUnlock(); return knownHandler ? (iEventHandler*)(knownHandler->handler) : (iEventHandler*)0; }
GMC_DCL(tp_FilHdr, FilHdr) { size_t sz; tp_FilHdr OutFilHdr; tp_FTName FTName; OutFilHdr = Copy_FilHdr(FilHdr); if (IsInstance(OutFilHdr)) OutFilHdr = FilHdr_Father(OutFilHdr); FTName = FilTyp_ShortFTName(FilHdr_FilTyp(OutFilHdr)); sz = snprintf(WorkFileName, MAX_FileName, "%s/%s", Job->JobDirName, FTName); if (sz >= MAX_FileName) { (void)fprintf(stderr, "File name too long (MAX_FileName=%d): %s/%s\n", MAX_FileName, Job->JobDirName, FTName); exit(11); }/*if*/; Ret_FilHdr(OutFilHdr); }/*Get_WorkFileName*/
void csEventHandlerRegistry::ReleaseID (csHandlerID id) { CS_ASSERT (IsInstance (id)); mutex.UpgradeLock(); KnownEventHandler* knownHandler = idToHandler.GetElementPointer (id); CS_ASSERT (knownHandler); mutex.UpgradeUnlockAndWriteLock(); if ((--knownHandler->refcount) == 0) { handlerToID.DeleteAll ( static_cast<iEventHandler*> (knownHandler->handler)); idToHandler.DeleteAll (id); instantiation.DeleteAll (id); } mutex.WriteUnlock(); }
GMC_DCL(tp_Nod, OprNod) { tp_Nod ElmNod; tp_NodTyp NodTyp; tp_FilTyp FilTyp; tp_LocHdr LocHdr; tp_LocPVal LocPVal; if (FilHdr == ERROR || FilPrm == ERROR) return ERROR; while (OprNod != NIL) { NodTyp = Nod_NodTyp(OprNod); switch (NodTyp) { case PRMOPR: { FilPrm = Append_PrmNod(FilPrm, OprNod); if (FilPrm == ERROR) { Ret_FilHdr(FilHdr); return ERROR; }/*if*/; break;}/*case*/; case APLOPR: { LocHdr = PrmValNod_LocHdr(Nod_Son(1, OprNod), ApplyPrmTyp); if (LocHdr == ERROR) { Ret_FilHdr(FilHdr); return ERROR; }/*if*/; LocPVal = NIL; FilPrm = Append_PrmInf(FilPrm, ApplyPrmTyp, LocHdr, LocPVal); FilHdr = Extend_FilHdr(FilHdr, FK_User, ApplyFilTyp, FilPrm, DfltIdent); FilPrm = RootFilPrm; if (FilHdr == ERROR) { return ERROR; }/*if*/; break;}/*case*/; case DRVOPR: { FilTyp = Nod_FilTyp(Nod_Son(1, OprNod)); /*select*/{ if (FilTyp == ObjectFilTyp) { }else if (FilTyp == FatherFilTyp) { if (!IsInstance(FilHdr)) { FilHdr_Error("Input to :abstract must be an instance: %s\n", FilHdr); Ret_FilHdr(FilHdr); return ERROR; }/*if*/; FilHdr = FilHdr_Father(FilHdr); }else{ FilHdr = Do_Deriv(FilHdr, RootFilPrm, FilPrm, FilTyp); FilPrm = RootFilPrm; if (FilHdr == ERROR) { return ERROR; }/*if*/; };}/*select*/; break;}/*case*/; case HODOPR: { FilTyp = Nod_FilTyp(OprNod); FilHdr = Do_Deriv(FilHdr, RootFilPrm, FilPrm, FilTyp); if (FilHdr == ERROR) { return ERROR; }/*if*/; FilPrm = RootFilPrm; break;}/*case*/; case ELMOPR: { ElmNod = Nod_Son(1, OprNod); FilPrm = RootFilPrm; FilHdr = Do_Key(FilHdr, ""); FilHdr = Do_Keys(FilHdr, Sym_Str(Nod_Sym(ElmNod))); if (FilHdr == ERROR) { return ERROR; }/*if*/; break;}/*case*/; case DIROPR: { FilHdr = Do_Key(FilHdr, ""); break;}/*case*/; case SEGOPR: { FilHdr = Do_VTgt(FilHdr, Sym_Str(Nod_Sym(Nod_Son(1, OprNod)))); FilPrm = RootFilPrm; break;}/*case*/; default: { FATALERROR("bad operator node type"); };}/*switch*/; OprNod = Nod_Brother(OprNod); }/*while*/; return New_PrmFHdr(FilHdr, FilPrm); }/*Apply_OprNods*/
csHandlerID const csEventHandlerRegistry::GetGeneric (csHandlerID id) { CS_ASSERT(IsInstance(id)); CS::Threading::ScopedReadLock lock(mutex); return instantiation.Get (id, CS_HANDLER_INVALID); }