Changeset cba45af in mainline for uspace/srv/logger/writer.c


Ignore:
Timestamp:
2012-08-16T21:01:55Z (12 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2bf781a
Parents:
e005f92
Message:

Rewrite logger (work in progress)

Major issues

  • no locking
  • no clean-up (at all)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/logger/writer.c

    re005f92 rcba45af  
    4949
    5050
    51 static logging_namespace_t *find_namespace_and_attach_writer(void)
     51static logger_toplevel_log_t *handle_create_toplevel_log(void)
    5252{
    53         ipc_call_t call;
    54         ipc_callid_t callid = async_get_call(&call);
     53        void *name;
     54        int rc = async_data_write_accept(&name, true, 1, 0, 0, NULL);
     55        if (rc != EOK)
     56                return NULL;
    5557
    56         if (IPC_GET_IMETHOD(call) != LOGGER_REGISTER) {
    57                 async_answer_0(callid, EINVAL);
    58                 return NULL;
    59         }
    60 
    61         void *name;
    62         int rc = async_data_write_accept(&name, true, 1, MAX_NAMESPACE_LENGTH, 0, NULL);
    63         async_answer_0(callid, rc);
    64 
    65         if (rc != EOK) {
    66                 return NULL;
    67         }
    68 
    69         logging_namespace_t *result = namespace_writer_attach((const char *) name);
     58        logger_toplevel_log_t *log = find_or_create_toplevel_log(name);
    7059
    7160        free(name);
    7261
    73         return result;
     62        return log;
    7463}
    7564
    76 static int handle_receive_message(logging_namespace_t *namespace, sysarg_t context, int level)
     65static int handle_receive_message(sysarg_t toplevel_log_id, sysarg_t log_id, sysarg_t level)
    7766{
    78         bool skip_message = !namespace_has_reader(namespace, context, level);
    79         if (skip_message) {
    80                 /* Abort the actual message buffer transfer. */
    81                 ipc_callid_t callid;
    82                 size_t size;
    83                 int rc = ENAK;
    84                 if (!async_data_write_receive(&callid, &size))
    85                         rc = EINVAL;
     67        logger_toplevel_log_t *log = find_toplevel_log(toplevel_log_id);
     68        if (log == NULL)
     69                return ENOENT;
    8670
    87                 async_answer_0(callid, rc);
     71        if (log_id > log->sublog_count)
     72                return ENOENT;
     73
     74        void *message;
     75        int rc = async_data_write_accept(&message, true, 1, 0, 0, NULL);
     76        if (rc != EOK)
    8877                return rc;
     78
     79        if (!shall_log_message(log, log_id, level)) {
     80                free(message);
     81                return EOK;
    8982        }
    9083
    91         void *message;
    92         int rc = async_data_write_accept(&message, true, 0, 0, 0, NULL);
    93         if (rc != EOK) {
    94                 return rc;
    95         }
    96 
    97         namespace_add_message(namespace, message, context, level);
     84        printf("[%s/%s] %s: %s\n",
     85            log->name, log->sublogs[log_id].name,
     86            log_level_str(level),
     87            (const char *) message);
    9888
    9989        free(message);
     
    10292}
    10393
    104 static int handle_create_context(logging_namespace_t *namespace, sysarg_t *idx)
     94static int handle_create_sub_log(sysarg_t toplevel_log_id, sysarg_t *log_id)
    10595{
     96        logger_toplevel_log_t *log = find_toplevel_log(toplevel_log_id);
     97        if (log == NULL)
     98                return ENOENT;
     99
    106100        void *name;
    107101        int rc = async_data_write_accept(&name, true, 0, 0, 0, NULL);
    108         if (rc != EOK) {
     102        if (rc != EOK)
    109103                return rc;
    110         }
    111104
    112         rc = namespace_create_context(namespace, name);
     105        rc = add_sub_log(log, name, log_id);
    113106
    114107        free(name);
    115108
    116         if (rc < 0)
    117                 return rc;
    118 
    119         *idx = (sysarg_t) rc;
    120         return EOK;
     109        return rc;
    121110}
    122111
    123112void logger_connection_handler_writer(ipc_callid_t callid)
    124113{
    125         /* First call has to be the registration. */
     114        /* Acknowledge the connection. */
    126115        async_answer_0(callid, EOK);
    127         logging_namespace_t *namespace = find_namespace_and_attach_writer();
    128         if (namespace == NULL) {
    129                 fprintf(stderr, NAME ": failed to register namespace.\n");
    130                 return;
    131         }
    132116
    133         printf(NAME "/writer: new client %s.\n", namespace_get_name(namespace));
     117        printf(NAME "/writer: new client.\n");
    134118
    135119        while (true) {
     
    140124                        break;
    141125
    142                 int rc;
    143                 sysarg_t arg = 0;
    144 
    145126                switch (IPC_GET_IMETHOD(call)) {
    146                 case LOGGER_CREATE_CONTEXT:
    147                         rc = handle_create_context(namespace, &arg);
    148                         async_answer_1(callid, rc, arg);
     127                case LOGGER_WRITER_CREATE_TOPLEVEL_LOG: {
     128                        logger_toplevel_log_t *log = handle_create_toplevel_log();
     129                        if (log == NULL) {
     130                                async_answer_0(callid, ENOMEM);
     131                                break;
     132                        }
     133                        async_answer_1(callid, EOK, (sysarg_t) log);
    149134                        break;
    150                 case LOGGER_MESSAGE:
    151                         rc = handle_receive_message(namespace, IPC_GET_ARG1(call), IPC_GET_ARG2(call));
     135                }
     136                case LOGGER_WRITER_MESSAGE: {
     137                        int rc = handle_receive_message(IPC_GET_ARG1(call),
     138                            IPC_GET_ARG2(call), IPC_GET_ARG3(call));
    152139                        async_answer_0(callid, rc);
    153140                        break;
     141                }
     142                case LOGGER_WRITER_CREATE_SUB_LOG: {
     143                        sysarg_t log_id;
     144                        int rc = handle_create_sub_log(IPC_GET_ARG1(call), &log_id);
     145                        async_answer_1(callid, rc, log_id);
     146                        break;
     147                }
    154148                default:
    155149                        async_answer_0(callid, EINVAL);
     
    158152        }
    159153
    160         printf(NAME "/sink: client %s terminated.\n", namespace_get_name(namespace));
    161         namespace_writer_detach(namespace);
     154        // FIXME: destroy created logs
    162155}
    163156
Note: See TracChangeset for help on using the changeset viewer.