summary refs log tree commit diff stats
path: root/lib/system/timers.nim
blob: 74748c5418c29e72ef0fe4a0a83ae4b96e459d2d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
# Embedds Lua into a Nimrod application

import
  lua, lualib, lauxlib

const
  code = """
print 'hi'
"""

var L = newstate()
openlibs(L)
discard loadbuffer(L, code, code.len, "line") 
discard pcall(L, 0, 0, 0)
ral.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#
#
#            Nim's Runtime Library
#        (c) Copyright 2012 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

## Timer support for the realtime GC. Based on
## `<https://github.com/jckarter/clay/blob/master/compiler/src/hirestimer.cpp>`_

type
  Ticks = distinct int64
  Nanos = int64
{.deprecated: [TTicks: Ticks, TNanos: Nanos].}

when defined(windows):

  proc QueryPerformanceCounter(res: var Ticks) {.
    importc: "QueryPerformanceCounter", stdcall, dynlib: "kernel32".}
  proc QueryPerformanceFrequency(res: var int64) {.
    importc: "QueryPerformanceFrequency", stdcall, dynlib: "kernel32".}

  proc getTicks(): Ticks {.inline.} =
    QueryPerformanceCounter(result)

  proc `-`(a, b: Ticks): Nanos =
    var frequency: int64
    QueryPerformanceFrequency(frequency)
    var performanceCounterRate = 1e+9'f64 / float64(frequency)

    result = Nanos(float64(a.int64 - b.int64) * performanceCounterRate)

elif defined(macosx):
  type
    MachTimebaseInfoData {.pure, final, 
        importc: "mach_timebase_info_data_t", 
        header: "<mach/mach_time.h>".} = object
      numer, denom: int32
  {.deprecated: [TMachTimebaseInfoData: MachTimebaseInfoData].}

  proc mach_absolute_time(): int64 {.importc, header: "<mach/mach.h>".}
  proc mach_timebase_info(info: var MachTimebaseInfoData) {.importc,
    header: "<mach/mach_time.h>".}

  proc getTicks(): Ticks {.inline.} =
    result = Ticks(mach_absolute_time())
  
  var timeBaseInfo: MachTimebaseInfoData
  mach_timebase_info(timeBaseInfo)
    
  proc `-`(a, b: Ticks): Nanos =
    result = (a.int64 - b.int64)  * timeBaseInfo.numer div timeBaseInfo.denom

elif defined(posixRealtime):
  type
    Clockid {.importc: "clockid_t", header: "<time.h>", final.} = object

    TimeSpec {.importc: "struct timespec", header: "<time.h>", 
               final, pure.} = object ## struct timespec
      tv_sec: int  ## Seconds. 
      tv_nsec: int ## Nanoseconds. 
  {.deprecated: [TClockid: Clickid, TTimeSpec: TimeSpec].}

  var
    CLOCK_REALTIME {.importc: "CLOCK_REALTIME", header: "<time.h>".}: Clockid

  proc clock_gettime(clkId: Clockid, tp: var Timespec) {.
    importc: "clock_gettime", header: "<time.h>".}

  proc getTicks(): Ticks =
    var t: Timespec
    clock_gettime(CLOCK_REALTIME, t)
    result = Ticks(int64(t.tv_sec) * 1000000000'i64 + int64(t.tv_nsec))

  proc `-`(a, b: Ticks): Nanos {.borrow.}

else:
  # fallback Posix implementation:  
  type
    Timeval {.importc: "struct timeval", header: "<sys/select.h>", 
               final, pure.} = object ## struct timeval
      tv_sec: int  ## Seconds. 
      tv_usec: int ## Microseconds. 
  {.deprecated: [Ttimeval: Timeval].}
  proc posix_gettimeofday(tp: var Timeval, unused: pointer = nil) {.
    importc: "gettimeofday", header: "<sys/time.h>".}

  proc getTicks(): Ticks =
    var t: Timeval
    posix_gettimeofday(t)
    result = Ticks(int64(t.tv_sec) * 1000_000_000'i64 + 
                    int64(t.tv_usec) * 1000'i64)

  proc `-`(a, b: Ticks): Nanos {.borrow.}