re-establish kernel assert()s.
[minix.git] / lib / libsys / sef.c
blob65303c9784290058d2a9f3a371fb314dcacc6c45
1 #include "syslib.h"
2 #include <assert.h>
3 #include <minix/sysutil.h>
4 #include <stdio.h>
6 /* Self variables. */
7 #define SEF_SELF_NAME_MAXLEN 20
8 PRIVATE char sef_self_name[SEF_SELF_NAME_MAXLEN];
9 PRIVATE endpoint_t sef_self_endpoint;
11 /* Debug. */
12 #define SEF_DEBUG_HEADER_MAXLEN 32
13 PRIVATE time_t sef_debug_boottime = 0;
14 PRIVATE u32_t sef_debug_system_hz = 0;
15 PRIVATE time_t sef_debug_time_sec = 0;
16 PRIVATE time_t sef_debug_time_us = 0;
17 PRIVATE char sef_debug_header_buff[SEF_DEBUG_HEADER_MAXLEN];
18 FORWARD _PROTOTYPE( void sef_debug_refresh_params, (void) );
19 PUBLIC _PROTOTYPE( char* sef_debug_header, (void) );
21 /* SEF Init prototypes. */
22 EXTERN _PROTOTYPE( int do_sef_rs_init, (void) );
23 EXTERN _PROTOTYPE( int do_sef_init_request, (message *m_ptr) );
25 /* SEF Live update prototypes. */
26 EXTERN _PROTOTYPE( void do_sef_lu_before_receive, (void) );
27 EXTERN _PROTOTYPE( int do_sef_lu_request, (message *m_ptr) );
29 /* SEF Ping prototypes. */
30 EXTERN _PROTOTYPE( int do_sef_ping_request, (message *m_ptr) );
32 /*===========================================================================*
33 * sef_startup *
34 *===========================================================================*/
35 PUBLIC void sef_startup()
37 /* SEF startup interface for system processes. */
38 int r;
40 /* Get information about self. */
41 r = sys_whoami(&sef_self_endpoint, sef_self_name, SEF_SELF_NAME_MAXLEN);
42 if ( r != OK) {
43 sef_self_endpoint = SELF;
44 sprintf(sef_self_name, "%s", "Unknown");
47 #if INTERCEPT_SEF_INIT_REQUESTS
48 /* Intercept SEF Init requests. */
49 if(sef_self_endpoint == RS_PROC_NR) {
50 if((r = do_sef_rs_init()) != OK) {
51 panic("unable to complete init: %d", r);
54 else {
55 message m;
57 if((r = receive(RS_PROC_NR, &m)) != OK) {
58 panic("unable to receive from RS: %d", r);
60 if(IS_SEF_INIT_REQUEST(&m)) {
61 if((r = do_sef_init_request(&m)) != OK) {
62 panic("unable to process init request: %d", r);
65 else {
66 panic("unable to receive init request");
69 #endif
72 /*===========================================================================*
73 * sef_receive *
74 *===========================================================================*/
75 PUBLIC int sef_receive(endpoint_t src, message *m_ptr)
77 /* SEF receive() interface for system processes. */
78 int r;
80 while(TRUE) {
82 #if INTERCEPT_SEF_LU_REQUESTS
83 /* Handle SEF Live update before receive events. */
84 do_sef_lu_before_receive();
85 #endif
87 /* Receive and return in case of error. */
88 r = receive(src, m_ptr);
89 if(r != OK) {
90 return r;
93 #if INTERCEPT_SEF_PING_REQUESTS
94 /* Intercept SEF Ping requests. */
95 if(IS_SEF_PING_REQUEST(m_ptr)) {
96 if(do_sef_ping_request(m_ptr) == OK) {
97 continue;
100 #endif
102 #if INTERCEPT_SEF_LU_REQUESTS
103 /* Intercept SEF Live update requests. */
104 if(IS_SEF_LU_REQUEST(m_ptr)) {
105 if(do_sef_lu_request(m_ptr) == OK) {
106 continue;
109 #endif
111 /* If we get this far, this is not a valid SEF request, return and
112 * let the caller deal with that.
114 break;
117 return r;
120 /*===========================================================================*
121 * sef_debug_refresh_params *
122 *===========================================================================*/
123 PRIVATE void sef_debug_refresh_params(void)
125 /* Refresh SEF debug params. */
126 clock_t uptime;
127 endpoint_t endpoint;
128 int r;
130 /* Get boottime the first time. */
131 if(!sef_debug_boottime) {
132 r = sys_times(NONE, NULL, NULL, NULL, &sef_debug_boottime);
133 if ( r != OK) {
134 sef_debug_boottime = -1;
138 /* Get system hz the first time. */
139 if(!sef_debug_system_hz) {
140 r = sys_getinfo(GET_HZ, &sef_debug_system_hz,
141 sizeof(sef_debug_system_hz), 0, 0);
142 if ( r != OK) {
143 sef_debug_system_hz = -1;
147 /* Get uptime. */
148 uptime = -1;
149 if(sef_debug_boottime!=-1 && sef_debug_system_hz!=-1) {
150 r = sys_times(NONE, NULL, NULL, &uptime, NULL);
151 if ( r != OK) {
152 uptime = -1;
156 /* Compute current time. */
157 if(sef_debug_boottime==-1 || sef_debug_system_hz==-1 || uptime==-1) {
158 sef_debug_time_sec = 0;
159 sef_debug_time_us = 0;
161 else {
162 sef_debug_time_sec = (time_t) (sef_debug_boottime
163 + (uptime/sef_debug_system_hz));
164 sef_debug_time_us = (uptime%sef_debug_system_hz)
165 * 1000000/sef_debug_system_hz;
169 /*===========================================================================*
170 * sef_debug_header *
171 *===========================================================================*/
172 PUBLIC char* sef_debug_header(void)
174 /* Build and return a SEF debug header. */
175 sef_debug_refresh_params();
176 sprintf(sef_debug_header_buff, "%s: time = %ds %06dus",
177 sef_self_name, sef_debug_time_sec, sef_debug_time_us);
179 return sef_debug_header_buff;