#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include "pvm3.h"			/* includes pvm3.h */
#include "pgpvm2.h"			/* includes pgpvm2.h after pvm3.h */

#define SONS1		"son1"
#define SONS2		"son2"
#define NBSONS1		5		/* nb son1 tasks */
#define NBSONS2		3		/* nb son2 tasks */

void main()
{ int i;				/* variable for loop */
  int mytid;				/* my task id */
  int nbs=NBSONS1+NBSONS2;		/* total number of sons */
  int *tids;				/* tids array */
  int info;				/* pvm info */

  pg_startadmin("", "", NBSONS1+NBSONS2+1);
  pg_tids("y");

  pg_beglab(1);

  tids=(int *)malloc(sizeof(int)*(nbs+1));
  assert(tids!=NULL);
  tids[0]=mytid=pvm_mytid();

  info=pvm_spawn(SONS1, (char **)0, PvmTaskDefault, "", NBSONS1, tids+1);
  info=pvm_spawn(SONS2, (char **)0, PvmTaskDefault, "", NBSONS2, tids+1+NBSONS1);

  pvm_initsend(PvmDataDefault);
  pvm_pkint(&nbs, 1, 1);
  pvm_pkint(tids, nbs+1, 1);
  for (i=1;i<nbs+1;i++) pvm_send(tids[i],1);

  for (i=1;i<nbs+1;i++) pvm_recv(-1,-1);

  sleep(1);

  pg_endlab(1);
 
  info=pvm_spawn(SONS1, (char **)0, PvmTaskDefault, "", NBSONS1, tids+1);
  info=pvm_spawn(SONS2, (char **)0, PvmTaskDefault, "", NBSONS2, tids+1+NBSONS1);

  pvm_initsend(PvmDataDefault);
  pvm_pkint(&nbs, 1, 1);
  pvm_pkint(tids, nbs+1, 1);
  for (i=1;i<nbs+1;i++) pvm_send(tids[i],1);

  for (i=1;i<nbs+1;i++) pvm_recv(-1,-1);

  free(tids);
  pvm_exit();
  exit(0);
}
