Piotr Caban : msvcrt: Improved tmpnam/wtmpnam implementation.

Alexandre Julliard julliard at winehq.org
Wed May 25 11:28:12 CDT 2011


Module: wine
Branch: master
Commit: abb3db5c5780620c1c19a67094d8619e512298cd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=abb3db5c5780620c1c19a67094d8619e512298cd

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue May 24 17:23:13 2011 +0200

msvcrt: Improved tmpnam/wtmpnam implementation.

---

 dlls/msvcrt/file.c   |   27 ++++++++++++++++++++-------
 dlls/msvcrt/msvcrt.h |    4 +++-
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index d47a25a..7ee7b62 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -108,8 +108,6 @@ static int MSVCRT_umask = 0;
 
 /* INTERNAL: static data for tmpnam and _wtmpname functions */
 static int tmpnam_unique;
-static char MSVCRT_tmpname[MAX_PATH];
-static MSVCRT_wchar_t MSVCRT_wtmpname[MAX_PATH];
 
 static const unsigned int EXE = 'e' << 16 | 'x' << 8 | 'e';
 static const unsigned int BAT = 'b' << 16 | 'a' << 8 | 't';
@@ -3654,8 +3652,16 @@ char * CDECL MSVCRT_tmpnam(char *s)
   char tmpstr[16];
   char *p;
   int count, size;
-  if (s == 0)
-    s = MSVCRT_tmpname;
+
+  if (!s) {
+    thread_data_t *data = msvcrt_get_thread_data();
+
+    if(!data->tmpnam_buffer)
+      data->tmpnam_buffer = MSVCRT_malloc(MAX_PATH);
+
+    s = data->tmpnam_buffer;
+  }
+
   msvcrt_int_to_base32(GetCurrentProcessId(), tmpstr);
   p = s + sprintf(s, "\\s%s.", tmpstr);
   for (count = 0; count < MSVCRT_TMP_MAX; count++)
@@ -3672,14 +3678,21 @@ char * CDECL MSVCRT_tmpnam(char *s)
 /*********************************************************************
  *              _wtmpnam (MSVCRT.@)
  */
-MSVCRT_wchar_t * MSVCRT_wtmpnam(MSVCRT_wchar_t *s)
+MSVCRT_wchar_t * CDECL MSVCRT_wtmpnam(MSVCRT_wchar_t *s)
 {
     static const MSVCRT_wchar_t format[] = {'\\','s','%','s','.',0};
     MSVCRT_wchar_t tmpstr[16];
     MSVCRT_wchar_t *p;
     int count, size;
-    if (s == 0)
-        s = MSVCRT_wtmpname;
+    if (!s) {
+        thread_data_t *data = msvcrt_get_thread_data();
+
+        if(!data->wtmpnam_buffer)
+            data->wtmpnam_buffer = MSVCRT_malloc(sizeof(MSVCRT_wchar_t[MAX_PATH]));
+
+        s = data->wtmpnam_buffer;
+    }
+
     msvcrt_int_to_base32_w(GetCurrentProcessId(), tmpstr);
     p = s + MSVCRT__snwprintf(s, MAX_PATH, format, tmpstr);
     for (count = 0; count < MSVCRT_TMP_MAX; count++)
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 90056ba..a0d3acb 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -169,7 +169,9 @@ struct __thread_data {
     unsigned char                  *mbstok_next;        /* next ptr for mbstok() */
     char                           *strerror_buffer;    /* buffer for strerror */
     MSVCRT_wchar_t                 *wcserror_buffer;    /* buffer for wcserror */
-    void                           *unk2[4];
+    char                           *tmpnam_buffer;      /* buffer for tmpname() */
+    MSVCRT_wchar_t                 *wtmpnam_buffer;     /* buffer for wtmpname() */
+    void                           *unk2[2];
     char                           *asctime_buffer;     /* buffer for asctime */
     MSVCRT_wchar_t                 *wasctime_buffer;    /* buffer for wasctime */
     struct MSVCRT_tm               *time_buffer;        /* buffer for localtime/gmtime */




More information about the wine-cvs mailing list