コード例 #1
0
ファイル: parmake.c プロジェクト: Xuefeng-Zhu/parallel-make
void *run_thread(void *args)
{
	arg_t *run_args = (arg_t *)args;
	
	while(1)
	{
		if (queue_size(run_args->ready_r) == 0 && 
			queue_size(run_args->rest_r) == 0)
		{
			return NULL;	
		}
		sem_wait(run_args->ready_sem);
		while(queue_size(run_args->ready_r) == 0)
		{
			if (queue_size(run_args->ready_r) == 0 && 
				queue_size(run_args->rest_r) == 0)
			{
				sem_post(run_args->ready_sem);
				return NULL;	
			}
			sem_wait(run_args->ready_sem);
		}
		rule_t *rule;
		pthread_mutex_lock(run_args->m);
		rule = queue_dequeue(run_args->ready_r);
		pthread_mutex_unlock(run_args->m);

		while(queue_size(rule->commands))
		{
			char *command = queue_dequeue(rule->commands);
			if (system(command) != 0)
			{
				exit(1);	
			}
			free(command);
		}

		char *temp = rule->target;
		while(queue_size(rule->deps))
		{
			char *dep = queue_dequeue(rule->deps);
			free(dep);
		}
		rule_destroy(rule);
		free(rule);
		
		pthread_mutex_lock(run_args->m);
		int pSize = queue_size(run_args->ready_r);
		queue_enqueue(run_args->complete_t, temp);
		process_queues(run_args->rest_r, run_args->ready_r, run_args->complete_t);
		int cSize = queue_size(run_args->ready_r);
		pthread_mutex_unlock(run_args->m);
		int i;
		for(i = 0; i < cSize - pSize; i++)
		{
			sem_post(run_args->ready_sem);
		}
		sem_post(run_args->ready_sem);
	}
}
コード例 #2
0
bool FServerIrcBotPlugin::initialize()
{
	bug_fun();

	log("I: Starting queue processing");
	process_queues_fut = std::async(std::launch::async, [&]{process_queues();});

	add
	(
		  "files" // trigger
		, "@ammo" // default alias
		, "<no help found>" // default help
		, [&](const message& msg){ files(msg); }
	);
	add
	(
		  "serve"
		, "!ammo"
		, "<filename> - download specific file."
		, [&](const message& msg){ serve(msg); }
	);
	bot.add_monitor(*this);
	return true;
}
コード例 #3
0
ファイル: parmake.c プロジェクト: Xuefeng-Zhu/parallel-make
/**
 * Entry point to parmake.
 */
int main(int argc, char **argv)
{
	int opt;
	int count = 0;
	char *fname = NULL; 
	int nthreads = 1; 
	char **targets = NULL;

	while ((opt = getopt(argc, argv, "f:j:")) != -1)
	{
		switch (opt)
		{
			case 'f':
				count++;
				fname = optarg;
				break;
			case 'j':
				count++;
				nthreads = atoi(optarg);
				break;
		}
	}

	if (fname == NULL)
	{
		//check if ./makefile exists
		if (access("./makefile", R_OK) == 0)
		{
			fname = "./makefile";
		}
		else 
		{
			//check if ./Makefile exists
			if (access("./Makefile", R_OK) == 0)
			{
				fname = "./Makefile";	
			}
			else 
			{
				return -1;	
			}
		}
	}
	else 
	{
		//check if file exists
		if (access(fname, R_OK) == -1)
		{
			return -1;	
		}
	}

	int tlength = argc - 2 * count;
	if (tlength > 1)
	{
		int temp = 1 + 2 * count;
		int i;
		targets = malloc(tlength * sizeof(char*));
		for (i = 0; i < tlength-1; i++)
		{
			targets[i] = argv[temp + i];	
		}

		targets[i] = NULL;
	}

	//part 2 paser makefile 
	all_rules = malloc(sizeof(queue_t));
	all_targets = malloc(sizeof(queue_t));
	queue_init(all_rules);
	queue_init(all_targets);

	parser_parse_makefile(fname, targets, parsed_new_targer, parsed_new_dependency, parsed_new_command);

	//part 3 run rules
	queue_t *ready_r = malloc(sizeof(queue_t));
	queue_t *complete_t = malloc(sizeof(queue_t));
	queue_init(ready_r);
	queue_init(complete_t);
	process_queues(all_rules, ready_r, complete_t);

	while (queue_size(ready_r) == 0)
	{
		process_queues(all_rules, ready_r, complete_t);	
	}

	//part 4 parallel
	
	pthread_mutex_t m;
	pthread_mutex_init(&m, NULL);

	sem_t ready_sem;
	sem_init(&ready_sem, 0, queue_size(ready_r));

	arg_t *run_args = malloc(sizeof(arg_t));
	run_args->m = &m;
	run_args->ready_sem = &ready_sem;
	run_args->rest_r = all_rules;
	run_args->ready_r = ready_r;
	run_args->complete_t =  complete_t;

	pthread_t threads[nthreads];
	int i;

	for (i = 0; i < nthreads; i++)
	{
		pthread_create(&threads[i], NULL, run_thread, (void *)run_args);	
	}

	for (i = 0; i < nthreads; i++)
	{
		pthread_join(threads[i], NULL);	
	}

	//free memory
	while(queue_size(complete_t))
	{
		char *target = queue_dequeue(complete_t);
		free(target);
	}

	queue_destroy(all_rules);
	queue_destroy(all_targets);
	queue_destroy(ready_r);
	queue_destroy(complete_t);
	free(targets);
	free(all_rules);
	free(all_targets);
	free(ready_r);
	free(complete_t);
	free(run_args);
	return 0; 
}