/** * @brief Determines a storage controller. * * This is the internal function of 'block device' module. The function gets * a pointer to controller structure the device is connected to. * * @param[in] cntrl_list pointer to list of supported controllers. * @param[in] path path to block device in sysfs tree. * * @return Pointer to controller structure if successful, otherwise the function * returns NULL pointer. The NULL pointer means that block devices is * connected to unsupported storage controller. */ struct cntrl_device *block_get_controller(void *cntrl_list, char *path) { return list_first_that(cntrl_list, _compare, path); }
Bool prima_one_loop_round( Bool wait, Bool careOfApplication) { XEvent ev, next_event; fd_set read_set, write_set, excpt_set; struct timeval timeout; int r, i, queued_events; PTimerSysData timer; if ( guts. applicationClose) return false; if (( queued_events = XEventsQueued( DISP, QueuedAlready))) { goto FetchAndProcess; } read_set = guts.read_set; write_set = guts.write_set; excpt_set = guts.excpt_set; if ( guts. oldest) { gettimeofday( &timeout, nil); if ( guts. oldest-> when. tv_sec < timeout. tv_sec || ( guts. oldest-> when. tv_sec == timeout. tv_sec && guts. oldest-> when. tv_usec <= timeout. tv_usec)) { timer = guts. oldest; apc_timer_start( timer-> who); if ( timer-> who == CURSOR_TIMER) { prima_cursor_tick(); } else if ( timer-> who == MENU_TIMER) { apc_timer_stop( MENU_TIMER); if ( guts. currentMenu) { XEvent ev; ev. type = MenuTimerMessage; prima_handle_menu_event( &ev, M(guts. currentMenu)-> w-> w, guts. currentMenu); } } else if ( timer-> who == MENU_UNFOCUS_TIMER) { prima_end_menu(); } else { prima_simple_message( timer-> who, cmTimer, false); } gettimeofday( &timeout, nil); } if ( guts. oldest && wait) { if ( guts. oldest-> when. tv_sec < timeout. tv_sec) { timeout. tv_sec = 0; timeout. tv_usec = 0; } else { timeout. tv_sec = guts. oldest-> when. tv_sec - timeout. tv_sec; if ( guts. oldest-> when. tv_usec < timeout. tv_usec) { if ( timeout. tv_sec == 0) { timeout. tv_sec = 0; timeout. tv_usec = 0; } else { timeout. tv_sec--; timeout. tv_usec = 1000000 - (timeout. tv_usec - guts. oldest-> when. tv_usec); } } else { timeout. tv_usec = guts. oldest-> when. tv_usec - timeout. tv_usec; } } if ( timeout. tv_sec > 0 || timeout. tv_usec > 200000) { timeout. tv_sec = 0; timeout. tv_usec = 200000; } } else { timeout. tv_sec = 0; if ( wait) timeout. tv_usec = 200000; else timeout. tv_usec = 0; } } else { timeout. tv_sec = 0; if ( wait) timeout. tv_usec = 200000; else timeout. tv_usec = 0; } if (( r = select( guts.max_fd+1, &read_set, &write_set, &excpt_set, &timeout)) > 0 && FD_ISSET( guts.connection, &read_set)) { if (( queued_events = XEventsQueued( DISP, QueuedAfterFlush)) <= 0) { /* just like tcl/perl tk do, to avoid an infinite loop */ RETSIGTYPE oldHandler = signal( SIGPIPE, SIG_IGN); XNoOp( DISP); XFlush( DISP); (void) signal( SIGPIPE, oldHandler); } FetchAndProcess: if ( queued_events && ( application || !careOfApplication)) { XNextEvent( DISP, &ev); XCHECKPOINT; queued_events--; while ( queued_events > 0) { if (!application && careOfApplication) return false; XNextEvent( DISP, &next_event); XCHECKPOINT; prima_handle_event( &ev, &next_event); guts. total_events++; queued_events = XEventsQueued( DISP, QueuedAlready); memcpy( &ev, &next_event, sizeof( XEvent)); } if (!application && careOfApplication) return false; guts. total_events++; prima_handle_event( &ev, nil); } XNoOp( DISP); XFlush( DISP); } else if ( r < 0) { list_first_that( guts.files, (void*)purge_invalid_watchers, nil); } else { if ( r > 0) { for ( i = 0; i < guts.files->count; i++) { PFile f = (PFile)list_at( guts.files,i); if ( FD_ISSET( f->fd, &read_set) && (f->eventMask & feRead)) { prima_simple_message((Handle)f, cmFileRead, false); break; } else if ( FD_ISSET( f->fd, &write_set) && (f->eventMask & feWrite)) { prima_simple_message((Handle)f, cmFileWrite, false); break; } else if ( FD_ISSET( f->fd, &excpt_set) && (f->eventMask & feException)) { prima_simple_message((Handle)f, cmFileException, false); break; } } } else { XNoOp( DISP); XFlush( DISP); } } send_pending_events(); perform_pending_paints(); kill_zombies(); return application != nilHandle; }