summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/lib/osdlib_macosx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/lib/osdlib_macosx.c')
-rw-r--r--src/osd/modules/lib/osdlib_macosx.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/osd/modules/lib/osdlib_macosx.c b/src/osd/modules/lib/osdlib_macosx.c
index 7aab9eaf78c..4f3b5bd3548 100644
--- a/src/osd/modules/lib/osdlib_macosx.c
+++ b/src/osd/modules/lib/osdlib_macosx.c
@@ -6,11 +6,17 @@
#include <mach/mach.h>
#include <mach/mach_time.h>
+#include <mach/mach_traps.h>
#include <Carbon/Carbon.h>
// MAME headers
+#include "osdcore.h"
#include "osdlib.h"
+// FIXME: We shouldn't use SDL functions in here
+
+#include "sdlinc.h"
+
//============================================================
// osd_process_kill
//============================================================
@@ -102,3 +108,121 @@ int osd_setenv(const char *name, const char *value, int overwrite)
{
return setenv(name, value, overwrite);
}
+
+//============================================================
+// PROTOTYPES
+//============================================================
+
+static osd_ticks_t init_cycle_counter(void);
+static osd_ticks_t mach_cycle_counter(void);
+
+//============================================================
+// STATIC VARIABLES
+//============================================================
+
+static osd_ticks_t (*cycle_counter)(void) = init_cycle_counter;
+static osd_ticks_t (*ticks_counter)(void) = init_cycle_counter;
+static osd_ticks_t ticks_per_second;
+
+//============================================================
+// init_cycle_counter
+//
+// to avoid total grossness, this function is split by subarch
+//============================================================
+
+static osd_ticks_t init_cycle_counter(void)
+{
+ osd_ticks_t start, end;
+ osd_ticks_t a, b;
+
+ cycle_counter = mach_cycle_counter;
+ ticks_counter = mach_cycle_counter;
+
+ // wait for an edge on the timeGetTime call
+ a = SDL_GetTicks();
+ do
+ {
+ b = SDL_GetTicks();
+ } while (a == b);
+
+ // get the starting cycle count
+ start = (*cycle_counter)();
+
+ // now wait for 1/4 second total
+ do
+ {
+ a = SDL_GetTicks();
+ } while (a - b < 250);
+
+ // get the ending cycle count
+ end = (*cycle_counter)();
+
+ // compute ticks_per_sec
+ ticks_per_second = (end - start) * 4;
+
+ // return the current cycle count
+ return (*cycle_counter)();
+}
+
+//============================================================
+// performance_cycle_counter
+//============================================================
+
+//============================================================
+// mach_cycle_counter
+//============================================================
+static osd_ticks_t mach_cycle_counter(void)
+{
+ return mach_absolute_time();
+}
+
+//============================================================
+// osd_cycles
+//============================================================
+
+osd_ticks_t osd_ticks(void)
+{
+ return (*cycle_counter)();
+}
+
+
+//============================================================
+// osd_ticks_per_second
+//============================================================
+
+osd_ticks_t osd_ticks_per_second(void)
+{
+ if (ticks_per_second == 0)
+ {
+ // if we haven't computed the value yet, there's no time like the present
+ init_cycle_counter();
+ }
+ return ticks_per_second;
+}
+
+
+
+//============================================================
+// osd_sleep
+//============================================================
+
+void osd_sleep(osd_ticks_t duration)
+{
+ UINT32 msec;
+
+ // make sure we've computed ticks_per_second
+ if (ticks_per_second == 0)
+ (void)osd_ticks();
+
+ // convert to milliseconds, rounding down
+ msec = (UINT32)(duration * 1000 / 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);
+ }
+}
+