-- Code of Figure 14.12, pages 659-660 from
-- Kenneth C. Louden, Programming Languages
-- Principles and Practice 2nd Edition
-- Copyright (C) Brooks-Cole/ITP, 2003
-- Parallel Integer Matrix Multiplication 
-- Package Body

package body IntMatrices is
  function ParMult(a,b: in IntMatrix) return IntMatrix is
    c:IntMatrix;

    task type Mult is
      entry DoRow (i: in INTEGER);
    end;
    task body Mult is
      iloc: INTEGER;
    begin
      accept DoRow (i: in INTEGER) do
	iloc := i;
      end;
      for j in 1..Size loop
        c(iloc, j) := 0;
        for k in 1..Size loop
          c(iloc, j) := c(iloc,j) + a(iloc,k) * b(k,j);
        end loop;
      end loop;
    end Mult;

  begin -- ParMult
    declare m: array (1..Size) of Mult;
    begin
      for i in 1..Size loop
        m(i).DoRow(i);
      end loop;
    end;
    return c;
  end ParMult;
end IntMatrices;
