int main(int argc, char **argv) { int errcode; long nbcpus; double timestart; double timedelta; double olddelta; char msg[256] = {0}; int counter; struct fly_task *tasks[NBTASKS]; struct task_param task_params[NBTASKS]; init_data(task_params, NBTASKS, TASKARRSIZE); nbcpus = sysconf(_SC_NPROCESSORS_ONLN); if (nbcpus < 0) nbcpus = 2; /* hardcode to some multithread value... */ /* start libfly with nbcpus threads */ errcode = fly_simple_init(nbcpus); fly_assert(FLY_SUCCEEDED(errcode), "fly_simple_init failed"); /* start task profiling - including tasks creation */ timestart = get_time_in_usec(); for (counter = 0; counter < NBTASKS; counter++) { tasks[counter] = fly_create_task(task_func, &task_params[counter]); if (!tasks[counter]) { clean_tasks(tasks, counter); fly_assert(0, "fly_create_task failed"); fly_uninit(); uninit_data(task_params, NBTASKS); return -1; } } for (counter = 0; counter < NBTASKS; counter++) { errcode = fly_push_task(tasks[counter]); if (!FLY_SUCCEEDED(errcode)) { fly_wait_tasks(tasks, counter - 1); clean_tasks(tasks, NBTASKS); fly_assert(0, "fly_push_task failed"); fly_uninit(); uninit_data(task_params, NBTASKS); return -1; } } errcode = fly_wait_tasks(tasks, NBTASKS); timedelta = get_time_diff_in_usec(timestart); sprintf(msg, "tasks execution took:\t\t%f us", timedelta); fly_log("[test_recurse]", msg); (void)errcode; fly_assert(FLY_SUCCEEDED(errcode), "flay_wait_tasks return error"); clean_tasks(tasks, NBTASKS); validate_log(task_params, NBTASKS); olddelta = timedelta; timestart = get_time_in_usec(); for (counter = 0; counter < NBTASKS; counter++) { int j; for (j = 0; j < TASKARRSIZE; j++) { parallel_for_func(j, &task_params[counter]); } } timedelta = get_time_diff_in_usec(timestart); sprintf(msg, "for loop execution took:\t%f us", timedelta); fly_log("[test_recurse]", msg); sprintf(msg, "speed bump:\t\t\t%f", timedelta / olddelta); fly_log("[test_recurse]", msg); /* shutdown libfly */ errcode = fly_uninit(); (void)errcode; fly_assert(FLY_SUCCEEDED(errcode), "fly_uninit failed"); uninit_data(task_params, NBTASKS); return 0; }
int main(int argc, char *argv[]) { if (eval_flag(argc,argv,"-h\0")) { printf("Usage: lold [-p PORT] [-D DELAY] [-d DEVICE]\n\n"); return EXIT_FAILURE; } delay = int_arg(eval_arg(argc, argv, "-D\0", NULL), DEF_DELAY); port = int_arg(eval_arg(argc, argv, "-p\0", NULL), DEF_LOLD_PORT); device = eval_arg(argc, argv, "-d\0", NULL); to_stdout = eval_flag(argc, argv, "--stdout\0"); if (!to_stdout && device==NULL) //no device provided? device = autodetect(); if (!device && !to_stdout) //no device found by autodetect? fprintf(stderr, "No serial USB device found! (Try -d flag?) Output to stdout.\n"); pthread_mutex_init(&imutex, NULL); //init mutex for interrupted flag pthread_mutex_init(&qmutex, NULL); //init mutex for queue //Start web server thread listening for clients sending stuff pthread_t serverThread; pthread_create(&serverThread, NULL, server_thread, NULL); pthread_detach(serverThread); //trap INT signal(SIGINT, sig_handler); LolTask *currtask = NULL; //task currently being executed //clean lolshield render_frame(device, EMPTY_FRAME); //loop outputting animation frames to device while (!shutting_down) { //do nothing if some client is streaming if (streaming) { sleep_ms(100); continue; } //New task arrived -> check stuff pthread_mutex_lock(&imutex); if (interrupted) { interrupted = 0; if (DEBUG) fprintf(stderr, "New task inserted!\n"); if (queue==NULL) exit(EXIT_FAILURE); //can not happen! pthread_mutex_lock(&qmutex); LolTask *first = (LolTask*)(queue->value); pthread_mutex_unlock(&qmutex); //new arrived has higher priority? cancel current ani if (currtask != NULL && first->pri > currtask->pri) { loltask_free(currtask); currtask = NULL; if (DEBUG) fprintf(stderr, "Ani cancelled\n"); } } pthread_mutex_unlock(&imutex); //load new task if neccessary if (currtask == NULL) { pthread_mutex_lock(&qmutex); currtask = lollist_shift(&queue); pthread_mutex_unlock(&qmutex); if (DEBUG) if (currtask != NULL) fprintf(stderr, "Ani start\n"); } //nothing in queue -> just wait if (currtask == NULL) { sleep_ms(delay); continue; } //animation delay sleep_ms(currtask->delay); //get next frame char *frame = lollist_shift(&(currtask->frames)); //current animation done? if (frame == NULL) { currtask = NULL; clean_tasks(); //remove aged tasks //render empty frame to clean lolshield -> breaks hardware text message //render_frame(device, EMPTY_FRAME); sleep_ms(delay); if (DEBUG) fprintf(stderr, "Ani done\n"); continue; } //render next frame render_frame(device, frame); free(frame); } if (DEBUG) fprintf(stderr, "Shutting down\n"); //shutting down render_frame(device, EMPTY_FRAME); //clean lolshield serialport_close(port); //close port pthread_cancel(serverThread); //kill server pthread_mutex_destroy(&qmutex); //uninit mutex pthread_mutex_destroy(&imutex); //uninit mutex close(svr_sock); //close server listening socket pthread_exit(NULL); return EXIT_SUCCESS; }