[PATCH 5/5] ucrtbase: Update ioinfo structure.
Paul Gofman
pgofman at codeweavers.com
Mon Apr 4 10:52:21 CDT 2022
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
dlls/msvcrt/file.c | 73 +++++++++++++++++++++++++++++++++++++++-------
1 file changed, 62 insertions(+), 11 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 637cc614fad..13a4088e8b6 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -89,6 +89,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
static char utf8_bom[3] = { 0xef, 0xbb, 0xbf };
static char utf16_bom[2] = { 0xff, 0xfe };
+#define MSVCRT_INTERNAL_BUFSIZ 4096
+
enum textmode
{
TEXTMODE_ANSI,
@@ -96,12 +98,33 @@ enum textmode
TEXTMODE_UTF16LE,
};
-/* FIXME: this should be allocated dynamically */
+#if _MSVCR_VER >= 140
+
+#define MSVCRT_MAX_FILES 8192
+#define MSVCRT_FD_BLOCK_SIZE 64
+
+typedef struct {
+ CRITICAL_SECTION crit;
+ HANDLE handle;
+ __int64 startpos;
+ unsigned char wxflag;
+ char textmode;
+ char lookahead[3];
+ char unicode : 1;
+ char utf8translations : 1;
+ char dbcsBufferUsed : 1;
+ char dbcsBuffer[MB_LEN_MAX];
+} ioinfo;
+
+/*********************************************************************
+ * __badioinfo (MSVCRT.@)
+ */
+ioinfo MSVCRT___badioinfo = { {0}, INVALID_HANDLE_VALUE, 0, WX_TEXT };
+#else
+
#define MSVCRT_MAX_FILES 2048
#define MSVCRT_FD_BLOCK_SIZE 32
-#define MSVCRT_INTERNAL_BUFSIZ 4096
-
typedef struct {
HANDLE handle;
unsigned char wxflag;
@@ -114,23 +137,35 @@ typedef struct {
char pipech2[2];
__int64 startpos;
BOOL utf8translations;
- char dbcsBuffer;
+ char dbcsBuffer[1];
BOOL dbcsBufferUsed;
#endif
} ioinfo;
/*********************************************************************
- * __pioinfo (MSVCRT.@)
- * array of pointers to ioinfo arrays [32]
+ * __badioinfo (MSVCRT.@)
*/
-ioinfo * MSVCRT___pioinfo[MSVCRT_MAX_FILES/MSVCRT_FD_BLOCK_SIZE] = { 0 };
+ioinfo MSVCRT___badioinfo = { INVALID_HANDLE_VALUE, WX_TEXT };
+#endif
/*********************************************************************
- * __badioinfo (MSVCRT.@)
+ * __pioinfo (MSVCRT.@)
+ * array of pointers to ioinfo arrays [32]
*/
-ioinfo MSVCRT___badioinfo = { INVALID_HANDLE_VALUE, WX_TEXT };
+ioinfo * MSVCRT___pioinfo[MSVCRT_MAX_FILES/MSVCRT_FD_BLOCK_SIZE] = { 0 };
#if _MSVCR_VER >= 80
+
+#if _MSVCR_VER >= 140
+static inline BOOL ioinfo_is_crit_init(ioinfo *info)
+{
+ return TRUE;
+}
+
+static inline void ioinfo_set_crit_init(ioinfo *info)
+{
+}
+#else
static inline BOOL ioinfo_is_crit_init(ioinfo *info)
{
return info->exflag & 1;
@@ -140,6 +175,7 @@ static inline void ioinfo_set_crit_init(ioinfo *info)
{
info->exflag |= 1;
}
+#endif
static inline enum textmode ioinfo_get_textmode(ioinfo *info)
{
@@ -385,9 +421,24 @@ static inline BOOL alloc_pioinfo_block(int fd)
return FALSE;
}
for(i=0; i<MSVCRT_FD_BLOCK_SIZE; i++)
+ {
block[i].handle = INVALID_HANDLE_VALUE;
+ if (ioinfo_is_crit_init(&block[i]))
+ {
+ /* Initialize crit section on block allocation for _MSVC_VER >= 140,
+ * ioinfo_is_crit_init() is always TRUE. */
+ InitializeCriticalSection(&block[i].crit);
+ }
+ }
if(InterlockedCompareExchangePointer((void**)&MSVCRT___pioinfo[fd/MSVCRT_FD_BLOCK_SIZE], block, NULL))
+ {
+ if (ioinfo_is_crit_init(&block[0]))
+ {
+ for(i = 0; i < MSVCRT_FD_BLOCK_SIZE; ++i)
+ DeleteCriticalSection(&block[i].crit);
+ }
free(block);
+ }
return TRUE;
}
@@ -3571,7 +3622,7 @@ int CDECL _write(int fd, const void* buf, unsigned int count)
#if _MSVCR_VER >= 80
if (info->dbcsBufferUsed)
{
- conv[j++] = info->dbcsBuffer;
+ conv[j++] = info->dbcsBuffer[0];
info->dbcsBufferUsed = FALSE;
conv[j++] = s[i++];
len++;
@@ -3588,7 +3639,7 @@ int CDECL _write(int fd, const void* buf, unsigned int count)
if (i == count)
{
#if _MSVCR_VER >= 80
- info->dbcsBuffer = conv[j-1];
+ info->dbcsBuffer[0] = conv[j-1];
info->dbcsBufferUsed = TRUE;
break;
#else
--
2.35.1
More information about the wine-devel
mailing list