Fix the handling of KMSG with regard to timestamps 24/223324/2
authorMichal Bloch <m.bloch@samsung.com>
Tue, 28 Jan 2020 17:05:14 +0000 (18:05 +0100)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 5 Feb 2020 11:13:57 +0000 (11:13 +0000)
Change-Id: I62542b352439f4447139fcd4cdd74a3e01da8e8f
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
include/logconfig.h
src/libdlogutil/lib.c
src/shared/logconfig.c
src/tests/config.c

index 9728cb2..c4f1143 100644 (file)
@@ -60,7 +60,7 @@ void log_config_free(struct log_config *config);
 void log_config_copy(struct log_config *dst, const struct log_config *src);
 void log_config_foreach(const struct log_config *config, configIter iter, void *userdata);
 dlogutil_sorting_order_e get_order_from_config(const struct log_config *conf);
-dlogutil_sorting_order_e get_proper_sort_by(dlogutil_sorting_order_e sort_by, bool is_pipe, const struct log_config *conf, bool *sorting_needed);
+dlogutil_sorting_order_e get_proper_sort_by(dlogutil_sorting_order_e sort_by, dlogutil_buffer_e buffer, bool is_pipe, const struct log_config *conf, bool *sorting_needed);
 
 #ifdef __cplusplus
 }
index deb7dbf..845c8dd 100644 (file)
@@ -185,7 +185,7 @@ static int dlogutil_get_logs_internal(int buffers, unsigned int mode, dlogutil_e
 
        bool sorting_needed;
        dlogutil_sorting_order_e proper_sort_by =
-               get_proper_sort_by(sorting ? sorting->sort_by : DLOGUTIL_SORT_DEFAULT, is_pipe, &conf, &sorting_needed);
+               get_proper_sort_by(sorting ? sorting->sort_by : DLOGUTIL_SORT_DEFAULT, buffers, is_pipe, &conf, &sorting_needed);
 
        r = do_print(fdi_ptrs, fdi_cnt, callback, data, sorting_needed, proper_sort_by, &conf, &opt);
 
@@ -247,7 +247,7 @@ EXPORT_API int dlogutil_buffer_get_default_ts_type(dlogutil_buffer_e buffer, dlo
 
        COMMON_INIT_SINGLE
 
-       *type = get_proper_sort_by(DLOGUTIL_SORT_DEFAULT, is_pipe, &conf, &(bool){ false });
+       *type = get_proper_sort_by(DLOGUTIL_SORT_DEFAULT, buffer, is_pipe, &conf, &(bool){ false });
        return TIZEN_ERROR_NONE;
 }
 
index 4a0cd6c..94fa896 100644 (file)
@@ -399,19 +399,21 @@ dlogutil_sorting_order_e get_order_from_config(const struct log_config *conf)
        return ret;
 }
 
-dlogutil_sorting_order_e get_proper_sort_by(dlogutil_sorting_order_e sort_by, bool is_pipe, const struct log_config *conf, bool *sorting_needed)
+dlogutil_sorting_order_e get_proper_sort_by(dlogutil_sorting_order_e sort_by, dlogutil_buffer_e buffer, bool is_pipe, const struct log_config *conf, bool *sorting_needed)
 {
-       dlogutil_sorting_order_e source_sorting = get_order_from_config(conf);
-
        *sorting_needed = false;
 
+       if (buffer == DLOGUTIL_BUF_KMSG)
+               return DLOGUTIL_SORT_SENT_MONO; /* never an Android logger device; does provide the RECV set of timestamps
+                                                * but we never want to sort on that because that's not how `dmesg` works */
        if (!is_pipe)
                return DLOGUTIL_SORT_SENT_REAL; // the Android logger only provides this one timestamp and sorts on it, so let's use it
 
+       dlogutil_sorting_order_e pipe_daemon_sorting = get_order_from_config(conf);
        if (sort_by == DLOGUTIL_SORT_DEFAULT)
-               return source_sorting; // pick the compatible sorting to make things easier
+               return pipe_daemon_sorting; // pick the compatible sorting to make things easier
 
-       *sorting_needed = (sort_by != source_sorting); // if everything is sorted by the source, we don't have to
+       *sorting_needed = (sort_by != pipe_daemon_sorting); // if everything is sorted by the source, we don't have to
        return sort_by;
 }
 
index 7993387..196bae4 100644 (file)
@@ -208,28 +208,39 @@ int main()
 
        bool sorting_needed;
 
-#define CHECK(ret, wanted, pipe, sorting) do { \
+#define CHECK(ret, wanted, bufname, pipe, sorting) do { \
        sorting_needed = !sorting; \
-       assert(ret == get_proper_sort_by(wanted, pipe, &copy, &sorting_needed)); \
+       assert(ret == get_proper_sort_by(wanted, bufname, pipe, &copy, &sorting_needed)); \
        assert(sorting_needed == sorting); \
 } while (0)
 
+       /* KMSG returns SENT_MONO no matter what,
+        * since that is the timestamp dmesg "sorts" on. */
+       CHECK(DLOGUTIL_SORT_SENT_MONO, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_KMSG, false, false);
+       CHECK(DLOGUTIL_SORT_SENT_MONO, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_KMSG,  true, false);
+       log_config_set(&copy, "sort_by", "recv_real");
+       CHECK(DLOGUTIL_SORT_SENT_MONO, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_KMSG, false, false);
+       CHECK(DLOGUTIL_SORT_SENT_MONO, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_KMSG,  true, false);
+       CHECK(DLOGUTIL_SORT_SENT_MONO, DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_BUF_KMSG, false, false);
+       CHECK(DLOGUTIL_SORT_SENT_MONO, DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_BUF_KMSG,  true, false);
+       log_config_remove(&copy, "sort_by");
+
        /* Android Logger returns SENT_REAL no matter what, since that is
         * the only timestamp available for that backend. */
-       CHECK(DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_SORT_DEFAULT  , false, false);
+       CHECK(DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_MAIN, false, false);
        log_config_set(&copy, "sort_by", "recv_real");
-       CHECK(DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_SORT_DEFAULT  , false, false);
-       CHECK(DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_SORT_RECV_MONO, false, false);
+       CHECK(DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_MAIN, false, false);
+       CHECK(DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_BUF_MAIN, false, false);
        log_config_remove(&copy, "sort_by");
 
        // Pipe backend defaults to RECV_MONO but obeys the config.
-       CHECK(DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_SORT_DEFAULT  , true,  false);
+       CHECK(DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_MAIN,  true, false);
        log_config_set(&copy, "sort_by", "recv_real");
-       CHECK(DLOGUTIL_SORT_RECV_REAL, DLOGUTIL_SORT_DEFAULT  , true,  false);
-       CHECK(DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_SORT_SENT_REAL, true,  true );
+       CHECK(DLOGUTIL_SORT_RECV_REAL, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_MAIN,  true, false);
+       CHECK(DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_SORT_SENT_REAL, DLOGUTIL_BUF_MAIN,  true,  true);
        log_config_remove(&copy, "sort_by");
-       CHECK(DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_SORT_RECV_MONO, true,  false);
-       CHECK(DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_SORT_DEFAULT  , true,  false);
+       CHECK(DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_BUF_MAIN,  true, false);
+       CHECK(DLOGUTIL_SORT_RECV_MONO, DLOGUTIL_SORT_DEFAULT  , DLOGUTIL_BUF_MAIN,  true, false);
 
 #undef CHECK
        return 0;