Piotr Caban : msvcrt: Use temporary buffers to speed up operations on stdout and stderr.
Alexandre Julliard
julliard at winehq.org
Wed Jan 30 13:43:22 CST 2013
Module: wine
Branch: master
Commit: a8df9b14ada72409625dead81936c7b2c0fcec64
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8df9b14ada72409625dead81936c7b2c0fcec64
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Jan 29 13:21:27 2013 +0100
msvcrt: Use temporary buffers to speed up operations on stdout and stderr.
---
dlls/msvcrt/file.c | 43 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 8e2a067..fc4154c 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -595,6 +595,29 @@ static BOOL msvcrt_alloc_buffer(MSVCRT_FILE* file)
return TRUE;
}
+/* INTERNAL: Allocate temporary buffer for stdout and stderr */
+static BOOL add_std_buffer(MSVCRT_FILE *file)
+{
+ static char buffers[2][MSVCRT_BUFSIZ];
+
+ if((file->_file!=MSVCRT_STDOUT_FILENO && file->_file!=MSVCRT_STDERR_FILENO)
+ || !MSVCRT__isatty(file->_file) || file->_bufsiz)
+ return FALSE;
+
+ file->_ptr = file->_base = buffers[file->_file == MSVCRT_STDOUT_FILENO ? 0 : 1];
+ file->_bufsiz = file->_cnt = MSVCRT_BUFSIZ;
+ return TRUE;
+}
+
+/* INTERNAL: Removes temporary buffer from stdout or stderr */
+/* Only call this function when add_std_buffer returned TRUE */
+static void remove_std_buffer(MSVCRT_FILE *file)
+{
+ msvcrt_flush_buffer(file);
+ file->_ptr = file->_base = NULL;
+ file->_bufsiz = file->_cnt = 0;
+}
+
/* INTERNAL: Convert integer to base32 string (0-9a-v), 0 becomes "" */
static int msvcrt_int_to_base32(int num, char *str)
{
@@ -3911,6 +3934,7 @@ int CDECL MSVCRT_fputs(const char *s, MSVCRT_FILE* file)
int CDECL MSVCRT_fputws(const MSVCRT_wchar_t *s, MSVCRT_FILE* file)
{
MSVCRT_size_t i, len = strlenW(s);
+ BOOL tmp_buf;
int ret;
MSVCRT__lock_file(file);
@@ -3919,13 +3943,17 @@ int CDECL MSVCRT_fputws(const MSVCRT_wchar_t *s, MSVCRT_FILE* file)
MSVCRT__unlock_file(file);
return ret;
}
+
+ tmp_buf = add_std_buffer(file);
for (i=0; i<len; i++) {
if(MSVCRT_fputwc(s[i], file) == MSVCRT_WEOF) {
+ if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
return MSVCRT_WEOF;
}
}
+ if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
return 0;
}
@@ -4271,10 +4299,13 @@ static int puts_clbk_file_w(void *file, int len, const MSVCRT_wchar_t *str)
*/
int CDECL MSVCRT_vfprintf(MSVCRT_FILE* file, const char *format, __ms_va_list valist)
{
+ BOOL tmp_buf;
int ret;
MSVCRT__lock_file(file);
+ tmp_buf = add_std_buffer(file);
ret = pf_printf_a(puts_clbk_file_a, file, format, NULL, FALSE, FALSE, arg_clbk_valist, NULL, &valist);
+ if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
return ret;
@@ -4285,12 +4316,15 @@ int CDECL MSVCRT_vfprintf(MSVCRT_FILE* file, const char *format, __ms_va_list va
*/
int CDECL MSVCRT_vfprintf_s(MSVCRT_FILE* file, const char *format, __ms_va_list valist)
{
+ BOOL tmp_buf;
int ret;
if(!MSVCRT_CHECK_PMT(file != NULL)) return -1;
MSVCRT__lock_file(file);
+ tmp_buf = add_std_buffer(file);
ret = pf_printf_a(puts_clbk_file_a, file, format, NULL, FALSE, TRUE, arg_clbk_valist, NULL, &valist);
+ if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
return ret;
@@ -4301,10 +4335,13 @@ int CDECL MSVCRT_vfprintf_s(MSVCRT_FILE* file, const char *format, __ms_va_list
*/
int CDECL MSVCRT_vfwprintf(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms_va_list valist)
{
+ BOOL tmp_buf;
int ret;
MSVCRT__lock_file(file);
+ tmp_buf = add_std_buffer(file);
ret = pf_printf_w(puts_clbk_file_w, file, format, NULL, FALSE, FALSE, arg_clbk_valist, NULL, &valist);
+ if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
return ret;
@@ -4315,12 +4352,15 @@ int CDECL MSVCRT_vfwprintf(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms
*/
int CDECL MSVCRT_vfwprintf_s(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms_va_list valist)
{
+ BOOL tmp_buf;
int ret;
if (!MSVCRT_CHECK_PMT( file != NULL )) return -1;
MSVCRT__lock_file(file);
+ tmp_buf = add_std_buffer(file);
ret = pf_printf_w(puts_clbk_file_w, file, format, NULL, FALSE, TRUE, arg_clbk_valist, NULL, &valist);
+ if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
return ret;
@@ -4332,12 +4372,15 @@ int CDECL MSVCRT_vfwprintf_s(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __
int CDECL MSVCRT__vfwprintf_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format,
MSVCRT__locale_t locale, __ms_va_list valist)
{
+ BOOL tmp_buf;
int ret;
if (!MSVCRT_CHECK_PMT( file != NULL )) return -1;
MSVCRT__lock_file(file);
+ tmp_buf = add_std_buffer(file);
ret = pf_printf_w(puts_clbk_file_w, file, format, locale, FALSE, FALSE, arg_clbk_valist, NULL, &valist);
+ if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
return ret;
More information about the wine-cvs
mailing list