type
List
{
int data;
List next;
}
Share
{
List link;
}
endtype
decl
int x, semid, fp;
List head;
List mergeSort(List top);
List merge(List a, List b);
enddecl
List mergeSort(List top)
{
decl
int pid;
List slow, fast, a, b;
Share s;
enddecl
begin
if((top!=null) AND (top.next!=null)) then
slow=top;
fast=top.next;
while(fast!=null) do
fast=fast.next;
if(fast!=null) then
slow=slow.next;
fast=fast.next;
endif;
endwhile;
a=top;
b=slow.next;
slow.next=null;
a=mergeSort(a);
b=mergeSort(b);
top=merge(a, b);
endif;
return top;
end
}
List merge(List a, List b)
{
decl
List result;
enddecl
begin
result=null;
if(a==null) then
result=b;
endif;
if(b==null) then
result=a;
endif;
if(a!=null AND b!=null) then
if(a.data<=b.data) then
result=a;
result.next=merge(a.next, b);
else
result=b;
result.next=merge(a, b.next);
endif;
endif;
return result;
end
}
int main()
{
decl
int x, counter, pid, fp, a, word;
str file;
List p, q;
enddecl
begin
x=initialize();
semid=exposcall("Semget");
pid=exposcall("Getpid");
if(pid==5) then
file="temp1.dat";
endif;
if(pid==6) then
file="temp2.dat";
endif;
if(pid==7) then
file="temp3.dat";
endif;
if(pid==8) then
file="temp4.dat";
endif;
if(pid==9) then
file="temp5.dat";
endif;
if(pid==10) then
file="temp6.dat";
endif;
if(pid==11) then
file="temp7.dat";
endif;
if(pid==12) then
file="temp8.dat";
endif;
fp=exposcall("Open", file);
head=null;
counter=0;
a=exposcall("Read", fp, word);
while(counter<64) do
p=alloc();
p.data=word;
p.next=null;
if(head==null) then
head=p;
q=p;
else
q.next=p;
q=q.next;
endif;
a=exposcall("Read", fp, word);
counter=counter+1;
endwhile;
head=mergeSort(head);
x=exposcall("Seek", fp, 0);
p=head;
while(p!=null) do
word=p.data;
x=exposcall("Write", fp, word);
p=p.next;
endwhile;
x=exposcall("Close", fp);
x=exposcall("Semrelease");
pid=exposcall("Getpid");
x=pid+1;
while(x<13) do
a=exposcall("Wait",x);
x=x+1;
endwhile;
return 1;
end
}