Beispiel #1
0
int main(int argc, char **argv)
{	
	clock_t tic = clock();
	FILE *fp; 
	int i, choice, err;
	long numBytes;
	long Inpt= 0;
	int rem = 0;
	pid_t pid[NUM_THR_PROC];
	struct primeArr *primeArray;
	int object_size = 1024 * 1024 * 600;
	sigset_t blockMask, origMask;
    struct sigaction saIgnore, saOrigQuit, saOrigInt, saDefault;
	
	printf("Please enter the max integer to search through for primes: ---->    ");
	scanf("%ld",&Inpt);
//	derp(Inpt);



//	Used this function to initially get my numbers into a BITMAP
//	primeArray = crinit_primeArr(Inpt);
//	IgnorePts(primeArray);
//	p_primeArr(primeArray);						//<<<-------------------------
//	mapPrimes(primeArray->num, Inpt);
//	freeArr(primeArray);

	
	//The number of bytes we want to pull in 
	
	numBytes = Inpt / 4; 							//4 numbers are kept per char.
//	printf("ERROR\n");
	if (Inpt % 4 > 0) { numBytes++;}
//	printf("ERROR\n");
	unsigned char *myPrimes = malloc(sizeof(unsigned char*) * numBytes);
	//char myPrimes[numBytes];						//So we get an array of that many chars(x4 numbers)
//	printf("ERRORhelp\n");
	
	//We open our bitmap(hashed in chars) and set it in the global list array
	fp = fopen("bitMap", "r");
	fread(List, sizeof(myPrimes[0]), numBytes, fp );
	//printf("ERROR\n");	
	Inpt = numBytes / NUM_THR_PROC;
	rem = numBytes % NUM_THR_PROC;

	printf("Would you like to run threads or system? 1 for threads, 2 for system, anything else to quit");
	scanf("%d",&choice); 
	
	//SIGNAL DEALING
	
	sigemptyset(&blockMask);            /* Block SIGCHLD */
    sigaddset(&blockMask, SIGCHLD);
    sigprocmask(SIG_BLOCK, &blockMask, &origMask);

    saIgnore.sa_handler = SIG_IGN;      /* Ignore SIGINT and SIGQUIT */
    saIgnore.sa_flags = 0;
    sigemptyset(&saIgnore.sa_mask);
    sigaction(SIGINT, &saIgnore, &saOrigInt);
    sigaction(SIGQUIT, &saIgnore, &saOrigQuit);
	if(choice == 1)
		runThreads(numBytes, Inpt, rem);
		
	if(choice == 2)
	{
		void *myAddr = mount_shmem("/shProc", object_size);
		myAddr = List;
		
		for(i = 0; i < NUM_THR_PROC; i++)
		{
			for(i=0; i<NUM_THR_PROC; ++i)
			{
				d[i].Depth = numBytes;
				int j = 0;
				int k = 0;
				d[i].offset = i;
				d[i].sliceSt = (Inpt * i);										
				d[i].sliceEnd = Inpt * (i + 1);
				
				//If it is our last fork or thread...
				if(i == NUM_THR_PROC - 1)
				{
					d[i].sliceEnd = d[i].sliceEnd + rem;
				}
			}
		}
		for(i = 0; i < NUM_THR_PROC; i++)
		{		
			switch(pid[i] = fork())
			{
				case -1:
					fprintf(stderr, "Fork failed");
				case 0: //child process
					saDefault.sa_handler = SIG_DFL;
					saDefault.sa_flags = 0;
					sigemptyset(&saDefault.sa_mask);

					if (saOrigInt.sa_handler != SIG_IGN)
						sigaction(SIGINT, &saDefault, NULL);
					if (saOrigQuit.sa_handler != SIG_IGN)
						sigaction(SIGQUIT, &saDefault, NULL);

					sigprocmask(SIG_SETMASK, &origMask, NULL);
					printf("%d start: \n", d[i].sliceSt);
					printf("%d end: \n", d->sliceEnd);
					runSystem(d[i].sliceSt, d[i].sliceEnd, d[i].offset);
					
					exit(EXIT_SUCCESS);
				default:
					break;
			}
		}
		
	}

	//Parse the char array and extract all happy primes with this FUNCtion.
	mapTurnin(numBytes);
	
	while(wait(NULL) != -1);
    shm_unlink("/shProc");
	

	clock_t toc = clock();

    printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
	return EXIT_SUCCESS;
}
Beispiel #2
0
int main(int argc, char **argv)
{
	if(argc != 5){
		printf("[P or T] [# of P or T] [max prime] [print y/n] \n");
		exit(EXIT_FAILURE);
	}
	char type = argv[1][0];
	if(type != 'p' && type != 'P' && type != 't' && type != 'T'){
		printf("invalid process type, need either p or t\n");
		exit(EXIT_FAILURE);
	}
	int num = atoi(argv[2]);
	if(num > 0)
		num_proc = num;
	else{
		printf("invalid number of p/t\n");
		exit(EXIT_FAILURE);
	}
	unsigned long max;
	if((max = atol(argv[3])) > 0)
		max_num = max;
	else{
		printf("invalid max number\n");
		exit(EXIT_FAILURE);
	}
	char print;
	if (argv[4][0] == 'y' || argv[4][0] == 'n') {
		print = argv[4][0];
	} else {
		printf("Invalid entry for print primes.\n")
		exit(EXIT_FAILURE);
	}
	struct sigaction act;

	sigemptyset(&act.sa_mask);
	act.sa_handler = nevermore;
	act.sa_flags = 0;

	sigaction(SIGQUIT, &act, NULL);
	sigaction(SIGINT, &act, NULL);
	sigaction(SIGHUP, &act, NULL);

	printf("hello progra\nm");
	unsigned long primes_size = max_num / BITS_PER_WORD + 1;
	printf("shouldn't be an error before here\n");
	void *addr = mount_shmem(SHM_NAME, primes_size);
	printf("memory is mounted");
	primes = (unsigned char *) addr;
	printf("primes did something I don't understand\n");
	set_bitmap();
	printf("bitmap is set");
	seed_primes();
	printf("primes are seeded");
	fork();
	printf("children have lived and died");
	shm_unlink(SHM_NAME);
	int pid = 0;
	while((pid=wait(NULL))!= -1)
		continue;
	if(errno!=ECHILD)
		perror("couldn't kill child processes");
	free(process_array);
	printf("everything has been freed");
	return 0;
}
Beispiel #3
0
int main(int argc, char *argv[])
{
	uint32_t i, j, k;
	uint32_t m;
	uint32_t byte, bit;
	struct sigaction msa;
	struct sigaction csa;
	uint64_t object_size =  BYTES + 1024*1024;
	int opt;

	/* child variables */
	uint32_t nmult;
	uint32_t mpert;
	uint32_t temp;
	uint32_t a;
	uint32_t cbyte, cbit;
	uint32_t start, end;
	uint32_t prime;

	if (argc < 2)
	{
		printf("Indicate the number of threads.\n");
		exit(EXIT_FAILURE);
	}
	
	/* map shared memory object, allocate into it */
	nproc = atoi(argv[1]);
	if (nproc > MAX_PROC)
	{
		printf("The process limit is 8.\n");
		exit(EXIT_FAILURE);
	}
	path = "/hari_primes";
	pstruct = mount_shmem(path, object_size);
	cfinder = (struct compFinder *) pstruct;
	bzero(cfinder, sizeof(struct compFinder));

	cfinder->nlist = (unsigned char *) (&cfinder[1]);
	find = &cfinder->find[0];
	complete = &cfinder->complete[0];
	getid = (sem_t *) (&cfinder->nlist[BYTES]);

	/* initialize composite finder struct and number list */
	bzero(cfinder->nlist, BYTES);
	cfinder->nproc = nproc;

	/* initialize semaphores */
	for (i = 0; i < nproc; i++)
	{
		sem_init(&find[i], 1, 0);
		sem_init(&complete[i], 1, 0);
	}

	sem_init(getid, 1, 1);

	/* install signal handler */
	sigemptyset(&msa.sa_mask);
	msa.sa_flags = 0;
	msa.sa_handler = mhandler;
	if (sigaction(SIGINT, &msa, NULL) == -1)
	{
		int j;
		for (j = 0; j < cfinder->nproc; j++)
		{
			sem_destroy(&find[j]);
			sem_destroy(&complete[j]);
		}
		sem_destroy(getid);
	
		for (j = 0; j < nproc; j++)
			wait(NULL);

		if (shm_unlink(path) == -1)
		{
			perror("unlink shared memory\n");
			exit(EXIT_FAILURE);
		}
		
		exit(EXIT_FAILURE);

	}


	/* initialize mask */
	for (i = 0; i < 8; i++)
	{
		cfinder->mask[i] = 1 << (8-i-1);
	}

	cfinder->total = (uint32_t) ((unsigned long)(BYTES) * 8 - 1);

	/* mark the number 1 as special */
	cfinder->nlist[0] = cfinder->nlist[0] | cfinder->mask[1];
	cfinder->done = 0;

	/* create composite marking processes */
	for (i = 0; i < nproc; i++)
	{
		switch(fork())
		{
			case -1:
		
				for (j = 0; j < nproc; j++)
				{
					sem_destroy(&find[j]);
					sem_destroy(&complete[j]);
				}
				sem_destroy(getid);
				if (shm_unlink(path) == -1)
				{
					perror("unlink pstruct\n");
					exit(EXIT_FAILURE);
					perror("forking");
				}
		
				exit(EXIT_FAILURE);
				break;
			case 0: /* child */
				
				/* install child signal handler */
				sigemptyset(&csa.sa_mask);
				csa.sa_flags = 0;
				csa.sa_handler = chandler;
				if (sigaction(SIGINT, &csa, NULL) == -1)
				{
					exit(EXIT_FAILURE);
				}

				/* get process number */
				sem_wait(getid);
				temp = cfinder->procNo;
				cfinder->procNo++;
				sem_post(getid);
				/* wait for signal and get prime */
				while(1)
				{
					sem_wait(&cfinder->find[temp]);
					if (cfinder->done)
						break;
					prime = cfinder->prime;
					nmult = cfinder->total / prime;
					mpert = nmult / cfinder->nproc;
			
	
					if (!mpert)
					{
						/* multiples per thread greater
						   than the number of threads */
						for (a = 0; a < nmult - 1; a++)
						{
							if (temp == a)
							{
								start = (a + 2) * prime;
								end = (a + 2) * prime;
							}
						}
		
						for (a = nmult - 1; a < cfinder->nproc; a++)
						{
							/* for inactive threads
							 just make start
							 arbitrarily greater
							 than end */
							if (temp == a)
							{
								start = 4;
								end = 2;
							}
						}
					}
					else	
					{	
						/* set start composite number */
						if (!temp)
							start = 2 * prime;
						else
						{
							start = (temp * mpert + 2) * prime;
							/* set start to first
							   multiple in byte */
							while (1)
							{
								if ( (start / 8) != ((start - prime) / 8))
								{
									/* first
									multiple
									in byte
									*/
									break;
								}
								start += prime;
							}
						}	
				
						/* set end composite number */	
						if (temp == (cfinder->nproc - 1))
						{
							end = nmult * prime;
						}
						else
						{
							end = ((temp + 1) * mpert + 1) * prime;
							while(1)
							{
								/* set end to
								 last multiple
								 of byte */
								if ( ((end + prime) / 8) != (end / 8))
								{
									/* last
									multiple
									of byte
									*/
									break;
								}
								end += prime;
							}
						}	
					}
					for (a = start; a <= end; a += prime)
					{
						if (!(a % 2) && prime != 2)
						{
							if ( (cfinder->total - a) < prime)
								break;
							continue;
						}
						cbyte = a / 8;
						cbit = a % 8;
						cfinder->nlist[cbyte] = cfinder->nlist[cbyte] | cfinder->mask[cbit];
						if ( (cfinder->total - a) < prime)
							break;
					}
					sem_post(&cfinder->complete[temp]);
				}
				sem_post(&cfinder->complete[temp]);

				/* happy/sad determination */
				sem_wait(&cfinder->find[temp]);
				if (cfinder->happy | cfinder->sad)
				{
					/* divide up list of numbers */
					struct bag *hcheck = (struct bag *) malloc(sizeof(struct bag));
					char buf[33];
					if (!temp)
						start = 0;
					else
						start = temp * (BYTES / cfinder->nproc);
					if (temp == (cfinder->nproc - 1))
						end = BYTES - 1;
					else 
						end = (temp + 1) * (BYTES / cfinder->nproc) - 1;

					/* iterate through prime numbers in region */
					for (cbyte = start; cbyte <= end; cbyte++)
					{
						for (cbit = 0; cbit < 8; cbit++)
						{
							i = 8 * cbyte + cbit;
						/* algorithm similar to that shown in 
						   wikipedia page on happy/sad primes */
							if (!(cfinder->nlist[cbyte] & cfinder->mask[cbit]))
							{
								prime = i;
								initBag(hcheck);
								addToBag(hcheck, 0);
								while ((i > 1) && (!bagContains(hcheck,i)))
								{
									addToBag(hcheck, i);
									sprintf(&buf[0], "%u", i);
									i = calcInterm(&buf[0]);

								}
								if (i == 1 && cfinder->phappy)
								{
									printf("happy: %u\n", prime);
								}

								else if (i != 1 && cfinder->psad)
								{
									if (i)	/* i != 0 */
										printf("sad: %u\n", prime);
								}
								else {
								}

								freeBag(hcheck);	
							}
						}
					}
					free(hcheck);
				}

				exit(EXIT_SUCCESS);
				break;
			default:
				
				break;
		}
	}
	/* perform sieve, mark off composites */
	for (i = 2; i <= sqrt(cfinder->total);)
	{
		/* find first unmarked number */
		j = i;
		while(j < cfinder->total)
		{
			byte = j / 8;
			bit = j % 8;
			if (!(cfinder->nlist[byte] & cfinder->mask[bit]))
			{
				break;
			}
			j++;
		}
		if (j >= cfinder->total)
			break;
		cfinder->prime = j;
		/* allowing threads now to cross off composites */
		for(k = 0; k < nproc; k++)
			sem_post(&find[k]);
	
		/* waiting for all threads to finish before getting next prime 
		 */
		for (k = 0; k < nproc; k++)
		{
			if (sem_wait(&complete[k])==-1)
				perror("error\n");
		}
		i = ++j; 
	}
	cfinder->done = 1;

	/* telling processes to terminate */
	for(k = 0; k < nproc; k++)
		sem_post(&find[k]);

	for (k = 0; k < nproc; k++)
		sem_wait(&complete[k]);

	/* check what to do next */
	while ((opt = getopt(argc, argv, "phs")) == 'p')
	{
		printBitMap(cfinder, 1, cfinder->total);
	}

	/* set the proper flags */
	while (opt != -1)
	{
		if (opt == 'h')
		{
			printf("happy primes will be found\n");
			cfinder->happy = 1;
			if (getopt(argc, argv, "phs") == 'p')
			{
				printf("happy primes will be printed \n");
				cfinder->phappy = 1;
			}
		}
		else if (opt == 's')
		{
			printf("sad primes will be found\n");
			cfinder->sad = 1;
			if (getopt(argc, argv, "phs") == 'p')
			{
				printf("sad primes will be printed\n");
				cfinder->psad = 1;
			}
		}
		else
		{
			printf("we're done \n");
		}
		opt = getopt(argc, argv, "phs"); 
	}

	/* start up processes again after setting flags */
	for(k = 0; k < nproc; k++)
		sem_post(&find[k]);

	for (k = 0; k < nproc; k++)
		wait(NULL); 

	/* destroy semaphores, delete shared memory object */
	for (j = 0; j < nproc; j++)
	{
		sem_destroy(&find[j]);
		sem_destroy(&complete[j]);
	}
	sem_destroy(getid);
	if (shm_unlink(path) == -1)
	{
		perror("unlink pstruct\n");
		exit(EXIT_FAILURE);
	}
	
	return 0;
}