=?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcrt: Added _fread_nolock_s implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 10 07:49:47 CST 2014


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

Author: Iván Matellanes <matellanesivan at gmail.com>
Date:   Sun Nov  9 20:17:45 2014 +0100

msvcrt: Added _fread_nolock_s implementation.

---

 dlls/msvcr100/msvcr100.spec    |  2 +-
 dlls/msvcr100/tests/msvcr100.c | 35 +++++++++++++++++++++++++++++++++++
 dlls/msvcr110/msvcr110.spec    |  2 +-
 dlls/msvcr120/msvcr120.spec    |  2 +-
 dlls/msvcr80/msvcr80.spec      |  2 +-
 dlls/msvcr90/msvcr90.spec      |  2 +-
 dlls/msvcrt/file.c             | 26 ++++++++++++++++++++++++--
 dlls/msvcrt/msvcrt.h           |  1 +
 include/msvcrt/stdio.h         |  2 ++
 9 files changed, 67 insertions(+), 7 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index cb45506..a6e7771 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -835,7 +835,7 @@
 @ cdecl _fputwc_nolock(long ptr) MSVCRT__fputwc_nolock
 @ cdecl _fputwchar(long) MSVCRT__fputwchar
 @ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock
-@ stub _fread_nolock_s
+@ cdecl _fread_nolock_s(ptr long long long ptr) MSVCRT__fread_nolock_s
 @ cdecl _free_locale(ptr) MSVCRT__free_locale
 @ stub _freea
 @ stub _freea_s
diff --git a/dlls/msvcr100/tests/msvcr100.c b/dlls/msvcr100/tests/msvcr100.c
index a998fb5..4c66ed5 100644
--- a/dlls/msvcr100/tests/msvcr100.c
+++ b/dlls/msvcr100/tests/msvcr100.c
@@ -140,6 +140,8 @@ static int (__cdecl *p_wmemmove_s)(wchar_t *dest, size_t numberOfElements, const
 static FILE* (__cdecl *p_fopen)(const char*,const char*);
 static int (__cdecl *p_fclose)(FILE*);
 static size_t (__cdecl *p_fread_s)(void*,size_t,size_t,size_t,FILE*);
+static void (__cdecl *p_lock_file)(FILE*);
+static void (__cdecl *p_unlock_file)(FILE*);
 static void* (__cdecl *p__aligned_offset_malloc)(size_t, size_t, size_t);
 static void (__cdecl *p__aligned_free)(void*);
 static size_t (__cdecl *p__aligned_msize)(void*, size_t, size_t);
@@ -178,6 +180,8 @@ static BOOL init(void)
     SET(p_fopen, "fopen");
     SET(p_fclose, "fclose");
     SET(p_fread_s, "fread_s");
+    SET(p_lock_file, "_lock_file");
+    SET(p_unlock_file, "_unlock_file");
     SET(p__aligned_offset_malloc, "_aligned_offset_malloc");
     SET(p__aligned_free, "_aligned_free");
     SET(p__aligned_msize, "_aligned_msize");
@@ -357,11 +361,30 @@ static void test_wmemmove_s(void)
             "Cannot reset invalid parameter handler\n");
 }
 
+struct block_file_arg
+{
+    FILE *test_file;
+    HANDLE init;
+    HANDLE finish;
+};
+
+static DWORD WINAPI block_file(void *arg)
+{
+    struct block_file_arg *files = arg;
+    p_lock_file(files->test_file);
+    SetEvent(files->init);
+    WaitForSingleObject(files->finish, INFINITE);
+    p_unlock_file(files->test_file);
+    return 0;
+}
+
 static void test_fread_s(void)
 {
     static const char test_file[] = "fread_s.tst";
     int ret;
     char buf[10];
+    HANDLE thread;
+    struct block_file_arg arg;
 
     FILE *f = fopen(test_file, "w");
     if(!f) {
@@ -382,6 +405,12 @@ static void test_fread_s(void)
     CHECK_CALLED(invalid_parameter_handler);
 
     f = p_fopen(test_file, "r");
+    arg.test_file = f;
+    arg.init = CreateEventW(NULL, FALSE, FALSE, NULL);
+    arg.finish = CreateEventW(NULL, FALSE, FALSE, NULL);
+    thread = CreateThread(NULL, 0, block_file, (void*)&arg, 0, NULL);
+    WaitForSingleObject(arg.init, INFINITE);
+
     errno = 0xdeadbeef;
     ret = p_fread_s(NULL, sizeof(buf), 0, 1, f);
     ok(ret == 0, "fread_s returned %d, expected 0\n", ret);
@@ -390,6 +419,9 @@ static void test_fread_s(void)
     ok(ret == 0, "fread_s returned %d, expected 0\n", ret);
     ok(errno == 0xdeadbeef, "errno = %d, expected 0xdeadbeef\n", errno);
 
+    SetEvent(arg.finish);
+    WaitForSingleObject(thread, INFINITE);
+
     SET_EXPECT(invalid_parameter_handler);
     errno = 0xdeadbeef;
     ret = p_fread_s(NULL, sizeof(buf), 1, 1, f);
@@ -426,6 +458,9 @@ static void test_fread_s(void)
 
     ok(p_set_invalid_parameter_handler(NULL) == test_invalid_parameter_handler,
             "Cannot reset invalid parameter handler\n");
+    CloseHandle(arg.init);
+    CloseHandle(arg.finish);
+    CloseHandle(thread);
     unlink(test_file);
 }
 
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index d41699d..141697c 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1183,7 +1183,7 @@
 @ cdecl _fputwc_nolock(long ptr) MSVCRT__fputwc_nolock
 @ cdecl _fputwchar(long) MSVCRT__fputwchar
 @ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock
-@ stub _fread_nolock_s
+@ cdecl _fread_nolock_s(ptr long long long ptr) MSVCRT__fread_nolock_s
 @ cdecl _free_locale(ptr) MSVCRT__free_locale
 @ stub _freea
 @ stub _freea_s
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index fbf688e..1b8dc28 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -1181,7 +1181,7 @@
 @ cdecl _fputwc_nolock(long ptr) MSVCRT__fputwc_nolock
 @ cdecl _fputwchar(long) MSVCRT__fputwchar
 @ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock
-@ stub _fread_nolock_s
+@ cdecl _fread_nolock_s(ptr long long long ptr) MSVCRT__fread_nolock_s
 @ cdecl _free_locale(ptr) MSVCRT__free_locale
 @ stub _freea
 @ stub _freea_s
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index efb4539..fcad7cd 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -502,7 +502,7 @@
 @ cdecl _fputwc_nolock(long ptr) MSVCRT__fputwc_nolock
 @ cdecl _fputwchar(long) MSVCRT__fputwchar
 @ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock
-@ stub _fread_nolock_s
+@ cdecl _fread_nolock_s(ptr long long long ptr) MSVCRT__fread_nolock_s
 @ cdecl _free_locale(ptr) MSVCRT__free_locale
 @ stub _freea
 @ stub _freea_s
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index fa62366..7328b46 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -484,7 +484,7 @@
 @ cdecl _fputwc_nolock(long ptr) MSVCRT__fputwc_nolock
 @ cdecl _fputwchar(long) MSVCRT__fputwchar
 @ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock
-@ stub _fread_nolock_s
+@ cdecl _fread_nolock_s(ptr long long long ptr) MSVCRT__fread_nolock_s
 @ cdecl _free_locale(ptr) MSVCRT__free_locale
 @ stub _freea
 @ stub _freea_s
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 491942d..5049605 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -4130,9 +4130,31 @@ MSVCRT_size_t CDECL MSVCRT__fread_nolock(void *ptr, MSVCRT_size_t size, MSVCRT_s
 MSVCRT_size_t CDECL MSVCRT_fread_s(void *buf, MSVCRT_size_t buf_size, MSVCRT_size_t elem_size,
         MSVCRT_size_t count, MSVCRT_FILE *stream)
 {
+    MSVCRT_size_t ret;
+
+    if(!MSVCRT_CHECK_PMT(stream != NULL)) {
+        if(buf && buf_size)
+            memset(buf, 0, buf_size);
+        return 0;
+    }
+    if(!elem_size || !count) return 0;
+
+    MSVCRT__lock_file(stream);
+    ret = MSVCRT__fread_nolock_s(buf, buf_size, elem_size, count, stream);
+    MSVCRT__unlock_file(stream);
+
+    return ret;
+}
+
+/*********************************************************************
+ *		_fread_nolock_s (MSVCR80.@)
+ */
+MSVCRT_size_t CDECL MSVCRT__fread_nolock_s(void *buf, MSVCRT_size_t buf_size, MSVCRT_size_t elem_size,
+        MSVCRT_size_t count, MSVCRT_FILE *stream)
+{
     size_t bytes_left, buf_pos;
 
-    TRACE("(%p %lu %lu %lu %p\n", buf, buf_size, elem_size, count, stream);
+    TRACE("(%p %lu %lu %lu %p)\n", buf, buf_size, elem_size, count, stream);
 
     if(!MSVCRT_CHECK_PMT(stream != NULL)) {
         if(buf && buf_size)
@@ -4154,7 +4176,7 @@ MSVCRT_size_t CDECL MSVCRT_fread_s(void *buf, MSVCRT_size_t buf_size, MSVCRT_siz
                 return 0;
             }
 
-            MSVCRT_fread((char*)buf+buf_pos, 1, size, stream);
+            MSVCRT__fread_nolock((char*)buf+buf_pos, 1, size, stream);
             buf_pos += size;
             bytes_left -= size;
         }else {
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 70ac68b..72d529d 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -934,6 +934,7 @@ MSVCRT_ulong* __cdecl MSVCRT___doserrno(void);
 int* __cdecl     MSVCRT__errno(void);
 char* __cdecl    MSVCRT_getenv(const char*);
 MSVCRT_size_t __cdecl MSVCRT__fread_nolock(void*,MSVCRT_size_t,MSVCRT_size_t,MSVCRT_FILE*);
+MSVCRT_size_t __cdecl MSVCRT__fread_nolock_s(void*,MSVCRT_size_t,MSVCRT_size_t,MSVCRT_size_t,MSVCRT_FILE*);
 MSVCRT_size_t __cdecl MSVCRT__fwrite_nolock(const void*,MSVCRT_size_t,MSVCRT_size_t,MSVCRT_FILE*);
 int __cdecl      MSVCRT_fclose(MSVCRT_FILE*);
 int __cdecl      MSVCRT__fclose_nolock(MSVCRT_FILE*);
diff --git a/include/msvcrt/stdio.h b/include/msvcrt/stdio.h
index eda89e6..0606d07 100644
--- a/include/msvcrt/stdio.h
+++ b/include/msvcrt/stdio.h
@@ -128,6 +128,7 @@ int    __cdecl _vsnprintf_s(char*,size_t,size_t,const char*,__ms_va_list);
 int    __cdecl _vsprintf_p_l(char*,size_t,const char*,_locale_t,__ms_va_list);
 
 size_t __cdecl _fread_nolock(void*,size_t,size_t,FILE*);
+size_t __cdecl _fread_nolock_s(void*,size_t,size_t,size_t,FILE*);
 size_t __cdecl _fwrite_nolock(const void*,size_t,size_t,FILE*);
 int    __cdecl _fclose_nolock(FILE*);
 int    __cdecl _fflush_nolock(FILE*);
@@ -156,6 +157,7 @@ int    __cdecl fprintf_s(FILE*,const char*,...);
 int    __cdecl fputc(int,FILE*);
 int    __cdecl fputs(const char*,FILE*);
 size_t __cdecl fread(void*,size_t,size_t,FILE*);
+size_t __cdecl fread_s(void*,size_t,size_t,size_t,FILE*);
 FILE*  __cdecl freopen(const char*,const char*,FILE*);
 int    __cdecl fscanf(FILE*,const char*,...);
 int    __cdecl fscanf_s(FILE*,const char*,...);




More information about the wine-cvs mailing list