/*
 *        	         Exemple "Master.c" PVM versio 3.3
 *		 Susana Maria Bajo Sanchez (ei05646@salleURL.edu)
 *		 Josep Maria Garrell i Guiu (josepmg@salleURL.edu)
 *				Software Paral.lel
 *		           Departament d'Informatica (DI)
 *	               Enginyeria i Arquitectura La Salle
 *		           Universitat Ramon Llull (URL)
 * 			         Curs 1999/2000
*/

#include <stdio.h>
#include "pvm3.h"

#define SIZE 1000
#define NPROCS 5

void main()
{
	int mytid, task_ids[NPROCS];
	int a[SIZE], results[NPROCS], sum=0;
	int cc, i, msgtype, num_data = SIZE/NPROCS;

	// salida estandar por pantalla
	pvm_catchout(stdout);

	mytid = pvm_mytid();
	printf("Master: Soy la tarea #%x\n",mytid);

	for (i=0;i<SIZE;i++) a[i] =i%25;

	// se crea la tarea hija 'worker' 
	cc = pvm_spawn("Worker",(char**)0,0,"",NPROCS,task_ids);
	if (cc==NPROCS)
		{
		printf("Master: He podido crear las %d tareas 'Worker'\n",NPROCS);

		// enviar datos a las tareas 'Worker'
		for (i=0;i<NPROCS;i++)
			{
			printf("Master: Tarea 'Worker' #%x\n",task_ids[i]);

 			pvm_initsend(PvmDataDefault);
			printf("Master: Inicializo el SEND\n");

			pvm_pkint(&num_data,1,1);
			printf("Master: Empaqueto el entero %d\n",num_data);

			pvm_pkint(&a[num_data+1],num_data,1);
			printf("Master: Empaqueto el entero %d\n",a[num_data+1]);

			pvm_send(task_ids[i],4);
			printf("Master: Envio a la tarea %x con msgtag 4\n",task_ids[i]);
			}

		// esperar los resultados
		msgtype = 7;
		printf("Master: Espero resultados con msgtag 7\n");
		for (i=0;i<NPROCS;i++)
			{
			pvm_recv(task_ids[i],msgtype);
			printf("Master: Recibo de la tarea 'Worker' %x\n",task_ids[i]);
			pvm_upkint(&results[i],1,1);
			printf("Master: Desempaqueto el entero %d\n",results[i]);
			sum +=results[i];
			printf("Master: El valor actual de 'sum' es %d\n",sum);
			}
		printf("Master: La suma total es %d \n",sum);
		}
		else printf("Master: No he podido crear la tarea 'Worker'\n");

printf("Master: Salgo de PVM\n");
pvm_exit();
}

