yy_alt_alloc.diff(2).txt

(6 KB) Pobierz
diff -NpuBr -Xexclude.txt main/configure sherpya/configure
--- main/configure	2011-11-22 18:38:24.718750000 +0100
+++ sherpya/configure	2011-11-22 19:09:21.968750000 +0100
@@ -3466,10 +3466,17 @@ statement_check malloc.h 'memalign(64, s
 if test "$_memalign" = yes ; then
   def_memalign='#define HAVE_MEMALIGN 1'
 else
+  if mingw32 ; then
+    _memalign=yes
+    def_memalign='#define HAVE_MEMALIGN 1'
+    def_map_memalign='extern void *memalign(unsigned int boundary, unsigned int size);'
+    res_comment="emulated"
+  else
   def_memalign='#define HAVE_MEMALIGN 0'
   def_map_memalign='#define memalign(a, b) malloc(b)'
   darwin || def_memalign_hack='#define CONFIG_MEMALIGN_HACK 1'
 fi
+fi
 echores "$_memalign"
 
 
@@ -7673,6 +7680,11 @@ for I in $libs_mplayer ; do
 done
 libs_mplayer=$ld_tmp
 
+if mingw32 ; then
+ libs_mplayer="$libs_mplayer osdep/alloc-win.c"
+ libs_mencoder="$libs_mencoder osdep/alloc-win.c"
+fi
+
 
 #############################################################################
 
diff -NpuBr -Xexclude.txt main/osdep/alloc-win.c sherpya/osdep/alloc-win.c
--- main/osdep/alloc-win.c	1970-01-01 01:00:00.000000000 +0100
+++ sherpya/osdep/alloc-win.c	2011-11-22 19:09:21.984375000 +0100
@@ -0,0 +1,185 @@
+#define DEFAULT_ALIGNMENT   16
+//#define DEBUG_ALLOC
+
+/*
+  __mingw_aligned_malloc and friends, implemented using Microsoft's public
+  interfaces and with the help of the algorithm description provided
+  by Wu Yongwei: http://sourceforge.net/mailarchive/message.php?msg_id=3847075
+
+  I hereby place this implementation in the public domain.
+               -- Steven G. Johnson (stevenj@alum.mit.edu)
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stddef.h>             /* ptrdiff_t */
+#include <string.h>             /* memmove */
+
+#include <windows.h>
+
+#ifdef DEBUG_ALLOC
+#undef fprintf
+extern int fprintf (FILE *__stream, const char *__format, ...);
+#define TRACE(...) fprintf(stderr, __VA_ARGS__)
+#else
+#define TRACE(...)
+#endif
+
+#define WILL_WRAP(size, alignment) (size > (0xffffffff - (alignment + sizeof (void *))))
+
+#ifdef HAVE_STDINT_H
+#  include <stdint.h>           /* uintptr_t */
+#else
+#  define uintptr_t size_t
+#endif
+
+#define NOT_POWER_OF_TWO(n) (((n) & ((n) - 1)))
+#define UI(p) ((uintptr_t) (p))
+#define CP(p) ((char *) p)
+
+#define PTR_ALIGN(p0, alignment, offset)                                \
+            ((void *) (((UI(p0) + (alignment + sizeof(void*)) + offset) \
+                        & (~UI(alignment - 1)))                         \
+                       - offset))
+
+/* Pointer must sometimes be aligned; assume sizeof(void*) is a power of two. */
+#define ORIG_PTR(p) (*(((void **) (UI(p) & (~UI(sizeof(void*) - 1)))) - 1))
+
+static void *
+__mingw_aligned_offset_malloc (size_t size, size_t alignment, size_t offset)
+{
+  void *p0, *p;
+
+  if (NOT_POWER_OF_TWO (alignment))
+    {
+      errno = EINVAL;
+      return ((void *) 0);
+    }
+  if ((size == 0) || WILL_WRAP(size, alignment))
+    return ((void *) 0);
+  if (alignment < sizeof (void *))
+    alignment = sizeof (void *);
+
+  /* Including the extra sizeof(void*) is overkill on a 32-bit
+     machine, since malloc is already 8-byte aligned, as long
+     as we enforce alignment >= 8 ...but oh well.  */
+
+  p0 = HeapAlloc (GetProcessHeap(), 0, size + (alignment + sizeof (void *)));
+  if (!p0)
+    return ((void *) 0);
+  p = PTR_ALIGN (p0, alignment, offset);
+  ORIG_PTR (p) = p0;
+  return p;
+}
+
+static void *
+__mingw_aligned_malloc (size_t size, size_t alignment)
+{
+  return __mingw_aligned_offset_malloc (size, alignment, 0);
+}
+
+static void
+__mingw_aligned_free (void *memblock)
+{
+  if (memblock)
+    HeapFree(GetProcessHeap(), 0, ORIG_PTR (memblock));
+}
+
+static void *
+__mingw_aligned_offset_realloc (void *memblock, size_t size,
+                                size_t alignment, size_t offset)
+{
+  void *p0, *p;
+  ptrdiff_t shift;
+
+  if (!memblock)
+    return __mingw_aligned_offset_malloc (size, alignment, offset);
+  if (NOT_POWER_OF_TWO (alignment))
+    goto bad;
+  if ((size == 0) || WILL_WRAP(size, alignment))
+    {
+      __mingw_aligned_free (memblock);
+      return ((void *) 0);
+    }
+  if (alignment < sizeof (void *))
+    alignment = sizeof (void *);
+
+  p0 = ORIG_PTR (memblock);
+  /* It is an error for the alignment to change. */
+  if (memblock != PTR_ALIGN (p0, alignment, offset))
+    goto bad;
+  shift = CP (memblock) - CP (p0);
+
+  p0 = HeapReAlloc(GetProcessHeap(), 0, p0, size + (alignment + sizeof (void *)));
+  if (!p0)
+    return ((void *) 0);
+  p = PTR_ALIGN (p0, alignment, offset);
+
+  /* Relative shift of actual data may be different from before, ugh.  */
+  if (shift != CP (p) - CP (p0))
+    /* ugh, moves more than necessary if size is increased.  */
+    memmove (CP (p), CP (p0) + shift, size);
+
+  ORIG_PTR (p) = p0;
+  return p;
+
+bad:
+  errno = EINVAL;
+  return ((void *) 0);
+}
+
+static void *
+__mingw_aligned_realloc (void *memblock, size_t size, size_t alignment)
+{
+  return __mingw_aligned_offset_realloc (memblock, size, alignment, 0);
+}
+
+/* WRAPPERS */
+
+void *malloc(size_t size)
+{
+    void *p = __mingw_aligned_malloc(size, DEFAULT_ALIGNMENT);
+    TRACE("MALLOC(%d) = %p\n", size, p);
+    return p;
+}
+
+void *memalign(size_t boundary, size_t size)
+{
+    void *p = __mingw_aligned_malloc(size, boundary);
+    TRACE("MEMALIGN(%d, %d) = %p\n", boundary, size, p);
+    return p;
+}
+
+void *calloc(size_t nmemb, size_t size)
+{
+    size_t sz = nmemb * size;
+    char *d = __mingw_aligned_malloc(sz, DEFAULT_ALIGNMENT);
+    memset(d, 0, sz);
+    TRACE("CALLOC(%d, %d) = %p\n", nmemb, size, d);
+    return d;
+}
+
+void *realloc(void *ptr, size_t size)
+{
+    void *p = __mingw_aligned_realloc(ptr, size, DEFAULT_ALIGNMENT);
+    TRACE("REALLOC(%p, %d) = %p\n", ptr, size, p);
+    return p;
+}
+
+void free(void *ptr)
+{
+    TRACE("FREE(%p)\n", ptr);
+    __mingw_aligned_free(ptr);
+}
+
+char *strdup(const char *s)
+{
+    char *d;
+    size_t size = strlen(s) + 1;
+    d = __mingw_aligned_malloc(size, DEFAULT_ALIGNMENT);
+    memcpy(d, s, size - 1);
+    d[size - 1] = 0;
+    TRACE("STRDUP(%p) = %p\n", s, d);
+    return d;
+}
Zgłoś jeśli naruszono regulamin