Matthias Kilian <k...@outback.escape.de> writes:

> New diff, where I only changed the debug stuff (and introduced a
> new typedef for it).

Your change is OK by me.

> The reason I didn't touch the other message
> printing functions is that they call printf(3)-like functions several
> times and don't do any error checking at all, and it's not clear
> what to do with those functions.

One step at a time sounds good to me.

> Fortunately, changing vdebugBelch() / debugMsgFn, rtsDebugMsgFn()
> are enough to kill the %n, and rtsDebugMsgFn() calls vfprintf(3) only
> once, so it's easy to let rtsDebugMsgFn() return the result of
> vfprintf(3).
>
> If upstream is interested, the next thing would be to remove those
> (unnecessary) indirections via function pointers.

Sure, might as well discuss this with them while landing your patch.

Thanks
Greg

>
> Ciao,
>       Kili
>
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/lang/ghc/Makefile,v
> retrieving revision 1.188
> diff -u -p -r1.188 Makefile
> --- Makefile  16 Aug 2021 21:23:18 -0000      1.188
> +++ Makefile  12 Sep 2021 19:40:01 -0000
> @@ -19,6 +19,8 @@ DISTNAME =          ghc-${GHC_VERSION}
>  CATEGORIES =         lang devel
>  HOMEPAGE =           https://www.haskell.org/ghc/
>  
> +REVISION =           0
> +
>  # Version of the precompiled binaries
>  BIN_VER =            8.10.3.20210429
>  
> Index: patches/patch-includes_rts_Messages_h
> ===================================================================
> RCS file: patches/patch-includes_rts_Messages_h
> diff -N patches/patch-includes_rts_Messages_h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-includes_rts_Messages_h     12 Sep 2021 19:40:01 -0000
> @@ -0,0 +1,34 @@
> +$OpenBSD$
> +
> +The debug message function has to return the number of bytes written
> +(like printf(3)), to allow killing a %n format specifier in one in
> +one invocation of statsPrintf() in report_summary() (rts/Stats.c).
> +
> +Index: includes/rts/Messages.h
> +--- includes/rts/Messages.h.orig
> ++++ includes/rts/Messages.h
> +@@ -85,20 +85,21 @@ void vsysErrorBelch(const char *s, va_list ap);
> + void debugBelch(const char *s, ...)
> +    GNUC3_ATTRIBUTE(format (PRINTF, 1, 2));
> + 
> +-void vdebugBelch(const char *s, va_list ap);
> ++int vdebugBelch(const char *s, va_list ap);
> + 
> + 
> + /* Hooks for redirecting message generation: */
> + 
> + typedef void RtsMsgFunction(const char *, va_list);
> ++typedef int RtsMsgFunctionRetLen(const char *, va_list);
> + 
> + extern RtsMsgFunction *fatalInternalErrorFn;
> +-extern RtsMsgFunction *debugMsgFn;
> ++extern RtsMsgFunctionRetLen *debugMsgFn;
> + extern RtsMsgFunction *errorMsgFn;
> + 
> + /* Default stdio implementation of the message hooks: */
> + 
> + extern RtsMsgFunction rtsFatalInternalErrorFn;
> +-extern RtsMsgFunction rtsDebugMsgFn;
> ++extern RtsMsgFunctionRetLen rtsDebugMsgFn;
> + extern RtsMsgFunction rtsErrorMsgFn;
> + extern RtsMsgFunction rtsSysErrorMsgFn;
> Index: patches/patch-rts_RtsMessages_c
> ===================================================================
> RCS file: patches/patch-rts_RtsMessages_c
> diff -N patches/patch-rts_RtsMessages_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-rts_RtsMessages_c   12 Sep 2021 19:40:01 -0000
> @@ -0,0 +1,65 @@
> +$OpenBSD$
> +
> +The debug message function has to return the number of bytes written
> +(like printf(3)), to allow killing a %n format specifier in one in
> +one invocation of statsPrintf() in report_summary() (rts/Stats.c).
> +
> +Index: rts/RtsMessages.c
> +--- rts/RtsMessages.c.orig
> ++++ rts/RtsMessages.c
> +@@ -36,7 +36,7 @@
> + 
> + // Default to the stdio implementation of these hooks.
> + RtsMsgFunction *fatalInternalErrorFn = rtsFatalInternalErrorFn;
> +-RtsMsgFunction *debugMsgFn           = rtsDebugMsgFn;
> ++RtsMsgFunctionRetLen *debugMsgFn           = rtsDebugMsgFn;
> + RtsMsgFunction *errorMsgFn           = rtsErrorMsgFn;
> + RtsMsgFunction *sysErrorMsgFn        = rtsSysErrorMsgFn;
> + 
> +@@ -102,10 +102,10 @@ debugBelch(const char*s, ...)
> +   va_end(ap);
> + }
> + 
> +-void
> ++int
> + vdebugBelch(const char*s, va_list ap)
> + {
> +-  (*debugMsgFn)(s,ap);
> ++  return (*debugMsgFn)(s,ap);
> + }
> + 
> + /* 
> -----------------------------------------------------------------------------
> +@@ -285,16 +285,16 @@ rtsSysErrorMsgFn(const char *s, va_list ap)
> + #endif
> + }
> + 
> +-void
> ++int
> + rtsDebugMsgFn(const char *s, va_list ap)
> + {
> ++  int r;
> + #if defined(mingw32_HOST_OS)
> +   /* Ensure we're in text mode so newlines get encoded properly.  */
> +   int mode = _setmode (_fileno(stderr), _O_TEXT);
> +   if (isGUIApp())
> +   {
> +      char buf[BUFSIZE];
> +-         int r;
> + 
> +          r = vsnprintf(buf, BUFSIZE, s, ap);
> +          if (r > 0 && r < BUFSIZE) {
> +@@ -305,12 +305,13 @@ rtsDebugMsgFn(const char *s, va_list ap)
> + #endif
> +   {
> +      /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
> +-     vfprintf(stderr, s, ap);
> ++     r = vfprintf(stderr, s, ap);
> +      fflush(stderr);
> +   }
> + #if defined(mingw32_HOST_OS)
> +   _setmode (_fileno(stderr), mode);
> + #endif
> ++  return r;
> + }
> + 
> + 
> Index: patches/patch-rts_Stats_c
> ===================================================================
> RCS file: patches/patch-rts_Stats_c
> diff -N patches/patch-rts_Stats_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-rts_Stats_c 12 Sep 2021 19:40:01 -0000
> @@ -0,0 +1,54 @@
> +$OpenBSD$
> +
> +Kill a use of %n format specifier.
> +
> +Index: rts/Stats.c
> +--- rts/Stats.c.orig
> ++++ rts/Stats.c
> +@@ -69,7 +69,7 @@ static Time *GC_coll_cpu = NULL;
> + static Time *GC_coll_elapsed = NULL;
> + static Time *GC_coll_max_pause = NULL;
> + 
> +-static void statsPrintf( char *s, ... ) GNUC3_ATTRIBUTE(format (PRINTF, 1, 
> 2));
> ++static int statsPrintf( char *s, ... ) GNUC3_ATTRIBUTE(format (PRINTF, 1, 
> 2));
> + static void statsFlush( void );
> + static void statsClose( void );
> + 
> +@@ -1024,8 +1024,10 @@ static void report_summary(const RTSSummaryStats* sum)
> + 
> +         for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
> +             int prefix_length = 0;
> +-            statsPrintf("%*s" "gen[%" FMT_Word32 "%n",
> +-                        col_width[0], "", g, &prefix_length);
> ++            prefix_length = statsPrintf("%*s" "gen[%" FMT_Word32,
> ++                        col_width[0], "", g);
> ++            if (prefix_length < 0)
> ++                prefix_length = 0;
> +             prefix_length -= col_width[0];
> +             int suffix_length = col_width[1] + prefix_length;
> +             suffix_length =
> +@@ -1735,19 +1737,21 @@ void getRTSStats( RTSStats *s )
> +    Dumping stuff in the stats file, or via the debug message interface
> +    
> -------------------------------------------------------------------------- */
> + 
> +-void
> ++int
> + statsPrintf( char *s, ... )
> + {
> ++    int ret = 0;
> +     FILE *sf = RtsFlags.GcFlags.statsFile;
> +     va_list ap;
> + 
> +     va_start(ap,s);
> +     if (sf == NULL) {
> +-        vdebugBelch(s,ap);
> ++        ret = vdebugBelch(s,ap);
> +     } else {
> +-        vfprintf(sf, s, ap);
> ++        ret = vfprintf(sf, s, ap);
> +     }
> +     va_end(ap);
> ++    return ret;
> + }
> + 
> + static void

Reply via email to