/* 10.1.15 */ boolean Vchunk_Copy (tokentype *Vtoken0, tokentype *Vtoken1, ft F,lt Z,zz *Status) { vchunktkntype Vchunk0; vchunktkntype Vchunk1; vchunkstruc VchunkStruc0; vchunkstruc VchunkStruc1; addrtype VchunkAddr0 = NullPtr; addrtype VchunkAddr1 = NullPtr; if (DbmInvokeVchunk (Vtoken0, McStat, &Vchunk0)) if (MemGetChunkStruc (Vchunk0.InCore, McStat, &VchunkStruc0)) if (MemGetChunkAddr (Vchunk0.InCore, McStat, &VchunkAddr0)) if (DbmInvokeVchunk (Vtoken1, McStat, &Vchunk1)) if (MemGetChunkStruc (Vchunk1.InCore, McStat, &VchunkStruc1)) if (MemGetChunkAddr (Vchunk1.InCore, McStat, &VchunkAddr1)) if (VchunkStruc0.UnitSize == VchunkStruc1.UnitSize) { if (MemPutStackPtr (Vchunk1.InCore, VchunkStruc1.StackPtr, McStat)) MoveBytes (VchunkAddr0, VchunkAddr1, VchunkStruc0.UnitSize * VchunkStruc0.UnitCount); } else *Status = Vchunk_NotSameUnitSize; TRACK(TrackBak,"Vchunk_Copy\n"); return (STAT); }
trap_retval ReqWrite_mem( void ) { bool int_tbl; write_mem_req *acc; write_mem_ret *ret; trap_elen len; void *data; acc = GetInPtr(0); ret = GetOutPtr(0); data = GetInPtr(sizeof(*acc)); len = GetTotalSize() - sizeof(*acc); acc->mem_addr.offset &= 0xffff; int_tbl = IsInterrupt( acc->mem_addr, len ); if( int_tbl ) SetIntVecs(); if( ( acc->mem_addr.offset + len ) > 0xffff ) { len = 0x10000 - acc->mem_addr.offset; } MoveBytes( FP_SEG( data ), FP_OFF( data ), acc->mem_addr.segment, acc->mem_addr.offset, len ); if( int_tbl ) ClrIntVecs(); ret->len = len; return( sizeof( *ret ) ); }
trap_retval ReqRead_mem( void ) { bool int_tbl; read_mem_req *acc; void *data; trap_elen len; acc = GetInPtr(0); data = GetOutPtr( 0 ); acc->mem_addr.offset &= 0xffff; int_tbl = IsInterrupt( acc->mem_addr, acc->len ); if( int_tbl ) SetIntVecs(); len = acc->len; if( ( acc->mem_addr.offset + len ) > 0xffff ) { len = 0x10000 - acc->mem_addr.offset; } MoveBytes( acc->mem_addr.segment, acc->mem_addr.offset, FP_SEG( data ), FP_OFF( data ), len ); if( int_tbl ) ClrIntVecs(); return( len ); }
/* 12.0.4 */ boolean Grp_DeleteObject (dbheader *CoreDb, objheader *ObjHdr, indextype Index, ft F,lt Z,zz *Status) { numtype DeleteRgn = 0; numtype RgnNum = 0; numtype Chunk = 0; addrtype ChunkAddr = NullPtr; indextype LocalIndex = 0; addrtype DeleteEntry = NullPtr; indextype LastIndex = 0; addrtype LastEntry = NullPtr; numtype MemLoc = 0; handletype Handle = 0; boolean TempGrpBug = GrpBug; if (Index < ObjHdr->BaseIndex) { DeleteRgn = 0; LocalIndex = Index; if (ObjHdr->BaseRegion == 0) GrpGetRegion (CoreDb, (grpheader *)ObjHdr, 0, McStat, &ObjHdr->BaseRegion, &ChunkAddr); else MemGetChunkAddr (ObjHdr->BaseRegion, McStat, &ChunkAddr); Chunk = ObjHdr->BaseRegion; } else { DeleteRgn = (Index - ObjHdr->BaseIndex) / ObjHdr->RegionObjects; if (ObjHdr->BaseIndex) RgnNum++; LocalIndex = (Index - ObjHdr->BaseIndex) % ObjHdr->RegionObjects; if (GrpGetRegion (CoreDb, (grpheader *)ObjHdr, DeleteRgn, McStat, &Chunk, &ChunkAddr)) ++ObjHdr->FrozenRgns[DeleteRgn]; } DeleteEntry = (addrtype )((char *)ChunkAddr + (ObjHdr->ObjSize * LocalIndex)); --ObjHdr->ObjectCount; LastIndex = ObjHdr->ObjectCount; if (GrpBug || DbmBug || DeBug) if (sprintf (Msg, " Rgn =%4u; Chunk=%4u; LocalIndex=%4u;\n", DeleteRgn, Chunk, LocalIndex)) if (TraceMsg (0, Msg)) if (sprintf (Msg, " LastIndex=%4u\n", ObjHdr->ObjectCount)) TraceMsg (0, Msg); if (Normal(*Status)) if (ObjHdr->ObjectCount == 0) { memset (DeleteEntry, 0, ObjHdr->ObjSize); Grp_CleanRgnChunks (CoreDb, (grpheader *)ObjHdr, DeleteRgn, Chunk, McStat); } else if (LastIndex == Index) { memset (DeleteEntry, 0, ObjHdr->ObjSize); if (DeleteRgn) --ObjHdr->FrozenRgns[DeleteRgn]; ++ObjHdr->RgnStats[DeleteRgn]; if (LocalIndex == 0) Grp_CleanRgnChunks (CoreDb, (grpheader *)ObjHdr, DeleteRgn, Chunk, McStat); else MemPutStackPtr (Chunk, LocalIndex+1, McStat); } else { /* Get Position of Last Object Entry of Last Grp Rgn. */ if (LastIndex < ObjHdr->BaseIndex) { RgnNum = 0; LocalIndex = LastIndex; if (ObjHdr->BaseRegion == 0) GrpGetRegion (CoreDb, (grpheader *)ObjHdr, 0, McStat, &ObjHdr->BaseRegion, &ChunkAddr); else MemGetChunkAddr (ObjHdr->BaseRegion, McStat, &ChunkAddr); Chunk = ObjHdr->BaseRegion; } else { RgnNum = (LastIndex - ObjHdr->BaseIndex) / ObjHdr->RegionObjects; if (ObjHdr->BaseIndex) RgnNum++; LocalIndex = (LastIndex - ObjHdr->BaseIndex) % ObjHdr->RegionObjects; GrpGetRegion (CoreDb, (grpheader *)ObjHdr, RgnNum, McStat, &Chunk, &ChunkAddr); } LastEntry = (addrtype )((char *)ChunkAddr + (ObjHdr->ObjSize * LocalIndex)); Handle = *(handletype *)((char *)LastEntry + ObjHdr->HandleOffset); if (GrpBug || DbmBug || DeBug) if (sprintf (Msg, " LAST Rgn =%4u; Chunk=%4u; Local=%4u; Index=%4u; Handle=%6u\n", RgnNum, Chunk, LocalIndex, LastIndex, Handle)) TraceMsg (0, Msg); /* Copy Last Object Entry to position of deleted. */ if (Normal(*Status)) if (HmPutObjectIndex (CoreDb, Handle, Index, McStat)) if (HmGetObjectMemLoc (CoreDb, Handle, McStat, &MemLoc)) if (MemLoc ==0) HmPutObjectAddr (CoreDb, Handle, DeleteEntry, McStat); if (Normal(*Status)) { ++ObjHdr->RgnStats[RgnNum]; ++ObjHdr->RgnStats[DeleteRgn]; MoveBytes (LastEntry, DeleteEntry, ObjHdr->ObjSize); memset (LastEntry, 0, ObjHdr->ObjSize); if (LocalIndex == 0) Grp_CleanRgnChunks (CoreDb, (grpheader *)ObjHdr, RgnNum, Chunk, McStat); else MemPutStackPtr (Chunk, LocalIndex+1, McStat); } if (DeleteRgn) --ObjHdr->FrozenRgns[DeleteRgn]; } GrpBug = TempGrpBug; TRACK(TrackBak,"Grp_DeleteObject\n"); return (STAT); }
/* C; C++ */ boolean ImagePutFieldValue (tokentype *Token, fieldstruc *FS, addrtype Value, ft F,lt Z,zz *Status) { dbheader *CoreDb = NullPtr; numtype MemLoc = 0; tokentype AttrTkn = NullToken; attrdesctype *AttrDesc = NullPtr; tokentype BldDescTkn = NullToken; objdesctype *BldDesc = NullPtr; sizetype Offset = 0; tokentype RefTkn = NullToken; addrtype BytePtr = NullPtr; char *StrPtr = NullPtr; numtype AttrId = FS->FieldTkns[FS->SubLevel-1].AttrId; AttrTkn.DbId = RenvId; if (ClassBug || DeBug || OaBug) if (sprintf (Msg, " Image::PutFieldValue Object[%2u:%4u] AttrId= %2u @%x\n", Token->DbId, Token->Handle, AttrId, Value)) TraceMsg (0, Msg); if (Token->DbId) if (TmFetchCoreDb (Token, McStat, &CoreDb)) if (CoreDb) if (HmGetObjectMemLoc (CoreDb, Token->Handle, McStat, &MemLoc)) if (EnvFetchAttrHandle (AttrId, McStat, &AttrTkn.Handle)) if (OaGetObject (&AttrTkn, McStat, (addrtype *)&AttrDesc)) if (AttrDesc->AttrType == aChunkAttr || AttrDesc->AttrType == aArrayAttr || AttrDesc->AttrType == aVarrayAttr || AttrDesc->AttrType == aDblPtrAttr) { *Status = Image_AttrNotPutArrayType; TraceMsg (0, " Image_PutFieldValue:: Invalid Attribute Type for PutValue.\n"); TraceMsg (0, " Arrays Must be instantiated with Array Methods.\n"); sprintf (Msg, " for Token[%2u:%4u] AttrId= %4u.\n", Token->DbId, Token->Handle, AttrId); TraceMsg (0, Msg); } if (Normal(*Status)) if (AttrDesc->AttrType == aStrHndlAttr) { StrPtr = (char *)Value; if (sprintf (Msg, " Image::PutValue [%2u:%4u] String @%x := <%s>)\n", Token->DbId, Token->Handle, Value, StrPtr)) TraceMsg (0, Msg); KernelPutField (Token, FS, Value, McStat); } else if (AttrDesc->AttrType == aObjRefAttr) { if (MemLoc == 0) KernelPutField (Token, FS, (addrtype )&Value, McStat); else { BldDescTkn.DbId = RenvId; BldDescTkn.Handle = AttrDesc->BuildDesc; if (OaGetObject (&BldDescTkn, McStat, (addrtype *)&BldDesc)) if (Env_FetchObjAttrOffset (MemLoc, BldDesc->ObjNum, Token_Attr, McStat, &Offset)) { BytePtr = (addrtype )((char *)Value + Offset); MoveBytes (BytePtr, (addrtype )&RefTkn, sizeof (tokentype)); if (RefTkn.DbId && RefTkn.Handle) KernelPutField (Token, FS, (addrtype )&RefTkn, McStat); } if (ClassBug || DeBug || OaBug) if (sprintf (Msg, " Image::PutFieldValue Reference[%2u:%4u] @%x)\n", RefTkn.DbId, RefTkn.Handle, *(addrtype **)Value)) TraceMsg (0, Msg); } } else KernelPutField (Token, FS, Value, McStat); TRACK(TrackBak,"ImagePutFieldValue\n"); return (STAT); }
/* C; C++ */ boolean ImageGetFieldValue (tokentype *Token, fieldstruc *FS, ft F,lt Z,zz *Status, addrtype Value) { dbheader *CoreDb = NullPtr; numtype MemLoc = 0; tokentype AttrTkn = NullToken; attrdesctype *AttrDesc = NullPtr; tokentype VchunkTkn = NullToken; vchunktype *Vstruc = (vchunktype *)Value; sizetype Vsize = 0; addrtype Image = NullPtr; addrtype BytePtr = NullPtr; int i = 0; handletype *Handles = NullPtr; handletype *ArrayPtrs = NullPtr; RefObj *RefObjVal = NullPtr; numtype AttrId = FS->FieldTkns[FS->SubLevel-1].AttrId; AttrTkn.DbId = RenvId; if (Token->DbId) if (TmFetchCoreDb (Token, McStat, &CoreDb)) if (CoreDb) if (HmGetObjectMemLoc (CoreDb, Token->Handle, McStat, &MemLoc)) if (EnvFetchAttrHandle (AttrId, McStat, &AttrTkn.Handle)) if (OaGetObject (&AttrTkn, McStat, (addrtype *)&AttrDesc)) if (AttrDesc->AttrType == aObjRefAttr && MemLoc == 0) KernelGetField (Token, FS, McStat, (addrtype )&VchunkTkn); else KernelGetField (Token, FS, McStat, Value); if (Normal(*Status)) if (MemLoc == 0) if (AttrDesc->AttrType == aArrayAttr || AttrDesc->AttrType == aVarrayAttr || AttrDesc->AttrType == aChunkAttr) { /* move internally stored Vchunk (Handle / Token) to Vstruc */ VchunkTkn.DbId = Token->DbId; VchunkTkn.CoreDbId = 0; MoveBytes (Value, (addrtype )&VchunkTkn.Handle, sizeof (handletype)); if (AttrDesc->AttrType == aArrayAttr) { if (VchunkTkn.Handle > 0) Vchunk_GetAddress (&VchunkTkn, McStat, (addrtype *)Value); else MoveBytes (&Image, Value, sizeof (addrtype)); } else { Vstruc->VchunkTkn = VchunkTkn; if (Vchunk_GetAddress (&VchunkTkn, McStat, &Vstruc->Varray)) if (Vchunk_GetStackPtr (&VchunkTkn, McStat, &Vstruc->Vsize)) if (AttrDesc->AttrType == aChunkAttr) { Vstruc->VstackPtr = Vstruc->Vsize; Vchunk_GetChunkSize (&VchunkTkn, McStat, &Vstruc->Vsize, &Vsize); } } } else if (AttrDesc->AttrType == aDblPtrAttr) { /* move internally stored Vchunk (Handle / Token) to Vstruc */ VchunkTkn.DbId = Token->DbId; VchunkTkn.CoreDbId = 0; MoveBytes (Value, (addrtype )&VchunkTkn.Handle, sizeof (handletype)); if (VchunkTkn.Handle > 0) { if (Vchunk_GetAddress (&VchunkTkn, McStat, (addrtype *)&ArrayPtrs)) if (Vchunk_GetStackPtr (&VchunkTkn, McStat, &Vsize)) { Vsize /= 2; Handles = (handletype *)&ArrayPtrs[Vsize]; } for (i = -1; ++i < Vsize && Normal(*Status); ) { if ((VchunkTkn.Handle = Handles[i]) > 0) { Vchunk_GetAddress (&VchunkTkn, McStat, (addrtype *)&ArrayPtrs[i]); } else ArrayPtrs[i] = NullPtr; } if (Normal(*Status)) MoveBytes (&ArrayPtrs, Value, sizeof (addrtype)); } else MoveBytes (&Image, Value, sizeof (addrtype)); } else if (AttrDesc->AttrType == aObjRefAttr) { if (VchunkTkn.DbId && VchunkTkn.Handle) ImageGetObject (&VchunkTkn, McStat, &Image); MoveBytes (&Image, Value, sizeof (addrtype)); if (ClassBug || DeBug || OaBug) if (sprintf (Msg, " Image::GetValue Object[%2u:%4u] Reference @%x (Value := @%x)\n", VchunkTkn.DbId, VchunkTkn.Handle, Image, *(addrtype **)Value)) TraceMsg (0, Msg); } else if (AttrDesc->AttrType == aTknRefAttr) { BytePtr = (addrtype )((char *)Value + sizeof (addrtype)); MoveBytes (Value, (addrtype )&VchunkTkn, sizeof (tokentype)); if (sprintf (Msg, " Get TknRef[%4u:%6u]Attr Value @%8x; BytePtr @%8x\n", VchunkTkn.DbId, VchunkTkn.Handle, Value, BytePtr)) TraceMsg (0, Msg); MoveBytes (&Image, Value, sizeof (addrtype)); MoveBytes ((addrtype )&VchunkTkn, BytePtr, sizeof (tokentype)); } if (Normal(*Status)) if (MemLoc == 1) if (AttrDesc->AttrType == aTknRefAttr) { if ((RefObjVal = *(RefObj **)Value) != NULL) if (sprintf (Msg, " Get TknRef[%4u:%6u]Attr ObjAddr @%8x;\n", RefObjVal->ObjTkn.DbId, RefObjVal->ObjTkn.Handle, RefObjVal->ObjAddr)) TraceMsg (0, Msg); } TRACK(TrackBak,"ImageGetFieldValue\n"); return (STAT); }