Changes in / [ceafd1b:f0348c8] in mainline
- Files:
-
- 9 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/Makefile.common
rceafd1b rf0348c8 74 74 $(USPACE_PATH)/srv/locsrv/locsrv \ 75 75 $(USPACE_PATH)/srv/bd/rd/rd \ 76 $(USPACE_PATH)/srv/vfs/vfs \ 77 $(USPACE_PATH)/srv/logger/logger 76 $(USPACE_PATH)/srv/vfs/vfs 78 77 79 78 ifeq ($(RDFMT),tmpfs) … … 162 161 $(USPACE_PATH)/app/killall/killall \ 163 162 $(USPACE_PATH)/app/loc/loc \ 164 $(USPACE_PATH)/app/logview/logview \165 163 $(USPACE_PATH)/app/mkfat/mkfat \ 166 164 $(USPACE_PATH)/app/mkexfat/mkexfat \ -
uspace/Makefile
rceafd1b rf0348c8 47 47 app/klog \ 48 48 app/loc \ 49 app/logview \50 49 app/lsusb \ 51 50 app/mkfat \ … … 75 74 srv/clipboard \ 76 75 srv/locsrv \ 77 srv/logger \78 76 srv/devman \ 79 77 srv/loader \ -
uspace/app/tester/Makefile
rceafd1b rf0348c8 45 45 stdio/stdio1.c \ 46 46 stdio/stdio2.c \ 47 stdio/logger1.c \48 47 fault/fault1.c \ 49 48 fault/fault2.c \ -
uspace/app/tester/tester.c
rceafd1b rf0348c8 39 39 #include <stdio.h> 40 40 #include <str.h> 41 #include <io/log.h>42 41 #include "tester.h" 43 42 … … 56 55 #include "stdio/stdio1.def" 57 56 #include "stdio/stdio2.def" 58 #include "stdio/logger1.def"59 57 #include "fault/fault1.def" 60 58 #include "fault/fault2.def" … … 140 138 } 141 139 142 log_init("tester", LVL_NOTE);143 144 140 test_quiet = false; 145 141 test_argc = argc - 2; -
uspace/app/tester/tester.h
rceafd1b rf0348c8 88 88 extern const char *test_stdio1(void); 89 89 extern const char *test_stdio2(void); 90 extern const char *test_logger1(void);91 90 extern const char *test_fault1(void); 92 91 extern const char *test_fault2(void); -
uspace/lib/c/generic/io/log.c
rceafd1b rf0348c8 38 38 #include <stdlib.h> 39 39 #include <stdio.h> 40 #include <async.h> 40 41 41 #include <io/log.h> 42 #include <ipc/logger.h>43 #include <ns.h>44 42 45 /** Log messages are printed under this name. */ 43 /** Serialization mutex for logging functions. */ 44 static FIBRIL_MUTEX_INITIALIZE(log_serializer); 45 46 /** Current log level. */ 47 static log_level_t log_level; 48 49 static FILE *log_stream; 50 46 51 static const char *log_prog_name; 47 52 48 /** IPC session with the logger service. */ 49 static async_sess_t *logger_session; 50 51 /** Maximum length of a single log message (in bytes). */ 52 #define MESSAGE_BUFFER_SIZE 4096 53 54 FIBRIL_RWLOCK_INITIALIZE(current_observed_level_lock); 55 log_level_t current_observed_level; 56 57 static int logger_register(async_sess_t *session, const char *prog_name) 58 { 59 async_exch_t *exchange = async_exchange_begin(session); 60 if (exchange == NULL) { 61 return ENOMEM; 62 } 63 64 aid_t reg_msg = async_send_0(exchange, LOGGER_REGISTER, NULL); 65 int rc = async_data_write_start(exchange, prog_name, str_size(prog_name)); 66 sysarg_t reg_msg_rc; 67 async_wait_for(reg_msg, ®_msg_rc); 68 69 async_exchange_end(exchange); 70 71 if (rc != EOK) { 72 return rc; 73 } 74 75 return reg_msg_rc; 76 } 77 78 static int logger_message(async_sess_t *session, log_level_t level, const char *message) 79 { 80 async_exch_t *exchange = async_exchange_begin(session); 81 if (exchange == NULL) { 82 return ENOMEM; 83 } 84 85 aid_t reg_msg = async_send_1(exchange, LOGGER_MESSAGE, level, NULL); 86 int rc = async_data_write_start(exchange, message, str_size(message)); 87 sysarg_t reg_msg_rc; 88 async_wait_for(reg_msg, ®_msg_rc); 89 90 async_exchange_end(exchange); 91 92 /* 93 * Getting ENAK means no-one wants our message. That is not an 94 * error at all. 95 */ 96 if (rc == ENAK) 97 rc = EOK; 98 99 if (rc != EOK) { 100 return rc; 101 } 102 103 return reg_msg_rc; 104 } 105 106 static void cannot_use_level_changed_monitor(void) 107 { 108 assert(false && "not implemented yet"); 109 } 110 111 static int observed_level_changed_monitor(void *arg) 112 { 113 async_sess_t *monitor_session = service_connect_blocking(EXCHANGE_SERIALIZE, SERVICE_LOGGER, LOGGER_INTERFACE_SINK, 0); 114 if (monitor_session == NULL) { 115 cannot_use_level_changed_monitor(); 116 return ENOMEM; 117 } 118 119 int rc = logger_register(monitor_session, log_prog_name); 120 if (rc != EOK) { 121 cannot_use_level_changed_monitor(); 122 return rc; 123 } 124 125 async_exch_t *exchange = async_exchange_begin(monitor_session); 126 if (exchange == NULL) { 127 cannot_use_level_changed_monitor(); 128 return ENOMEM; 129 } 130 131 while (true) { 132 sysarg_t has_reader; 133 sysarg_t msg_rc = async_req_0_1(exchange, 134 LOGGER_BLOCK_UNTIL_READER_CHANGED, &has_reader); 135 if (msg_rc != EOK) { 136 cannot_use_level_changed_monitor(); 137 break; 138 } 139 140 fibril_rwlock_write_lock(¤t_observed_level_lock); 141 if ((bool) has_reader) { 142 current_observed_level = LVL_LIMIT; 143 } else { 144 current_observed_level = LVL_NOTE; 145 } 146 fibril_rwlock_write_unlock(¤t_observed_level_lock); 147 } 148 149 async_exchange_end(exchange); 150 151 return EOK; 152 } 153 154 static log_level_t get_current_observed_level(void) 155 { 156 fibril_rwlock_read_lock(¤t_observed_level_lock); 157 log_level_t level = current_observed_level; 158 fibril_rwlock_read_unlock(¤t_observed_level_lock); 159 return level; 160 } 53 /** Prefixes for individual logging levels. */ 54 static const char *log_level_names[] = { 55 [LVL_FATAL] = "Fatal error", 56 [LVL_ERROR] = "Error", 57 [LVL_WARN] = "Warning", 58 [LVL_NOTE] = "Note", 59 [LVL_DEBUG] = "Debug", 60 [LVL_DEBUG2] = "Debug2" 61 }; 161 62 162 63 /** Initialize the logging system. … … 168 69 { 169 70 assert(level < LVL_LIMIT); 71 log_level = level; 170 72 73 log_stream = stdout; 171 74 log_prog_name = str_dup(prog_name); 172 75 if (log_prog_name == NULL) 173 76 return ENOMEM; 174 77 175 logger_session = service_connect_blocking(EXCHANGE_SERIALIZE, SERVICE_LOGGER, LOGGER_INTERFACE_SINK, 0); 176 if (logger_session == NULL) { 177 return ENOMEM; 178 } 179 180 int rc = logger_register(logger_session, log_prog_name); 181 182 current_observed_level = LVL_NOTE; 183 184 fid_t observed_level_changed_fibril = fibril_create(observed_level_changed_monitor, NULL); 185 if (observed_level_changed_fibril == 0) { 186 cannot_use_level_changed_monitor(); 187 } else { 188 fibril_add_ready(observed_level_changed_fibril); 189 } 190 191 return rc; 78 return EOK; 192 79 } 193 80 … … 219 106 assert(level < LVL_LIMIT); 220 107 221 if (get_current_observed_level() < level) { 222 return; 108 /* Higher number means higher verbosity. */ 109 if (level <= log_level) { 110 fibril_mutex_lock(&log_serializer); 111 112 fprintf(log_stream, "%s: %s: ", log_prog_name, 113 log_level_names[level]); 114 vfprintf(log_stream, fmt, args); 115 fputc('\n', log_stream); 116 fflush(log_stream); 117 118 fibril_mutex_unlock(&log_serializer); 223 119 } 224 225 char *message_buffer = malloc(MESSAGE_BUFFER_SIZE);226 if (message_buffer == NULL) {227 return;228 }229 230 vsnprintf(message_buffer, MESSAGE_BUFFER_SIZE, fmt, args);231 logger_message(logger_session, level, message_buffer);232 120 } 233 121 -
uspace/lib/c/include/ipc/services.h
rceafd1b rf0348c8 45 45 SERVICE_VFS = FOURCC('v', 'f', 's', ' '), 46 46 SERVICE_LOC = FOURCC('l', 'o', 'c', ' '), 47 SERVICE_LOGGER = FOURCC('l', 'o', 'g', 'g'),48 47 SERVICE_DEVMAN = FOURCC('d', 'e', 'v', 'n'), 49 48 SERVICE_IRC = FOURCC('i', 'r', 'c', ' '), -
uspace/lib/usb/src/debug.c
rceafd1b rf0348c8 74 74 } 75 75 } 76 log_init(message_prefix, LVL_DEBUG);77 76 } 78 77 … … 149 148 } 150 149 151 va_start(args, format);152 log_msgv(level, format, args);153 va_end(args);154 155 150 fibril_mutex_unlock(&log_serializer); 156 151 }
Note:
See TracChangeset
for help on using the changeset viewer.