1/* 2 * Copyright 2002-2009, Axel D��rfler, axeld@pinc-software.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include <errno.h> 8#include <stdio.h> 9#include <string.h> 10#include <syslog.h> 11 12#include <FindDirectory.h> 13#include <OS.h> 14 15#include <commpage_defs.h> 16#include <errno_private.h> 17#include <libroot_private.h> 18#include <real_time_data.h> 19#include <user_timer_defs.h> 20#include <syscalls.h> 21 22 23static struct real_time_data* sRealTimeData; 24 25 26void 27__init_time(addr_t commPageTable) 28{ 29 sRealTimeData = (struct real_time_data*) 30 (((addr_t*)commPageTable)[COMMPAGE_ENTRY_REAL_TIME_DATA] 31 + commPageTable); 32 33 __arch_init_time(sRealTimeData, false); 34} 35 36 37bigtime_t 38__get_system_time_offset() 39{ 40 return __arch_get_system_time_offset(sRealTimeData); 41} 42 43 44// #pragma mark - public API 45 46 47unsigned long 48real_time_clock(void) 49{ 50 return (__arch_get_system_time_offset(sRealTimeData) + system_time()) 51 / 1000000; 52} 53 54 55bigtime_t 56real_time_clock_usecs(void) 57{ 58 return __arch_get_system_time_offset(sRealTimeData) + system_time(); 59} 60 61 62void 63set_real_time_clock(unsigned long secs) 64{ 65 _kern_set_real_time_clock((bigtime_t)secs * 1000000); 66} 67 68 69bigtime_t 70set_alarm(bigtime_t when, uint32 mode) 71{ 72 // prepare the values to be passed to the kernel 73 bigtime_t interval = 0; 74 uint32 flags = B_RELATIVE_TIMEOUT; 75 76 if (when == B_INFINITE_TIMEOUT) { 77 when = B_INFINITE_TIMEOUT; 78 } else { 79 switch (mode) { 80 case B_PERIODIC_ALARM: 81 interval = when; 82 break; 83 case B_ONE_SHOT_ABSOLUTE_ALARM: 84 flags = B_ABSOLUTE_TIMEOUT; 85 break; 86 case B_ONE_SHOT_RELATIVE_ALARM: 87 default: 88 break; 89 } 90 } 91 92 // set the timer 93 user_timer_info oldInfo; 94 status_t error = _kern_set_timer(USER_TIMER_REAL_TIME_ID, find_thread(NULL), 95 when, interval, flags, &oldInfo); 96 if (error != B_OK) 97 return 0; 98 99 // A remaining time of B_INFINITE_TIMEOUT means not scheduled. 100 return oldInfo.remaining_time != B_INFINITE_TIMEOUT 101 ? oldInfo.remaining_time : 0; 102} 103 104 105#ifdef _BEOS_R5_COMPATIBLE_ 106extern "C" status_t 107set_timezone(const char* /*timezone*/) 108{ 109 // There's nothing we can do here, since we no longer support named timezones. 110 return ENOSYS; 111} 112#endif 113