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); } }
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; }
/** * 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; }