int barrier::notify_and_wait(const int barrier_id) { if (barrier_id < 1 || barrier_id > barrier_ids.size()) { return -1; } int index = barrier::id_to_index(barrier_id); #ifdef __GXX_EXPERIMENTAL_CXX0X__ std::unique_lock<std::mutex> lck(barrier_lock); #else pthread_mutex_lock(&barrier_lock); #endif if (barrier_ids[index] == nclient) { barrier_ids[index] = 0; } #ifdef __GXX_EXPERIMENTAL_CXX0X__ lck.unlock(); #else pthread_mutex_unlock(&barrier_lock); #endif // remote_notify needs to be after the above boundary check. // otherwise the check may include the effect of this notify. remote_notify(barrier_id); #ifdef __GXX_EXPERIMENTAL_CXX0X__ lck.lock(); #else pthread_mutex_lock(&barrier_lock); #endif while (barrier_ids[index] < nclient) { #ifdef __GXX_EXPERIMENTAL_CXX0X__ barrier_cond.wait(lck); #else pthread_cond_wait(&barrier_cond, &barrier_lock); #endif } #ifndef __GXX_EXPERIMENTAL_CXX0X__ pthread_mutex_unlock(&barrier_lock); #endif return 0; }
void handle_X_events_sdl (void) { SDL_Event ev; unsigned int key; while (SDL_PollEvent(&ev)) { switch(ev.type){ case SDL_VIDEOEXPOSE: // SDL render event render_sdl(buffer); break; case SDL_QUIT: if ((interaction_override&OVR_QUIT_KEY) == 0) loop_flag=0; break; case SDL_KEYDOWN: key = ev.key.keysym.sym; if(ev.key.keysym.sym==SDLK_ESCAPE) { if ((interaction_override&OVR_QUIT_KEY) == 0) { loop_flag=0; } else { remote_notify(NTY_KEYBOARD, 310, "keypress=%d", (unsigned int) key); } } else if(ev.key.keysym.sym==SDLK_s) { ui_osd_tc(); } else if(ev.key.keysym.sym==SDLK_a) { sdl_set_ontop(sdl_ontop^=1); } else if(ev.key.keysym.sym==SDLK_f) { sdl_toggle_fullscreen(2); } else if(ev.key.keysym.sym==SDLK_l) { want_letterbox=!want_letterbox; sdl_letterbox_change(); } else if(ev.key.keysym.sym==SDLK_m) { mousecursor_sdl(2); } else if(ev.key.keysym.sym==SDLK_v) { ui_osd_fn(); } else if(ev.key.keysym.sym==SDLK_b) { ui_osd_box(); } else if(ev.key.keysym.sym==SDLK_i) { ui_osd_fileinfo(); } else if(ev.key.keysym.sym==SDLK_g) { ui_osd_geo(); } else if(ev.key.keysym.sym== SDLK_c && ev.key.keysym.mod&KMOD_SHIFT) { ui_osd_clear(); } else if(ev.key.keysym.sym== SDLK_LESS || (ev.key.keysym.sym== SDLK_COMMA && ev.key.keysym.mod&KMOD_SHIFT) ) { // '<' XCresize_scale(-1); } else if(ev.key.keysym.sym== SDLK_GREATER || (ev.key.keysym.sym== SDLK_PERIOD && ev.key.keysym.mod&KMOD_SHIFT) ) { // '>' XCresize_scale(1); } else if(ev.key.keysym.sym==SDLK_PERIOD) { XCresize_percent(100); resize_sdl(ffctv_width, ffctv_height); } else if(ev.key.keysym.sym== SDLK_COMMA) { // ',' XCresize_aspect(0); } else if(ev.key.keysym.sym==SDLK_o) { ui_osd_offset_cycle(); } else if(ev.key.keysym.sym==SDLK_p) { ui_osd_permute(); } else if(ev.key.keysym.sym== SDLK_BACKSLASH) { XCtimeoffset(0, (unsigned int) key); } else if(ev.key.keysym.sym== SDLK_EQUALS && ev.key.keysym.mod&KMOD_SHIFT) { // '+' SDLK_PLUS does not work :/ XCtimeoffset(1, (unsigned int) key); } else if(ev.key.keysym.sym==SDLK_MINUS) { XCtimeoffset(-1, (unsigned int) key); } else if(ev.key.keysym.sym== SDLK_LEFTBRACKET && ev.key.keysym.mod&KMOD_SHIFT) { // '{' XCtimeoffset(-2, (unsigned int) key); } else if(ev.key.keysym.sym== SDLK_RIGHTBRACKET&& ev.key.keysym.mod&KMOD_SHIFT) { // '}' XCtimeoffset(2, (unsigned int) key); #ifdef CROPIMG } else if(ev.key.keysym.sym== SDLK_LEFTBRACKET) { // '[' } else if(ev.key.keysym.sym== SDLK_RIGHTBRACKET) { // ']' #endif } else if(ev.key.keysym.sym== SDLK_BACKSPACE) { if ((interaction_override&OVR_JCONTROL) == 0) jackt_rewind(); remote_notify(NTY_KEYBOARD, 310, "keypress=%d # backspace", 0xff08); } else if(ev.key.keysym.sym== SDLK_SPACE) { if ((interaction_override&OVR_JCONTROL) == 0) jackt_toggle(); remote_notify(NTY_KEYBOARD, 310, "keypress=%d # space", 0x0020); } else { remote_notify(NTY_KEYBOARD, 310, "keypress=%d", (unsigned int) key); //printf("SDL key event: %x\n", ev.key.keysym.sym); } break; case SDL_VIDEORESIZE: sdl_screen = SDL_SetVideoMode(ev.resize.w, ev.resize.h, 0, MYSDLFLAGS); sdl_rect.w=ev.resize.w; sdl_rect.h=ev.resize.h; resized_sdl(); force_redraw=1; break; case SDL_MOUSEBUTTONUP: switch(ev.button.button) { case SDL_BUTTON_WHEELUP: XCresize_aspect(-1); break; case SDL_BUTTON_WHEELDOWN: XCresize_aspect(1); break; case SDL_BUTTON_MIDDLE: XCresize_aspect(0); break; default: break; } break; case SDL_ACTIVEEVENT: /** Application loses/gains visibility */ /* TODO disable rendering when inactive */ break; case SDL_MOUSEMOTION: break; default: /* unhandled event */ //printf("SDL EVENT: %x\n", ev.type ); break; } } }