Esempio n. 1
0
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;
}
Esempio n. 2
0
File: lold.c Progetto: apirogov/lold
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;
}