ui/src/vbt/Batch.m3


Copyright (C) 1994, Digital Equipment Corp.
 by Steve Glassman, Mark Manasse and Greg Nelson           
<*PRAGMA LL*>

UNSAFE MODULE Batch;

IMPORT VBTTuning, BatchRep, PictureRep, Rect, BatchUtil;

VAR
  freemu := NEW(MUTEX);
  free: T;
  batchSize := VBTTuning.BatchSize;

PROCEDURE New(len: INTEGER := -1): T =
  VAR res: T;
  BEGIN
    IF len = -1 THEN len := batchSize END;
    IF len > batchSize THEN
      res := NEW(T);
      res.b := NEW(BatchRep.Array, (3 * len) DIV 2)
    ELSE
      LOCK freemu DO
        res := free;
        IF res # NIL THEN free := free.link END
      END;
      IF res = NIL THEN
        res := NEW(T);
        res.b := NEW(BatchRep.Array, batchSize)
      END
    END;
    res.link := NIL;
    res.clipped := BatchUtil.ClipState.Tight;
    res.next := ADR(res.b[0]);
    res.scrollSource := Rect.Empty;
    res.clip := Rect.Empty;
    res.containsPicture := FALSE;
    RETURN res
  END New;

PROCEDURE Free (VAR ba: T) =
  BEGIN
    IF ba.containsPicture THEN PictureRep.DecrementBatch(ba); END;
    LOCK freemu DO
      (* put ba on free list if it is standard size *)
      IF NUMBER(ba.b^) = batchSize THEN
        ba.link := free;
        free := ba
      ELSE
        DISPOSE(ba.b);
        DISPOSE(ba)
      END
    END;
    ba := NIL
  END Free;

BEGIN
END Batch.