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 23 static struct real_time_data* sRealTimeData; 24 25 26 void 27 __init_time(void) 28 { 29 sRealTimeData = (struct real_time_data*) 30 USER_COMMPAGE_TABLE[COMMPAGE_ENTRY_REAL_TIME_DATA]; 31 32 __arch_init_time(sRealTimeData, false); 33 } 34 35 36 bigtime_t 37 __get_system_time_offset() 38 { 39 return __arch_get_system_time_offset(sRealTimeData); 40 } 41 42 43 // #pragma mark - public API 44 45 46 uint32 47 real_time_clock(void) 48 { 49 return (__arch_get_system_time_offset(sRealTimeData) + system_time()) 50 / 1000000; 51 } 52 53 54 bigtime_t 55 real_time_clock_usecs(void) 56 { 57 return __arch_get_system_time_offset(sRealTimeData) + system_time(); 58 } 59 60 61 void 62 set_real_time_clock(uint32 secs) 63 { 64 _kern_set_real_time_clock((bigtime_t)secs * 1000000); 65 } 66 67 68 status_t 69 set_timezone(const char* /*timezone*/) 70 { 71 /* There's nothing we can do here, since we no longer support named 72 * timezones. 73 * 74 * TODO: should we keep this around for compatibility or get rid of it? 75 */ 76 return B_OK; 77 } 78 79 80 bigtime_t 81 set_alarm(bigtime_t when, uint32 mode) 82 { 83 // prepare the values to be passed to the kernel 84 bigtime_t interval = 0; 85 uint32 flags = B_RELATIVE_TIMEOUT; 86 87 if (when == B_INFINITE_TIMEOUT) { 88 when = B_INFINITE_TIMEOUT; 89 } else { 90 switch (mode) { 91 case B_PERIODIC_ALARM: 92 interval = when; 93 break; 94 case B_ONE_SHOT_ABSOLUTE_ALARM: 95 flags = B_ABSOLUTE_TIMEOUT; 96 break; 97 case B_ONE_SHOT_RELATIVE_ALARM: 98 default: 99 break; 100 } 101 } 102 103 // set the timer 104 user_timer_info oldInfo; 105 status_t error = _kern_set_timer(USER_TIMER_REAL_TIME_ID, find_thread(NULL), 106 when, interval, flags, &oldInfo); 107 if (error != B_OK) 108 return 0; 109 110 // A remaining time of B_INFINITE_TIMEOUT means not scheduled. 111 return oldInfo.remaining_time != B_INFINITE_TIMEOUT 112 ? oldInfo.remaining_time : 0; 113 } 114