* nanoseconds).
*/
do {
- diff = (gint64) ns_abs - (gint64) clock_get_time_ns ();
+ diff = (gint64) ns_abs - (gint64) mono_clock_get_time_ns (sampling_clock);
if (diff <= 0)
break;
goto init;
}
- mono_clock_init (&sampling_clock);
+ mono_clock_init (sampling_clock);
clock_init_for_profiler (mode);
- for (guint64 sleep = mono_clock_get_time_ns (&sampling_clock); mono_atomic_load_i32 (&sampling_thread_running); clock_sleep_ns_abs (sleep)) {
+ for (guint64 sleep = mono_clock_get_time_ns (sampling_clock); mono_atomic_load_i32 (&sampling_thread_running); clock_sleep_ns_abs (sleep)) {
uint32_t freq;
MonoProfilerSampleMode new_mode;
mono_profiler_get_sample_mode (NULL, &new_mode, &freq);
if (new_mode != mode) {
- mono_clock_cleanup (&sampling_clock);
+ mono_clock_cleanup (sampling_clock);
goto init;
}
} FOREACH_THREAD_SAFE_END
}
- mono_clock_cleanup (&sampling_clock);
+ mono_clock_cleanup (sampling_clock);
done:
mono_atomic_store_i32 (&sampling_thread_exiting, 1);
header->elf_mach = ELF_MACHINE;
header->pad1 = 0;
header->pid = perf_dump_pid;
- header->timestamp = mono_clock_get_time_ns (&clock_id);
+ header->timestamp = mono_clock_get_time_ns (clock_id);
header->flags = 0;
}
// TODO: write debugInfo and unwindInfo immediately before the JitCodeLoadRecord (while lock is held).
- record.header.timestamp = mono_clock_get_time_ns (&clock_id);
+ record.header.timestamp = mono_clock_get_time_ns (clock_id);
fwrite (&record, sizeof (record), 1, perf_dump_file);
fwrite (jinfo->d.method->name, nameLen + 1, 1, perf_dump_file);
add_basic_JitCodeLoadRecord_info (JitCodeLoadRecord *record)
{
record->header.id = JIT_CODE_LOAD;
- record->header.timestamp = mono_clock_get_time_ns (&clock_id);
+ record->header.timestamp = mono_clock_get_time_ns (clock_id);
record->pid = perf_dump_pid;
record->tid = syscall (SYS_gettid);
}
#endif
-#if defined(HOST_DARWIN) || defined(HOST_LINUX)
+#if defined(HOST_DARWIN)
void
-mono_clock_init (void *clk_id)
+mono_clock_init (mono_clock_id_t clk_id)
{
-#ifdef HOST_DARWIN
kern_return_t ret;
do {
- ret = host_get_clock_service (mach_host_self (), SYSTEM_CLOCK, (clock_serv_t *)clk_id);
+ ret = host_get_clock_service (mach_host_self (), SYSTEM_CLOCK, &clk_id);
} while (ret == KERN_ABORTED);
if (ret != KERN_SUCCESS)
g_error ("%s: host_get_clock_service () returned %d", __func__, ret);
-#endif
}
void
-mono_clock_cleanup (void *clk_id)
+mono_clock_cleanup (mono_clock_id_t clk_id)
{
-#ifdef HOST_DARWIN
kern_return_t ret;
do {
- ret = mach_port_deallocate (mach_task_self (), *(clock_serv_t *)clk_id);
+ ret = mach_port_deallocate (mach_task_self (), clk_id);
} while (ret == KERN_ABORTED);
if (ret != KERN_SUCCESS)
g_error ("%s: mach_port_deallocate () returned %d", __func__, ret);
-#endif
}
guint64
-mono_clock_get_time_ns (void *clk_id)
+mono_clock_get_time_ns (mono_clock_id_t clk_id)
{
-#ifdef HOST_DARWIN
-
kern_return_t ret;
mach_timespec_t mach_ts;
do {
- ret = clock_get_time (*(clock_serv_t *)clk_id, &mach_ts);
+ ret = clock_get_time (clk_id, &mach_ts);
} while (ret == KERN_ABORTED);
if (ret != KERN_SUCCESS)
g_error ("%s: clock_get_time () returned %d", __func__, ret);
return ((guint64) mach_ts.tv_sec * 1000000000) + (guint64) mach_ts.tv_nsec;
-
-#else
-
+}
+
+#elif defined(__linux__)
+
+void
+mono_clock_init (mono_clock_id_t clk_id)
+{
+}
+
+void
+mono_clock_cleanup (mono_clock_id_t clk_id)
+{
+}
+
+guint64
+mono_clock_get_time_ns (mono_clock_id_t clk_id)
+{
struct timespec ts;
- if (clock_gettime (*(clockid_t *)clk_id, &ts) == -1)
+ if (clock_gettime (clk_id, &ts) == -1)
g_error ("%s: clock_gettime () returned -1, errno = %d", __func__, errno);
return ((guint64) ts.tv_sec * 1000000000) + (guint64) ts.tv_nsec;
-
-#endif
}
#else
void
-mono_clock_init (void *clk_id)
+mono_clock_init (mono_clock_id_t clk_id)
{
+ // TODO: need to implement this function for PC
+ g_assert_not_reached ();
}
void
-mono_clock_cleanup (void *clk_id)
+mono_clock_cleanup (mono_clock_id_t clk_id)
{
+ // TODO: need to implement this function for PC
+ g_assert_not_reached ();
}
guint64
-mono_clock_get_time_ns (void *clk_id)
+mono_clock_get_time_ns (mono_clock_id_t clk_id)
{
// TODO: need to implement time stamp function for PC
g_assert_not_reached ();
gint64 mono_100ns_datetime_from_timeval (struct timeval tv);
#endif
-void mono_clock_init (void *clk_id);
-void mono_clock_cleanup (void *clk_id);
-guint64 mono_clock_get_time_ns (void *clk_id);
+#if defined(HOST_DARWIN)
+typedef clock_serv_t mono_clock_id_t;
+#elif defined(__linux__)
+typedef clockid_t mono_clock_id_t;
+#else
+typedef void* mono_clock_id_t;
+#endif
+
+void mono_clock_init (mono_clock_id_t clk_id);
+void mono_clock_cleanup (mono_clock_id_t clk_id);
+guint64 mono_clock_get_time_ns (mono_clock_id_t clk_id);
/* Stopwatch class for internal runtime use */
typedef struct {