aboutsummaryrefslogtreecommitdiff
path: root/fmdsp/fmdsp_platform_mach.c
blob: 96f64eb45354f1ad570cdee893248525c230de36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "fmdsp_platform_info.h"
#include <mach/mach.h>
#include <mach/clock.h>
#include <sys/times.h>
#include <stdbool.h>
#include <limits.h>

static struct {
  clock_t lastall;
  clock_t lastcpu;
  mach_timespec_t lasttimespec;
  bool clock_initialized;
  clock_serv_t clock;
} g;

int fmdsp_cpu_usage(void) {
  struct tms tmsbuf;
  clock_t all = times(&tmsbuf);
  clock_t cpu = tmsbuf.tms_utime + tmsbuf.tms_stime;
  clock_t percentage = 0;
  clock_t alld = all - g.lastall;
  clock_t cpud = cpu - g.lastcpu;
  if (alld) percentage = cpud * 100 / alld;
  g.lastall = all;
  g.lastcpu = cpu;
  if (!g.lastall) percentage = 0;
  if (percentage > INT_MAX) percentage = INT_MAX;
  if (percentage < 0) percentage = 0;
  return percentage;
}

int fmdsp_fps_30(void) {
  if (!g.clock_initialized) {
    host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &g.clock);
    g.clock_initialized = true;
  }
  mach_timespec_t time;
  clock_get_time(g.clock, &time);
  uint64_t fps = 0;
  if (g.lasttimespec.tv_sec || g.lasttimespec.tv_nsec) {
    uint64_t diffns = time.tv_sec - g.lasttimespec.tv_sec;
    diffns *= 1000000000ull;
    diffns += time.tv_nsec - g.lasttimespec.tv_nsec;
    if (diffns) {
      fps = 30ull * 1000000000ull / diffns;
    }
  }
  g.lasttimespec = time;
  if (fps > INT_MAX) fps = INT_MAX;
  return fps;
}