Ejemplo n.º 1
0
void w_event_deliver_thread(void)
{
    hal_sem_init( &we_sem, "wevent" );
    we_inited = 1;

    hal_set_thread_name("WEvent");
    hal_set_current_thread_priority(PHANTOM_SYS_THREAD_PRIO+1);

    while(1)
    {
        hal_sem_acquire( &we_sem ); // TODO need some 'acquire_all' method to eat all releases

    restart:
        w_lock();

        window_handle_t w;

        queue_iterate_back(&allwindows, w, drv_video_window_t *, chain)
        {
            if( w->events_count )
            {
                if(w->eventDeliverSema)
                    hal_sem_release(w->eventDeliverSema);

                if(w->inKernelEventProcess)
                {
                    w_unlock();
                    w_do_deliver_event(w);
                    goto restart;
                }
            }
        }

        w_unlock();
    }
}
Ejemplo n.º 2
0
void phantom_dump_windows_buf(char *bp, int len)
{
    drv_video_window_t *w;

    w_lock();
    queue_iterate(&allwindows, w, drv_video_window_t *, chain)
    {
        int pn = snprintf( bp, len, "%s%3dx%3d @%3dx%3d z %2d fl%b st%b %s%.10s\x1b[37m\n",
                           (w->state & WSTATE_WIN_FOCUSED) ? "\x1b[32m" : "",
                           w->xsize, w->ysize, w->x, w->y, w->z,
                           w->flags, "\020\01Decor\02!InAll\03NoFocus\04!Pixels\05!Opaq\06OnTop",
                           w->state, "\020\01Focused\02Dragged\03Visible\04Rolled\010Uncov\011InFB",
                           (w->stall ? "STALL " : ""),
                           //w->events_count, w->owner,
                           (w->title ? w->title : "??")
                         );
        len -= pn;
        bp += pn;
    }
    w_unlock();
}
Ejemplo n.º 3
0
int run(cpu_cmds* cmds) {
	int i;
	struct sched_param param;
	//cpu_cmds* cmds;

	//cmds = parse_cpus(argc, argv);

	if (!cmds) {
		ERROR(finish);
	}

	if (pthread_barrier_init(&barrier, NULL, cmds->cpus)) {
		printf("Could not initialize barrier.\n");
		ERROR(cmds_free);
	}

	if (signal(SIGINT, handler) == SIG_ERR || signal(SIGTERM, handler) == SIG_ERR) {
		printf("Signal handler could not be established.\n");
		ERROR(barrier_free);
	}

	sync_barrier = getInteger("sync", 1);  /* sync by default */

	for (i=1; i < cmds->cpus; i++) {
		if (cmds->ratios[i].ratio != cmds->ratios[0].ratio) {
			printf("All CPUs must have the same ratio.\n");
			ERROR(barrier_free);
		}
	}
	
	ratio = cmds->ratios[0].ratio;

	printf("Syncing: %s\n", (sync_barrier) ? "on" : "off");
	printf("Interval: %lld\n", cmds->interval);
	printf("Cpufreq use: %s\n",cmds->cpufreq ? "yes" : "no");

	for (i=0; i < cmds->cpus; i++) {
		printf("CPU %d ratio = %.3f\n", cmds->ratios[i].cpu, cmds->ratios[i].ratio);
	}

	/* go realtime */
	param.sched_priority = sched_get_priority_max(SCHED_FIFO);
	if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &param)) {
		printf("Bloke! I wanna go pro but I can't! :)\n");
		ERROR(barrier_free);
	}

	/* calibrate */

	loops_per_sec = CALIBRATE(LOOP(), 1.0);
	printf("# loops per second = %lld\n", loops_per_sec);

	threads = (pthread_t*)malloc(sizeof(pthread_t) * cmds->cpus);
	if (!threads) {
		printf("Could not allocate threads.\n");
		ERROR(barrier_free);
	}

	for (i=0; i < cmds->cpus; i++) {
		cpu_set_t cpuset;
		param.sched_priority = sched_get_priority_max(SCHED_FIFO);
		if (pthread_create(&threads[i], NULL, thread_fn, (void*)&cmds->interval)) {
			printf("Could not start thread.\n");
			ERROR(threads_free);
		}
		CPU_ZERO(&cpuset);
		CPU_SET(cmds->ratios[i].cpu, &cpuset);
		if (pthread_setaffinity_np(threads[i], sizeof(cpuset), &cpuset)) {
			printf("Could not set affinity.\n");
			ERROR(threads_free);
		}
		if (pthread_setschedparam(threads[i], SCHED_FIFO, &param)) {
			printf("Could not go realtime.\n");
			ERROR(threads_free);
		}
	}
	
  //send_notification();

	while (1) {
		if (ctrlc) {
			printf("CTRL+C received.\n");
			w_lock(); /* begin writing */
			finished = 1;
			w_unlock(); /* stop writing */
			break;
		}
		usleep(100000);
	}

threads_join:
	
	for (i=0; i < cmds->cpus; i++) {
		if (pthread_join(threads[i], NULL)) {
			printf("Threads could not be joined.\n");
			ERROR(threads_free);
		}
	}

	printf("Threads joined.\n");

threads_free:
	free(threads);
barrier_free:
	pthread_barrier_destroy(&barrier);
cmds_free:
	//free(cmds);
finish:
	printf("return = %d\n", return_value);
	return return_value;
}