opal/corelib/process.rb in opal-0.10.6 vs opal/corelib/process.rb in opal-0.11.0.rc1
- old
+ new
@@ -1,19 +1,59 @@
class Process
- CLOCK_REALTIME = 0
- CLOCK_MONOTONIC = 1
+ @__clocks__ = []
+ def self.__register_clock__(name, func)
+ const_set name, @__clocks__.size
+ @__clocks__ << func
+ end
+ __register_clock__ :CLOCK_REALTIME, `function() { return Date.now() }`
+
+ monotonic = false
+
+ %x{
+ if (Opal.global.performance) {
+ monotonic = function() {
+ return performance.now()
+ };
+ }
+ else if (Opal.global.process && process.hrtime) {
+ // let now be the base to get smaller numbers
+ var hrtime_base = process.hrtime();
+
+ monotonic = function() {
+ var hrtime = process.hrtime(hrtime_base);
+ var us = (hrtime[1] / 1000) | 0; // cut below microsecs;
+ return ((hrtime[0] * 1000) + (us / 1000));
+ };
+ }
+ }
+
+ __register_clock__(:CLOCK_MONOTONIC, monotonic) if monotonic
+
def self.pid
0
end
def self.times
t = Time.now.to_f
Benchmark::Tms.new(t, t, t, t, t)
end
- def self.clock_gettime(clock_id, unit = nil)
- Time.now.to_f
+ def self.clock_gettime(clock_id, unit = :float_second)
+ clock = @__clocks__[clock_id] or raise Errno::EINVAL, "clock_gettime(#{clock_id}) #{@__clocks__[clock_id]}"
+ %x{
+ var ms = clock();
+ switch (unit) {
+ case 'float_second': return (ms / 1000); // number of seconds as a float (default)
+ case 'float_millisecond': return (ms / 1); // number of milliseconds as a float
+ case 'float_microsecond': return (ms * 1000); // number of microseconds as a float
+ case 'second': return ((ms / 1000) | 0); // number of seconds as an integer
+ case 'millisecond': return ((ms / 1) | 0); // number of milliseconds as an integer
+ case 'microsecond': return ((ms * 1000) | 0); // number of microseconds as an integer
+ case 'nanosecond': return ((ms * 1000000) | 0); // number of nanoseconds as an integer
+ default: #{raise ArgumentError, "unexpected unit: #{unit}"}
+ }
+ }
end
end
class Signal
def self.trap(*)