Copyright (C) 1994, Digital Equipment Corp. MODULE-- internal procedures --; IMPORT JVBuffer, JVDecomp, JVSink, JVSinkPool, Jvs, OSError, Text, Thread; TYPE Elt = RECORD sourceHost: TEXT; quality : JVSink.Quality; dparams : Jvs.DcmpParams; cmap : Jvs.ColormapInfo; decomp : JVDecomp.T; next : EltRef := NIL; subtype : CARDINAL; END; EltRef = REF Elt; VAR jvs: Jvs.T := NIL; PROCEDURE JVDecompPool GetDecomp (hostname: TEXT; quality : JVSink.Quality := JVSink.DefaultQuality; READONLY dparams: Jvs.DcmpParams; READONLY cmap : Jvs.ColormapInfo; create := TRUE; maxSinkBuffs, maxDecompBuffs: CARDINAL := 2; decompFactory: JVBuffer.Factory := NIL; decompServer : Jvs.T := NIL; delay : CARDINAL; subtype : CARDINAL): JVDecomp.T RAISES {OSError.E, Thread.Alerted} = VAR localparams := dparams; (* with output sizes converted for jv board alignment *) BEGIN (* get acceptable outX, outY *) IF jvs = NIL THEN jvs := NEW(Jvs.T).init(); END; EVAL jvs.setDecompress(localparams); WITH elt = SearchList(hostname, quality, localparams, cmap, subtype) DO IF elt # NIL THEN RETURN elt.decomp; END; END; IF NOT create THEN RETURN NIL; END; WITH sink = JVSinkPool.GetSink( hostname, quality, create, maxSinkBuffs, delay), res = NEW(JVDecomp.T).init(sink, dparams, cmap, maxDecompBuffs, decompFactory, decompServer), elt = NEW(EltRef, sourceHost := hostname, quality := quality, dparams := localparams, cmap := cmap, decomp := res, subtype := subtype) DO <* ASSERT sink # NIL *> LOCK mutex DO elt.next := list; list := elt; END; RETURN res; END; END GetDecomp;
PROCEDURESearchList ( sourceHost: TEXT; quality : JVSink.Quality; READONLY dparams : Jvs.DcmpParams; READONLY cmap : Jvs.ColormapInfo; subtype : CARDINAL): EltRef = (* look for an element which matches params. Return NIL if none *) PROCEDURE TextEqual (t1, t2: TEXT): BOOLEAN = BEGIN RETURN (t1 = NIL AND t2 = NIL) OR (t1 # NIL AND t2 # NIL AND Text.Equal(t1, t2)); END TextEqual; VAR curr := list; BEGIN LOCK mutex DO WHILE curr # NIL DO IF TextEqual(sourceHost, curr.sourceHost) AND quality = curr.quality AND dparams = curr.dparams AND cmap.id = curr.cmap.id AND cmap.nColors = curr.cmap.nColors AND cmap.monochrome = curr.cmap.monochrome AND TextEqual(cmap.displayName, curr.cmap.displayName) AND subtype = curr.subtype THEN EXIT; END; curr := curr.next; END; END; RETURN curr; END SearchList; VAR mutex := NEW(MUTEX); list : EltRef := NIL; BEGIN END JVDecompPool.