Piotr Caban : msvcr100: Added _aligned_msize implementation.

Alexandre Julliard julliard at winehq.org
Fri Dec 21 11:05:21 CST 2012


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Dec 21 13:38:34 2012 +0100

msvcr100: Added _aligned_msize implementation.

---

 dlls/msvcr100/msvcr100.c       |   20 ++++++++++++++++++++
 dlls/msvcr100/msvcr100.spec    |    2 +-
 dlls/msvcr100/tests/msvcr100.c |   33 +++++++++++++++++++++++++++++++++
 dlls/msvcr80/msvcr80.spec      |    2 +-
 dlls/msvcr90/msvcr90.spec      |    2 +-
 5 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.c b/dlls/msvcr100/msvcr100.c
index f571aee..aeab2ad 100644
--- a/dlls/msvcr100/msvcr100.c
+++ b/dlls/msvcr100/msvcr100.c
@@ -483,6 +483,26 @@ int CDECL _get_timezone(LONG *timezone)
     return 0;
 }
 
+/* copied from dlls/msvcrt/heap.c */
+#define SAVED_PTR(x) ((void *)((DWORD_PTR)((char *)x - sizeof(void *)) & \
+                               ~(sizeof(void *) - 1)))
+
+/*********************************************************************
+ * _aligned_msize (MSVCR100.@)
+ */
+size_t CDECL _aligned_msize(void *p, size_t alignment, size_t offset)
+{
+    void **alloc_ptr;
+
+    if(!CHECK_PMT(p)) return -1;
+
+    if(alignment < sizeof(void*))
+        alignment = sizeof(void*);
+
+    alloc_ptr = SAVED_PTR(p);
+    return _msize(*alloc_ptr)-alignment-sizeof(void*);
+}
+
 /*********************************************************************
  *  DllMain (MSVCR100.@)
  */
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 38ae28a..a09b142 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -678,7 +678,7 @@
 @ extern _acmdln msvcrt._acmdln
 @ cdecl _aligned_free(ptr) msvcrt._aligned_free
 @ cdecl _aligned_malloc(long long) msvcrt._aligned_malloc
-@ stub _aligned_msize
+@ cdecl _aligned_msize(ptr long long)
 @ cdecl _aligned_offset_malloc(long long long) msvcrt._aligned_offset_malloc
 @ cdecl _aligned_offset_realloc(ptr long long long) msvcrt._aligned_offset_realloc
 @ stub _aligned_offset_recalloc
diff --git a/dlls/msvcr100/tests/msvcr100.c b/dlls/msvcr100/tests/msvcr100.c
index 143979d..99834dd 100644
--- a/dlls/msvcr100/tests/msvcr100.c
+++ b/dlls/msvcr100/tests/msvcr100.c
@@ -72,6 +72,9 @@ 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__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);
 
 /* make sure we use the correct errno */
 #undef errno
@@ -98,6 +101,9 @@ static BOOL init(void)
     SET(p_fopen, "fopen");
     SET(p_fclose, "fclose");
     SET(p_fread_s, "fread_s");
+    SET(p__aligned_offset_malloc, "_aligned_offset_malloc");
+    SET(p__aligned_free, "_aligned_free");
+    SET(p__aligned_msize, "_aligned_msize");
 
     return TRUE;
 }
@@ -326,6 +332,32 @@ static void test_fread_s(void)
     unlink(test_file);
 }
 
+static void test__aligned_msize(void)
+{
+    void *mem;
+    int ret;
+
+    mem = p__aligned_offset_malloc(23, 16, 7);
+    ret = p__aligned_msize(mem, 16, 7);
+    ok(ret == 23, "_aligned_msize returned %d\n", ret);
+    ret = p__aligned_msize(mem, 15, 7);
+    ok(ret == 24, "_aligned_msize returned %d\n", ret);
+    ret = p__aligned_msize(mem, 11, 7);
+    ok(ret == 28, "_aligned_msize returned %d\n", ret);
+    ret = p__aligned_msize(mem, 1, 7);
+    ok(ret == 39-sizeof(void*), "_aligned_msize returned %d\n", ret);
+    ret = p__aligned_msize(mem, 8, 0);
+    todo_wine ok(ret == 32, "_aligned_msize returned %d\n", ret);
+    p__aligned_free(mem);
+
+    mem = p__aligned_offset_malloc(3, 16, 0);
+    ret = p__aligned_msize(mem, 16, 0);
+    ok(ret == 3, "_aligned_msize returned %d\n", ret);
+    ret = p__aligned_msize(mem, 11, 0);
+    ok(ret == 8, "_aligned_msize returned %d\n", ret);
+    p__aligned_free(mem);
+}
+
 START_TEST(msvcr100)
 {
     if (!init())
@@ -334,4 +366,5 @@ START_TEST(msvcr100)
     test_wmemcpy_s();
     test_wmemmove_s();
     test_fread_s();
+    test__aligned_msize();
 }
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index c9469e7..4457c2c 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -334,7 +334,7 @@
 @ extern _aexit_rtn msvcrt._aexit_rtn
 @ cdecl _aligned_free(ptr) msvcrt._aligned_free
 @ cdecl _aligned_malloc(long long) msvcrt._aligned_malloc
-@ stub _aligned_msize
+@ cdecl _aligned_msize(ptr long long) msvcr100._aligned_msize
 @ cdecl _aligned_offset_malloc(long long long) msvcrt._aligned_offset_malloc
 @ cdecl _aligned_offset_realloc(ptr long long long) msvcrt._aligned_offset_realloc
 @ stub _aligned_offset_recalloc
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index bf54f0a..c20c5fd 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -326,7 +326,7 @@
 @ extern _aexit_rtn msvcrt._aexit_rtn
 @ cdecl _aligned_free(ptr) msvcrt._aligned_free
 @ cdecl _aligned_malloc(long long) msvcrt._aligned_malloc
-@ stub _aligned_msize
+@ cdecl _aligned_msize(ptr long long) msvcr100._aligned_msize
 @ cdecl _aligned_offset_malloc(long long long) msvcrt._aligned_offset_malloc
 @ cdecl _aligned_offset_realloc(ptr long long long) msvcrt._aligned_offset_realloc
 @ stub _aligned_offset_recalloc




More information about the wine-cvs mailing list