diff options
Diffstat (limited to 'fractal-gen.c')
| -rw-r--r-- | fractal-gen.c | 39 | 
1 files changed, 27 insertions, 12 deletions
| diff --git a/fractal-gen.c b/fractal-gen.c index 9b6b2e2..30f405b 100644 --- a/fractal-gen.c +++ b/fractal-gen.c @@ -32,7 +32,9 @@  #include <stdlib.h>  #include <libgen.h>  #include <unistd.h> +#include <signal.h>  #include <math.h> +#include <sys/mman.h>  #include <string.h>  static struct section_generator generators[] = { @@ -55,6 +57,7 @@ int main(int argc, char **argv)  	data_section* sections = NULL;  	data_section *s = NULL;  	generator_func generator = NULL; +	pid_t child = 0;  	/* who are we? */  	argv0 = argv[0]; @@ -77,11 +80,13 @@ int main(int argc, char **argv)  	}  	/* Allocate memory for sections */ -	if ((sections = malloc(sizeof(data_section)*cores)) == NULL) -	{ -		perror("malloc"); +/*	if ((sections = malloc(sizeof(data_section)*cores)) == NULL)*/ +	sections = mmap(NULL, sizeof(data_section)*cores, PROT_READ|PROT_WRITE, +	MAP_SHARED|MAP_ANONYMOUS, -1, 0); +/*	{ +		perror("mmap");  		return 1; -	} +	}*/  	ram_nice = (size*size)/clust_total;  	if (ram_nice < 1024) @@ -122,7 +127,7 @@ int main(int argc, char **argv)  			while(i-- + 1)  				free(sections[i].data); -			free(sections); +			munmap(sections, sizeof(data_section)*cores);  			return 1;  		}  		sections[i].core = i; @@ -133,18 +138,28 @@ int main(int argc, char **argv)  	}  	s = &(sections[cores-1]); -	while((x = s->idx) < s->datasize) + +	switch (child = fork())  	{ -		fprintf(stderr, "Thread %d: %.4f%%\r", -		        cores-1, -		        100.f*(double)x/s->datasize); -		sleep(1); +		case 0: +			while((x = s->idx) < s->datasize) +			{ +				fprintf(stderr, "Thread %d: %.4f%%\r", +						cores-1, +						100.f*(double)x/s->datasize); +				sleep(1); +			} +			break; +		case -1: +			perror("progress thread fork"); +		default: +			break;  	} -  	/* Wait for each thread to complete */  	for (i = 0; i < cores; i++)  		pthread_join(sections[i].thread, NULL); +	kill(child, SIGKILL);  	/* Output PGM Header */  	printf("P5\n%d\n%d\n255\n",size,size/clust_total); @@ -165,7 +180,7 @@ int main(int argc, char **argv)  	for (i = 0; i < cores; i++)  		free(sections[i].data); -	free(sections); +	munmap(sections, sizeof(data_section)*cores);  	return 0;  } | 
