Complete rewrite of c3po for multicore
[akaros.git] / user / c3po / util / config.c
1 /**
2  * 
3  * Configure capriccio.  This is done via environment variables which are read at startup.
4  *
5  **/
6 #include <ctype.h>
7 #include <stdlib.h>
8 #include <string.h>
9
10 #include "threadlib.h"
11 #include "debug.h"
12 #include "config.h"
13
14 #ifndef TRUE
15 #define TRUE 1
16 #endif
17 #ifndef FALSE
18 #define FALSE 0
19 #endif
20
21
22 // define variables.  These should match config.h
23 int conf_no_init_messages = FALSE;
24 int conf_dump_blocking_graph = FALSE;
25 int conf_dump_timing_info = FALSE;
26 int conf_show_thread_stacks = FALSE;
27 int conf_show_thread_details = FALSE;
28 int conf_no_debug = FALSE;
29 int conf_no_stacktrace = FALSE;
30 int conf_no_statcollect = FALSE;
31
32 long conf_new_stack_size = 128*1024;
33 int conf_new_stack_kb_log2 = 7;
34
35 static inline int bool_value(char *str)
36 {
37   if(str == NULL) return 0;
38   if( atoi(str) ) return 1;
39   if( !strcasecmp(str,"true") ) return 1;
40   if( !strcasecmp(str,"yes") ) return 1;
41   if( !strcasecmp(str,"y") ) return 1;
42   return 0;
43 }
44
45 #define get_bool(env,var) {\
46   var = bool_value( getenv(__STRING(env)) ); \
47   if( !conf_no_init_messages ) \
48     output("%s=%s\n",__STRING(env), (var ? "yes" : "no")); \
49 }  
50
51
52 // for now, just read from env vars.  Add config file option later.
53 void read_config(void) {
54   static int read_config_done = 0;
55   
56   if( read_config_done ) return;
57   read_config_done = 1;
58
59   // BOOLEAN FLAGS
60   get_bool(CAPRICCIO_NO_INIT_MESSAGES, conf_no_init_messages);
61   get_bool(CAPRICCIO_NO_DEBUG, conf_no_debug);
62   get_bool(CAPRICCIO_NO_STACKTRACE, conf_no_stacktrace);
63   get_bool(CAPRICCIO_NO_STATCOLLECT, conf_no_statcollect);
64
65   get_bool(CAPRICCIO_DUMP_BLOCKING_GRAPH, conf_dump_blocking_graph);
66   get_bool(CAPRICCIO_DUMP_TIMING_INFO, conf_dump_timing_info);
67   get_bool(CAPRICCIO_SHOW_THREAD_DETAILS, conf_show_thread_details);
68
69   // NOTE: this is subbordinate to CAPRICCIO_SHOW_THREAD_DETAILS
70   get_bool(CAPRICCIO_SHOW_THREAD_STACKS, conf_show_thread_stacks);
71
72
73   // STACK SIZE
74   {
75     char *str;
76     str = getenv("CAPRICCIO_DEFAULT_STACK_SIZE");
77     if( str != NULL ) {
78       char *p;
79       int mult=0;
80       long val;
81     
82       // read the value
83       val = strtol(str,&p,0);
84       if( p == str )
85         fatal("Bad number format for CAPRICCIO_DEFAULT_STACK_SIZE: '%s'\n", str); 
86     
87       // read the units
88       while( isspace(*p) ) p++;
89       if( *p == '\0' )
90         mult = 1024; // default to KB
91       else if( *p == 'b' || *p == 'B' )
92         mult = 1;        
93       else if( *p == 'k' || *p == 'K' )
94         mult = 1024;
95       else if( *p == 'm' || *p == 'M' )
96         mult = 1024*1024;
97       else 
98         fatal("Bad units for CAPRICCIO_DEFAULT_STACK_SIZE: '%s'\n",str);
99     
100       // pick the next bigger power of 2
101       // FIXME: allow smaller than 1K?
102       // FIXME: allow not power of 2?
103       conf_new_stack_size = 1024;
104       conf_new_stack_kb_log2 = 0;
105       while( conf_new_stack_size < mult * val ) {
106         conf_new_stack_kb_log2++;
107         conf_new_stack_size = conf_new_stack_size << 1;
108       }
109     }
110
111     if( !conf_no_init_messages ) {
112       // show MB, if big enough, and evenly divisible
113       if( conf_new_stack_size > 1024*1024  &&  !(conf_new_stack_size & 0xFFFFF) )
114         output("CAPRICCIO_DEFAULT_STACKSIZE=%ldM\n",conf_new_stack_size/1024/1024);
115
116       // show KB, if big enough, and evenly divisible
117       else if( conf_new_stack_size > 1024  &&  !(conf_new_stack_size & 0x3FF) )
118         output("CAPRICCIO_DEFAULT_STACKSIZE=%ldK\n",conf_new_stack_size/1024);
119
120       // otherwise, show in bytes
121       else
122         output("CAPRICCIO_DEFAULT_STACKSIZE=%ldb\n",conf_new_stack_size);
123     }
124   }
125
126
127   // FIXME: scan environment for unrecognized CAPRICCIO_* env vars,
128   // and warn about likely misspelling.
129
130 }
131
132
133