Changes in uspace/srv/klog/klog.c [a35b458:5a6cc679] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/klog/klog.c
ra35b458 r5a6cc679 61 61 uint32_t level; 62 62 char message[0]; 63 63 64 64 } __attribute__((__packed__)) log_entry_t; 65 65 … … 107 107 return; 108 108 } 109 109 110 110 size_t offset = 0; 111 111 while (offset < len) { 112 112 size_t entry_len = *((unaligned_size_t *) (buffer + offset)); 113 113 114 114 if (offset + entry_len > len || entry_len < sizeof(log_entry_t)) 115 115 break; 116 116 117 117 log_entry_t *buf = malloc(entry_len + 1); 118 118 if (buf == NULL) 119 119 break; 120 120 121 121 item_t *item = malloc(sizeof(item_t)); 122 122 if (item == NULL) { … … 124 124 break; 125 125 } 126 126 127 127 memcpy(buf, buffer + offset, entry_len); 128 128 *((uint8_t *) buf + entry_len) = 0; … … 131 131 item->data = buf; 132 132 prodcons_produce(&pc, &item->link); 133 133 134 134 offset += entry_len; 135 135 } … … 148 148 static errno_t consumer(void *data) 149 149 { 150 150 151 151 while (true) { 152 152 link_t *link = prodcons_consume(&pc); 153 153 item_t *item = list_get_instance(link, item_t, link); 154 154 155 155 if (item->size < sizeof(log_entry_t)) { 156 156 free(item->data); … … 158 158 continue; 159 159 } 160 160 161 161 if (item->data->facility == LF_USPACE) { 162 162 /* Avoid reposting messages */ … … 165 165 continue; 166 166 } 167 167 168 168 log_t ctx = kernel_ctx; 169 169 if (item->data->facility < facility_len) { 170 170 ctx = facility_ctx[item->data->facility]; 171 171 } 172 172 173 173 log_level_t lvl = item->data->level; 174 174 if (lvl > LVL_LIMIT) 175 175 lvl = LVL_NOTE; 176 176 177 177 log_msg(ctx, lvl, "%s", item->data->message); 178 178 179 179 free(item->data); 180 180 free(item); 181 181 } 182 182 183 183 return EOK; 184 184 } … … 199 199 * starving. 200 200 */ 201 201 202 202 fibril_mutex_lock(&mtx); 203 203 204 204 producer(); 205 205 206 206 async_event_unmask(EVENT_KLOG); 207 207 fibril_mutex_unlock(&mtx); … … 215 215 return rc; 216 216 } 217 217 218 218 kernel_ctx = log_create("kernel", LOG_NO_PARENT); 219 219 for (unsigned int i = 0; i < facility_len; i++) { 220 220 facility_ctx[i] = log_create(facility_name[i], kernel_ctx); 221 221 } 222 222 223 223 buffer = malloc(BUFFER_SIZE); 224 224 if (buffer == NULL) { … … 226 226 return 1; 227 227 } 228 228 229 229 prodcons_initialize(&pc); 230 230 rc = async_event_subscribe(EVENT_KLOG, klog_notification_received, NULL); … … 234 234 return rc; 235 235 } 236 236 237 237 fid_t fid = fibril_create(consumer, NULL); 238 238 if (!fid) { … … 241 241 return ENOMEM; 242 242 } 243 243 244 244 fibril_add_ready(fid); 245 245 async_event_unmask(EVENT_KLOG); 246 246 247 247 fibril_mutex_lock(&mtx); 248 248 producer(); 249 249 fibril_mutex_unlock(&mtx); 250 250 251 251 task_retval(0); 252 252 async_manager(); 253 253 254 254 return 0; 255 255 }
Note:
See TracChangeset
for help on using the changeset viewer.