# include <stdio.h>
# include "/usr/include/sys/types.h"
# include "/usr/include/sys/shm.h"
# include "/usr/include/sys/ipc.h"
# include "/usr/include/sys/sem.h"
# include "forkjoin.h"
# include "sharedlib.h"
# include "spinlock.h"
# include "barrier.h"int main()
{
int iCount;
int nProc=10;
intconst n=19;
floatconst r=1,t=1;
int id,k,**bar_ary,**shmid;
float *x,y[20],u[27],z[20],*sum;
shmid=(int **)malloc(sizeof(int)* ((nProc-1)/2 +3) );
for(iCount=0;iCount< ((nProc-1)/2+3); iCount++)
{
shmid[iCount]=(int *)malloc(sizeof(int));
}
sum=(float *)malloc(sizeof(float)*20);
x=(float *)malloc(sizeof(float)*20);
sum=(float *)sshared(sizeof(float)*20,shmid[0]);
x=(float *)sshared(sizeof(float)*20,shmid[1]);
bar_ary=(int**)malloc(sizeof(int)*((nProc-1)/2 +2));
for(iCount=0; iCount <= ((nProc-1)/2); iCount++)
{
bar_ary[iCount]=(int *)malloc(sizeof(int)*5);
bar_ary[iCount]=(int *)sshared(sizeof(int)*5,shmid[iCount+2]);
}
for(iCount=0;iCount<27;iCount++)
{
u[iCount]=iCount+3;
if(iCount<20)
{
y[iCount]=iCount+1;
z[iCount]=iCount+2;
x[iCount]=0;
sum[iCount]=0;
}
}
for(iCount=0;iCount <= ((nProc-1)/2);iCount++)
{
barrier_init(bar_ary[1,iCount],2);
}
id=process_fork(nProc);
for(k=1+(id/2); k<n; k+=nProc/2)
{
if((id%2)==0)
{
sum[id]=u[k] + r * ( z[k] + r * y[k] ) + t * ( u[k+3] + r * u[k+2] );
}
else
{
sum[id]=t * r * r * u[k+1] + t * t * ( u[k+6] + r * ( u[k+5] + r * u[k+4] ));
}
barrier(bar_ary[1,id/2]);
if((id%2) == 0)
{
x[k]=sum[id]+sum[id+1];
}
barrier(bar_ary[1,id/2]);
}
process_join(nProc,id);
printf(" Results \n");
for(iCount=0; iCount<n ;iCount++)
{
printf(" x[%d]=%.2f \n",iCount,x[iCount]);
}
iCount=0;
while(iCount < ((nProc-1)/2 + 3))
{
cleanup_memory(shmid[iCount]);
iCount++;
}
return 0;
}
/* Output
[divyen@localhost pp-tw5]$ cc -o Prog04 Prog04.c
[divyen@localhost pp-tw5]$ ./Prog04
Results
x[0]=0.00
x[1]=54.00
x[2]=63.00
x[3]=72.00
x[4]=81.00
x[5]=90.00
x[6]=99.00
x[7]=108.00
x[8]=117.00
x[9]=126.00
x[10]=135.00
x[11]=144.00
x[12]=153.00
x[13]=162.00
x[14]=171.00
x[15]=180.00
x[16]=189.00
x[17]=198.00
x[18]=207.00
*/