Changes in / [f0348c8:ceafd1b] in mainline
- Files:
-
- 9 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/Makefile.common
rf0348c8 rceafd1b 74 74 $(USPACE_PATH)/srv/locsrv/locsrv \ 75 75 $(USPACE_PATH)/srv/bd/rd/rd \ 76 $(USPACE_PATH)/srv/vfs/vfs 76 $(USPACE_PATH)/srv/vfs/vfs \ 77 $(USPACE_PATH)/srv/logger/logger 77 78 78 79 ifeq ($(RDFMT),tmpfs) … … 161 162 $(USPACE_PATH)/app/killall/killall \ 162 163 $(USPACE_PATH)/app/loc/loc \ 164 $(USPACE_PATH)/app/logview/logview \ 163 165 $(USPACE_PATH)/app/mkfat/mkfat \ 164 166 $(USPACE_PATH)/app/mkexfat/mkexfat \ -
uspace/Makefile
rf0348c8 rceafd1b 47 47 app/klog \ 48 48 app/loc \ 49 app/logview \ 49 50 app/lsusb \ 50 51 app/mkfat \ … … 74 75 srv/clipboard \ 75 76 srv/locsrv \ 77 srv/logger \ 76 78 srv/devman \ 77 79 srv/loader \ -
uspace/app/tester/Makefile
rf0348c8 rceafd1b 45 45 stdio/stdio1.c \ 46 46 stdio/stdio2.c \ 47 stdio/logger1.c \ 47 48 fault/fault1.c \ 48 49 fault/fault2.c \ -
uspace/app/tester/tester.c
rf0348c8 rceafd1b 39 39 #include <stdio.h> 40 40 #include <str.h> 41 #include <io/log.h> 41 42 #include "tester.h" 42 43 … … 55 56 #include "stdio/stdio1.def" 56 57 #include "stdio/stdio2.def" 58 #include "stdio/logger1.def" 57 59 #include "fault/fault1.def" 58 60 #include "fault/fault2.def" … … 138 140 } 139 141 142 log_init("tester", LVL_NOTE); 143 140 144 test_quiet = false; 141 145 test_argc = argc - 2; -
uspace/app/tester/tester.h
rf0348c8 rceafd1b 88 88 extern const char *test_stdio1(void); 89 89 extern const char *test_stdio2(void); 90 extern const char *test_logger1(void); 90 91 extern const char *test_fault1(void); 91 92 extern const char *test_fault2(void); -
uspace/lib/c/generic/io/log.c
rf0348c8 rceafd1b 38 38 #include <stdlib.h> 39 39 #include <stdio.h> 40 40 #include <async.h> 41 41 #include <io/log.h> 42 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 42 #include <ipc/logger.h> 43 #include <ns.h> 44 45 /** Log messages are printed under this name. */ 51 46 static const char *log_prog_name; 52 47 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 }; 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 } 62 161 63 162 /** Initialize the logging system. … … 69 168 { 70 169 assert(level < LVL_LIMIT); 71 log_level = level; 72 73 log_stream = stdout; 170 74 171 log_prog_name = str_dup(prog_name); 75 172 if (log_prog_name == NULL) 76 173 return ENOMEM; 77 174 78 return EOK; 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; 79 192 } 80 193 … … 106 219 assert(level < LVL_LIMIT); 107 220 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); 119 } 221 if (get_current_observed_level() < level) { 222 return; 223 } 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); 120 232 } 121 233 -
uspace/lib/c/include/ipc/services.h
rf0348c8 rceafd1b 45 45 SERVICE_VFS = FOURCC('v', 'f', 's', ' '), 46 46 SERVICE_LOC = FOURCC('l', 'o', 'c', ' '), 47 SERVICE_LOGGER = FOURCC('l', 'o', 'g', 'g'), 47 48 SERVICE_DEVMAN = FOURCC('d', 'e', 'v', 'n'), 48 49 SERVICE_IRC = FOURCC('i', 'r', 'c', ' '), -
uspace/lib/usb/src/debug.c
rf0348c8 rceafd1b 74 74 } 75 75 } 76 log_init(message_prefix, LVL_DEBUG); 76 77 } 77 78 … … 148 149 } 149 150 151 va_start(args, format); 152 log_msgv(level, format, args); 153 va_end(args); 154 150 155 fibril_mutex_unlock(&log_serializer); 151 156 }
Note:
See TracChangeset
for help on using the changeset viewer.