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(); } }
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(); }
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, ¶m)) { 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, ¶m)) { 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; }