summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/lib/osdlib_unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/lib/osdlib_unix.c')
-rw-r--r--src/osd/modules/lib/osdlib_unix.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/osd/modules/lib/osdlib_unix.c b/src/osd/modules/lib/osdlib_unix.c
index f01771dabee..cae75e08871 100644
--- a/src/osd/modules/lib/osdlib_unix.c
+++ b/src/osd/modules/lib/osdlib_unix.c
@@ -4,7 +4,14 @@
#include <sys/mman.h>
#include <sys/types.h>
#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#ifdef SDLMAME_EMSCRIPTEN
+#include <emscripten.h>
+#endif
+// MAME headers
+#include "osdcore.h"
#include "osdlib.h"
//============================================================
@@ -88,3 +95,47 @@ void osd_free(void *ptr)
#error "MALLOC_DEBUG not yet supported"
#endif
}
+
+//============================================================
+// osd_cycles
+//============================================================
+
+osd_ticks_t osd_ticks(void)
+{
+#ifdef SDLMAME_EMSCRIPTEN
+ return (osd_ticks_t)(emscripten_get_now() * 1000.0);
+#else
+ struct timeval tp;
+ static osd_ticks_t start_sec = 0;
+
+ gettimeofday(&tp, NULL);
+ if (start_sec==0)
+ start_sec = tp.tv_sec;
+ return (tp.tv_sec - start_sec) * (osd_ticks_t) 1000000 + tp.tv_usec;
+#endif
+}
+
+osd_ticks_t osd_ticks_per_second(void)
+{
+ return (osd_ticks_t) 1000000;
+}
+
+//============================================================
+// osd_sleep
+//============================================================
+
+void osd_sleep(osd_ticks_t duration)
+{
+ UINT32 msec;
+
+ // convert to milliseconds, rounding down
+ msec = (UINT32)(duration * 1000 / osd_ticks_per_second());
+
+ // only sleep if at least 2 full milliseconds
+ if (msec >= 2)
+ {
+ // take a couple of msecs off the top for good measure
+ msec -= 2;
+ usleep(msec*1000);
+ }
+}