-*- Mode: Modula-3 -*-
*
* For information about this program, contact Blair MacIntyre
* (bm@cs.columbia.edu) or Steven Feiner (feiner@cs.columbia.edu)
* at the Computer Science Dept., Columbia University,
* 1214 Amsterdam Ave. Mailstop 0401, New York, NY, 10027.
*
* Copyright (C) 1995, 1996 by The Trustees of Columbia University in the
* City of New York. Blair MacIntyre, Computer Science Department.
* See file COPYRIGHT-COLUMBIA for details.
*
* Author : Blair MacIntyre
* Created On : Wed Jun 28 19:12:54 1995
* Last Modified By: Blair MacIntyre
* Last Modified On: Tue Dec 3 13:12:34 1996
* Update Count : 13
*
* $Source: /usr/cvs/cm3/m3-comm/sharedobj/src/ObjectInfo.m3,v $
* $Date: 2001-12-02 13:41:16 $
* $Author: wagner $
* $Revision: 1.2 $
*
* $Log: ObjectInfo.m3,v $
* Revision 1.2 2001-12-02 13:41:16 wagner
* add copyright notes, fix overrides for cm3, and make everything compile(except tests)
*
* added: sharedobj/COPYRIGHT-COLUMBIA
* added: sharedobj/src/COPYRIGHT-COLUMBIA
* modified: sharedobj/src/LocalObjectSpace.i3
* modified: sharedobj/src/LocalObjectSpace.m3
* modified: sharedobj/src/Message.i3
* modified: sharedobj/src/Message.m3
* modified: sharedobj/src/ObjCopy.i3
* modified: sharedobj/src/ObjCopy.m3
* modified: sharedobj/src/ObjectInfo.i3
* modified: sharedobj/src/ObjectInfo.m3
* modified: sharedobj/src/ObjectSpace.i3
* modified: sharedobj/src/ObjectSpace_FindObjCallBack_v1.i3
* modified: sharedobj/src/ObjectSpace_FindObjCallBack_v1.m3
* modified: sharedobj/src/ObjectSpace_FindObjCallBack_v2.i3
* modified: sharedobj/src/ObjectSpace_FindObjCallBack_v2.m3
* modified: sharedobj/src/ObjectSpace_T_v1.i3
* modified: sharedobj/src/ObjectSpace_T_v1.m3
* modified: sharedobj/src/ObjectSpace_T_v2.i3
* modified: sharedobj/src/ObjectSpace_T_v2.m3
* modified: sharedobj/src/SharedObj.i3
* modified: sharedobj/src/SharedObjError.i3
* modified: sharedobj/src/SharedObjF.i3
* modified: sharedobj/src/SharedObjF.m3
* modified: sharedobj/src/SharedObjRT.i3
* modified: sharedobj/src/SharedObjRT.m3
* modified: sharedobj/src/SharedObjRTF.i3
* modified: sharedobj/src/SharedObjRep.i3
* modified: sharedobj/src/SharedObjRep.m3
* modified: sharedobj/src/SharedObjStubLib.i3
* modified: sharedobj/src/SharedObjStubLib.m3
* modified: sharedobj/src/SpaceConn.i3
* modified: sharedobj/src/SpaceConn.m3
* modified: sharedobj/src/WeakerRef.i3
* modified: sharedobj/src/WeakerRef.m3
* modified: sharedobj/src/m3makefile
* modified: sharedobj/src/m3overrides
* modified: sharedobj/tests/netobjtest/src/m3makefile
* modified: sharedobj/tests/obsequence/src/m3makefile
* modified: sharedobj/tests/tracker/src/m3makefile
*
* Revision 1.1.1.1 2001/12/02 13:14:14 wagner
* Blair MacIntyre's sharedobj package
*
* Revision 1.3 1997/01/23 15:27:14 bm
* Lot's of little bug fixes.
*
* Revision 1.2 1996/11/22 19:00:52 bm
* fixed header
*
*
* HISTORY
MODULE ObjectInfo;
IMPORT EventNumber, Fmt, EventConnList, EventWireRep, SpaceConn,
ObjCopyList, Thread;
PROCEDURE Init(self: T; seqNo: EventNumber.T): T =
BEGIN
self.seqNo := EventNumber.New(seqNo);
self.waiting := NEW(REF ARRAY OF Blocked, 1);
self.waiting[0].used := FALSE;
self.waiting[0].cv := NEW(Thread.Condition);
self.waiting[0].en := EventNumber.New();
RETURN self;
END Init;
A method call will need to be able to block if this host is not the
sequencer. For now we will always pick a slot for it in the array,
but eventually may optimize this. Probably won't matter, though.
The majority of objects will not have concurrent writers, so there
will only be one entry in the table, so this will be fast.
PROCEDURE PickThreadSlot(self: T) : CARDINAL =
BEGIN
(* Look for an unused one *)
FOR i := FIRST(self.waiting^) TO LAST(self.waiting^) DO
IF self.waiting[i].used = FALSE THEN
(* Use it! *)
self.waiting[i].used := TRUE;
RETURN i;
END;
END;
(* Add one on to the end. *)
WITH num = NUMBER(self.waiting^),
newBlocked = NEW(REF ARRAY OF Blocked, num+1) DO
SUBARRAY(newBlocked^, 0, num) := self.waiting^;
self.waiting := newBlocked;
self.waiting[num].used := TRUE;
self.waiting[num].cv := NEW(Thread.Condition);
self.waiting[num].en := EventNumber.New();
RETURN num;
END;
END PickThreadSlot;
PROCEDURE ReleaseThreadSlot(self: T; id: CARDINAL) =
BEGIN
self.waiting[id].used := FALSE;
END ReleaseThreadSlot;
PROCEDURE ToText(o: T): TEXT =
VAR ret : TEXT;
count: INTEGER := 0;
BEGIN
ret := "{" & EventWireRep.ToText(o.wrep) & ")seq(" &
o.seqNo.fmt(10) & ")conns(";
IF o.conns # NIL THEN
ret := ret & Fmt.Int(EventConnList.Length(o.conns)) & ")flags(";
ELSE
ret := ret & "0)flags(";
END;
IF o.isStandalone THEN
ret := ret & "s1";
ELSE
ret := ret & "s0";
END;
IF o.isOwner THEN
ret := ret & "o1";
ELSE
ret := ret & "o0";
END;
IF o.isLocker THEN
ret := ret & "l1";
ELSE
ret := ret & "l0";
END;
IF o.hasCopy THEN
ret := ret & "c1)";
ELSE
ret := ret & "c0)";
END;
IF o.sequencer # NIL THEN
ret := ret & "seq(" & SpaceConn.ToText(o.sequencer)&")";
END;
IF o.clients # NIL THEN
ret := ret & "clients(" & Fmt.Int(ObjCopyList.Length(o.clients)) & ")";
ELSE
ret := ret & "clients(0)";
END;
IF o.fastClients # NIL THEN
ret := ret & "fastC(" & Fmt.Int(ObjCopyList.Length(o.fastClients)) & ")";
ELSE
ret := ret & "fastC(0)";
END;
ret := ret & "waiting(";
FOR i := FIRST(o.waiting^) TO LAST(o.waiting^) DO
IF o.waiting[i].used THEN
INC(count);
END;
END;
RETURN ret & Fmt.Int(count) & "}";
END ToText;
BEGIN
END ObjectInfo.