Переглянути джерело

Make sjhill happy, and revive memalign
-Erik

Eric Andersen 22 роки тому
батько
коміт
9613b65978

+ 5 - 7
libc/stdlib/Makefile

@@ -40,14 +40,12 @@ endif
 
 MSRC2=atexit.c
 MOBJ2=atexit.o on_exit.o __exit_handler.o exit.o
-
 CSRC =	abort.c getenv.c mkdtemp.c mktemp.c realpath.c mkstemp.c mkstemp64.c \
-	rand.c random.c random_r.c setenv.c system.c div.c ldiv.c \
-	getpt.c ptsname.c grantpt.c unlockpt.c gcvt.c drand48.c \
-	drand48-iter.c drand48_r.c erand48.c erand48_r.c jrand48.c \
-	jrand48_r.c lrand48.c lrand48_r.c mrand48.c mrand48_r.c \
-	nrand48.c nrand48_r.c rand_r.c srand48.c srand48_r.c calloc.c \
-	valloc.c
+	rand.c random.c random_r.c setenv.c system.c div.c ldiv.c getpt.c \
+	ptsname.c grantpt.c unlockpt.c gcvt.c drand48.c drand48-iter.c \
+	drand48_r.c erand48.c erand48_r.c jrand48.c jrand48_r.c lrand48.c \
+	lrand48_r.c mrand48.c mrand48_r.c nrand48.c nrand48_r.c rand_r.c \
+	srand48.c srand48_r.c calloc.c valloc.c
 ifeq ($(HAS_FLOATING_POINT),true)
 	CSRC += strtod.c strtof.c strtold.c
 endif

+ 1 - 0
libc/stdlib/malloc-930716/Makefile

@@ -25,6 +25,7 @@ TOPDIR=../../../
 include $(TOPDIR)Rules.mak
 
 # calloc.c can be found at uClibc/libc/stdlib/calloc.c 
+# valloc.c can be found at uClibc/libc/stdlib/valloc.c 
 CSRC=malloc.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 OBJS=$(COBJS)

+ 60 - 2
libc/stdlib/malloc-930716/malloc.c

@@ -64,6 +64,14 @@ static struct list _fraghead[BLOCKLOG];
 /* Are we experienced? */
 static int initialized;
 
+/* List of blocks allocated with memalign or valloc */
+struct alignlist
+{ 
+    struct alignlist *next;
+    __ptr_t aligned;	/* The address that memaligned returned.  */
+    __ptr_t exact;	/* The address that malloc returned.  */
+};
+static struct alignlist *_aligned_blocks;
 
 
 /* Aligned allocation.
@@ -301,12 +309,24 @@ static void * malloc_unlocked (size_t size)
     return result;
 }
 
-
-
 /* Return memory to the heap. */
 void free(void *ptr)
 {
+    struct alignlist *l;
+
+    if (ptr == NULL)
+	return;
+
     LOCK;
+    for (l = _aligned_blocks; l != NULL; l = l->next) {
+	if (l->aligned == ptr) {
+	    /* Mark the block as free */
+	    l->aligned = NULL;
+	    ptr = l->exact;
+	    break;
+	}
+    }
+
     free_unlocked(ptr);
     UNLOCK;
 }
@@ -319,6 +339,7 @@ static void free_unlocked(void *ptr)
     if (ptr == NULL)
 	return;
 
+
     block = BLOCK(ptr);
 
     switch (type = _heapinfo[block].busy.type) {
@@ -539,3 +560,40 @@ void * realloc (void *ptr, size_t size)
     UNLOCK;
 }
 
+__ptr_t memalign (size_t alignment, size_t size)
+{
+    __ptr_t result;
+    unsigned long int adj;
+
+    result = malloc (size + alignment - 1);
+    if (result == NULL)
+	return NULL;
+    adj = (unsigned long int) ((unsigned long int) ((char *) result -
+		(char *) NULL)) % alignment;
+    if (adj != 0)
+    {
+	struct alignlist *l;
+	LOCK;
+	for (l = _aligned_blocks; l != NULL; l = l->next)
+	    if (l->aligned == NULL)
+		/* This slot is free.  Use it.  */
+		break;
+	if (l == NULL)
+	{
+	    l = (struct alignlist *) malloc (sizeof (struct alignlist));
+	    if (l == NULL) {
+		free_unlocked (result);
+		UNLOCK;
+		return NULL;
+	    }
+	    l->next = _aligned_blocks;
+	    _aligned_blocks = l;
+	}
+	l->exact = result;
+	result = l->aligned = (char *) result + alignment - adj;
+	UNLOCK;
+    }
+
+    return result;
+}
+

+ 3 - 30
libc/stdlib/valloc.c

@@ -21,41 +21,14 @@ Cambridge, MA 02139, USA.
    or (US mail) as Mike Haertel c/o Free Software Foundation.  */
 
 #include <stdlib.h>
-#include "malloc.h"
-
-#ifdef	 emacs
-#include "config.h"
-#endif
-
-#ifdef	__GNU_LIBRARY__
-extern size_t __getpagesize __P ((void));
-#else
-#ifndef	USG
-extern size_t getpagesize __P ((void));
-#define	__getpagesize()	getpagesize()
-#else
-#include <sys/param.h>
-#ifdef	EXEC_PAGESIZE
-#define	__getpagesize()	EXEC_PAGESIZE
-#else /* No EXEC_PAGESIZE.  */
-#ifdef	NBPG
-#ifndef	CLSIZE
-#define	CLSIZE	1
-#endif /* No CLSIZE.  */
-#define	__getpagesize()	(NBPG * CLSIZE)
-#else /* No NBPG.  */
-#define	__getpagesize()	NBPC
-#endif /* NBPG.  */
-#endif /* EXEC_PAGESIZE.  */
-#endif /* USG.  */
-#endif
+#include <unistd.h>
 
 static size_t pagesize;
 
 __ptr_t valloc (size_t size)
 {
 	if (pagesize == 0)
-		pagesize = __getpagesize ();
+		pagesize = getpagesize ();
 
-	return memalign (pagesize, size);
+	return memalign(pagesize, size);
 }