void lua_engine::serve_lua() { osd_sleep(osd_ticks_per_second() / 1000 * 50); printf("%s v%s - %s\n%s\n%s\n\n", emulator_info::get_applongname(),build_version,emulator_info::get_fulllongname(),emulator_info::get_copyright_info(),LUA_COPYRIGHT); fflush(stdout); char buff[LUA_MAXINPUT]; astring oldbuff; const char *b = LUA_PROMPT; do { // Wait for input fputs(b, stdout); fflush(stdout); /* show prompt */ fgets(buff, LUA_MAXINPUT, stdin); // Create message osd_lock_acquire(lock); if (msg.ready == 0) { msg.text = oldbuff; if (oldbuff.len()!=0) msg.text.cat("\n"); msg.text.cat(buff); msg.ready = 1; msg.done = 0; } osd_lock_release(lock); // Wait for response int done = 0; do { osd_sleep(osd_ticks_per_second() / 1000); osd_lock_acquire(lock); done = msg.done; osd_lock_release(lock); } while (done==0); // Do action on client side osd_lock_acquire(lock); if (msg.status == -1){ b = LUA_PROMPT2; oldbuff = msg.response; } else { b = LUA_PROMPT; oldbuff = ""; } msg.done = 0; osd_lock_release(lock); } while (1); }
void web_engine::close() { m_exiting_core = 1; osd_sleep(osd_ticks_per_second()/5); for (simple_list_wrapper<mg_connection> *curitem = m_websockets.first(); curitem != NULL; curitem = curitem->next()) { mg_websocket_write(curitem->object(), WEBSOCKET_OPCODE_CONNECTION_CLOSE, NULL, 0); } // Stop the server. mg_stop(m_ctx); }
static void sdlwindow_sync(void) { if (multithreading_enabled) { // Fallback while (!osd_work_queue_wait(work_queue, osd_ticks_per_second()*10)) { mame_printf_warning("sdlwindow_sync: Sleeping...\n"); osd_sleep(100000); } } }
osd_ticks_t video_manager::throttle_until_ticks(osd_ticks_t target_ticks) { // we're allowed to sleep via the OSD code only if we're configured to do so // and we're not frameskipping due to autoframeskip, or if we're paused bool allowed_to_sleep = false; if (machine().options().sleep() && (!effective_autoframeskip() || effective_frameskip() == 0)) allowed_to_sleep = true; if (machine().paused()) allowed_to_sleep = true; // loop until we reach our target g_profiler.start(PROFILER_IDLE); osd_ticks_t minimum_sleep = osd_ticks_per_second() / 1000; osd_ticks_t current_ticks = osd_ticks(); while (current_ticks < target_ticks) { // compute how much time to sleep for, taking into account the average oversleep osd_ticks_t delta = (target_ticks - current_ticks) * 1000 / (1000 + m_average_oversleep); // see if we can sleep bool slept = false; if (allowed_to_sleep && delta >= minimum_sleep) { osd_sleep(delta); slept = true; } // read the new value osd_ticks_t new_ticks = osd_ticks(); // keep some metrics on the sleeping patterns of the OSD layer if (slept) { // if we overslept, keep an average of the amount osd_ticks_t actual_ticks = new_ticks - current_ticks; if (actual_ticks > delta) { // take 90% of the previous average plus 10% of the new value osd_ticks_t oversleep_milliticks = 1000 * (actual_ticks - delta) / delta; m_average_oversleep = (m_average_oversleep * 99 + oversleep_milliticks) / 100; if (LOG_THROTTLE) machine().logerror("Slept for %d ticks, got %d ticks, avgover = %d\n", (int)delta, (int)actual_ticks, (int)m_average_oversleep); } } current_ticks = new_ticks; } g_profiler.stop(); return current_ticks; }
void *web_engine::websocket_keepalive() { while(!m_exiting_core) { osd_ticks_t curtime = osd_ticks(); if ((curtime - m_lastupdatetime) > osd_ticks_per_second() * 5) { m_lastupdatetime = curtime; for (simple_list_wrapper<mg_connection> *curitem = m_websockets.first(); curitem != NULL; curitem = curitem->next()) { int status = mg_websocket_write(curitem->object(), WEBSOCKET_OPCODE_PING, NULL, 0); if (status==0) m_websockets.detach(*curitem); // remove inactive clients } } osd_sleep(osd_ticks_per_second()/5); } return NULL; }
void wait_next_vsync() { #ifndef BENCHMARK static double lasttime = 0, lastcurtime = 0, frametime = 0.1; double curtime; const double deltatime = (1.0 / 60.0); curtime = osd_getTime(); osd_sleep(lasttime + deltatime - curtime); curtime = osd_getTime(); lastcurtime = curtime; lasttime += deltatime; if ((lasttime + deltatime) < curtime) lasttime = curtime; #endif }
void osd_usleep(int64_t usecs) { int secs = (int)(usecs / 1000000); FUN("osd_usleep"); if (usecs <= 0) return; if (secs > 0) { LOG(L_DEBUG,("sleep(%d)\n", secs)); osd_sleep(secs); usecs -= (int64_t)1000000 * secs; } if (usecs > 0) { #ifdef __CYGWIN__ if (usecs <= 500) usecs = 501; #endif LOG(L_DEBUG,("usleep(%lld)\n", usecs)); usleep(usecs); } }