From e6b2b986ff8c91f2ec1f8dbc05a62f5bf9fcd91b Mon Sep 17 00:00:00 2001 From: Chris Kuethe Date: Sat, 27 Dec 2008 09:15:40 +0000 Subject: Add a wrapper function around gpsd_hexdump to avoid hexdumping buffers... ...and copying ascii strings around when they're not going to be printed. This saves quite a lot of CPU. I processed a 50MB ubx binary file. With no "-D" options, this saved nearly 2.2M calls to gpsd_hexdump and the processing time for this file went from 84 seconds to 35 seconds. --- hex.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'hex.c') diff --git a/hex.c b/hex.c index 4bbc950e..19e08cbf 100644 --- a/hex.c +++ b/hex.c @@ -8,6 +8,25 @@ #include "gpsd_config.h" #include "gpsd.h" +int gpsd_hexdump_level = -1; +/* + * A wrapper around gpsd_hexdump to prevent wasting cpu time by hexdumping + * buffers and copying strings that will never be printed. only messages at + * level "N" and lower will be printed. By way of example, without any -D + * options, gpsd probably won't ever call the real gpsd_hexdump. At -D2, + * LOG_PROG (and higher) won't get to call the real gpsd_hexdump. For high + * speed, chatty protocols, this can save a lot of CPU. + */ +char *gpsd_hexdump_wrapper(const void *binbuf, size_t binbuflen, + int msg_debug_level) +{ +#ifndef SQUELCH_ENABLE + if (msg_debug_level <= gpsd_hexdump_level) + return gpsd_hexdump(binbuf, binbuflen); +#endif /* SQUELCH_ENABLE */ + return ""; +} + char /*@ observer @*/ *gpsd_hexdump(const void *binbuf, size_t binbuflen) { static char hexbuf[MAX_PACKET_LENGTH*2+1]; -- cgit v1.2.1