[newlib-cygwin] Cygwin: smallprint.cc: Convert tmpbuf to lockless

Corinna Vinschen corinna@sourceware.org
Mon Aug 22 10:01:30 GMT 2022


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=07ec40170a32cc614818ec8fa13cacef0a8252a0

commit 07ec40170a32cc614818ec8fa13cacef0a8252a0
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Mon Aug 22 12:01:15 2022 +0200

    Cygwin: smallprint.cc: Convert tmpbuf to lockless
    
    The old technique was from a time when we had to reduce stack pressure
    by moving 64K buffers elsewhere.  It was implemented using a static
    global buffer, guarded by a muto. However, that adds a lock which may
    unnecessarily serialize threads.
    
    Use Windows heap buffers per invocation instead.  HeapAlloc/HeapFree are
    pretty fast, scale nicely in multithreaded scenarios and don't serialize
    threads unnecessarily.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/smallprint.cc | 24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/winsup/cygwin/smallprint.cc b/winsup/cygwin/smallprint.cc
index d64e3fdcb..0e8c6d9a9 100644
--- a/winsup/cygwin/smallprint.cc
+++ b/winsup/cygwin/smallprint.cc
@@ -56,32 +56,26 @@ static const char hex_str_lower[] = "0123456789abcdef";
 
 class tmpbuf
 {
-  static WCHAR buf[NT_MAX_PATH];
-  static muto lock;
-  bool locked;
+  PWCHAR buf;
+
 public:
   operator WCHAR * ()
   {
-    if (!locked)
-      {
-	lock.init ("smallprint_buf")->acquire ();
-	locked = true;
-      }
+    if (!buf)
+      buf = (PWCHAR) HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+				NT_MAX_PATH * sizeof (WCHAR));
     return buf;
   }
-  operator char * () {return (char *) ((WCHAR *) *this);}
+  operator char * ()  { return (char *) ((WCHAR *) *this); }
 
-  tmpbuf (): locked (false) {};
+  tmpbuf () : buf (NULL) {}
   ~tmpbuf ()
   {
-    if (locked)
-      lock.release ();
+    if (buf)
+      HeapFree (GetProcessHeap (), 0, buf);
   }
 };
 
-WCHAR tmpbuf::buf[NT_MAX_PATH];
-NO_COPY muto tmpbuf::lock;
-
 static char *
 __rn (char *dst, int base, int dosign, long long val, int len, int pad, unsigned long long mask)
 {


More information about the Cygwin-cvs mailing list