diff options
Diffstat (limited to 'libc/stdlib')
| -rw-r--r-- | libc/stdlib/malloc-simple/alloc.c | 170 | 
1 files changed, 83 insertions, 87 deletions
diff --git a/libc/stdlib/malloc-simple/alloc.c b/libc/stdlib/malloc-simple/alloc.c index e017b6cbb..ed14c37c4 100644 --- a/libc/stdlib/malloc-simple/alloc.c +++ b/libc/stdlib/malloc-simple/alloc.c @@ -20,29 +20,29 @@  #ifdef L_malloc  void *malloc(size_t size)  { -    void *result; +	void *result; -    if (unlikely(size == 0)) { +	if (unlikely(size == 0)) {  #if defined(__MALLOC_GLIBC_COMPAT__) -	size++; +		size++;  #else -	/* Some programs will call malloc (0).  Lets be strict and return NULL */ -	return 0; +		/* Some programs will call malloc (0).  Lets be strict and return NULL */ +		return 0;  #endif -    } +	}  #ifdef __ARCH_HAS_MMU__ -#define MMAP_FLAGS MAP_PRIVATE | MAP_ANONYMOUS +# define MMAP_FLAGS MAP_PRIVATE | MAP_ANONYMOUS  #else -#define MMAP_FLAGS MAP_SHARED | MAP_ANONYMOUS +# define MMAP_FLAGS MAP_SHARED | MAP_ANONYMOUS  #endif -    result = mmap((void *) 0, size + sizeof(size_t), PROT_READ | PROT_WRITE, -                  MMAP_FLAGS, 0, 0); -    if (result == MAP_FAILED) -	return 0; -    * (size_t *) result = size; -    return(result + sizeof(size_t)); +	result = mmap((void *) 0, size + sizeof(size_t), PROT_READ | PROT_WRITE, +	              MMAP_FLAGS, 0, 0); +	if (result == MAP_FAILED) +		return 0; +	* (size_t *) result = size; +	return(result + sizeof(size_t));  }  #endif @@ -74,23 +74,21 @@ void * calloc(size_t nmemb, size_t lsize)  #ifdef L_realloc  void *realloc(void *ptr, size_t size)  { -    void *newptr = NULL; - -    if (!ptr) -	return malloc(size); -    if (!size) { -	free(ptr); -	return malloc(0); -    } - -    newptr = malloc(size); -    if (newptr) { -	memcpy(newptr, ptr, -		*((size_t *) (ptr - sizeof(size_t))) -	      ); -	free(ptr); -    } -    return newptr; +	void *newptr = NULL; + +	if (!ptr) +		return malloc(size); +	if (!size) { +		free(ptr); +		return malloc(0); +	} + +	newptr = malloc(size); +	if (newptr) { +		memcpy(newptr, ptr, *((size_t *) (ptr - sizeof(size_t)))); +		free(ptr); +	} +	return newptr;  }  #endif @@ -98,15 +96,14 @@ void *realloc(void *ptr, size_t size)  extern int weak_function __libc_free_aligned(void *ptr);  void free(void *ptr)  { -    if (ptr == NULL) -	return; -    if (unlikely(__libc_free_aligned!=NULL)) { -	if (__libc_free_aligned(ptr)) { -	    return; +	if (unlikely(ptr == NULL)) +		return; +	if (unlikely(__libc_free_aligned != NULL)) { +		if (__libc_free_aligned(ptr)) +			return;  	} -    } -    ptr -= sizeof(size_t); -    munmap(ptr, * (size_t *) ptr + sizeof(size_t)); +	ptr -= sizeof(size_t); +	munmap(ptr, * (size_t *) ptr + sizeof(size_t));  }  #endif @@ -124,68 +121,67 @@ pthread_mutex_t __malloc_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;  /* 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.  */ +	struct alignlist *next; +	__ptr_t aligned;	/* The address that memaligned returned.  */ +	__ptr_t exact;	/* The address that malloc returned.  */  };  struct alignlist *_aligned_blocks;  /* Return memory to the heap. */  int __libc_free_aligned(void *ptr)  { -    struct alignlist *l; +	struct alignlist *l; -    if (ptr == NULL) -	return 0; +	if (ptr == NULL) +		return 0; -    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; -	    ptr -= sizeof(size_t); -	    munmap(ptr, * (size_t *) ptr + sizeof(size_t)); -	    return 1; +	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; +			ptr -= sizeof(size_t); +			munmap(ptr, * (size_t *) ptr + sizeof(size_t)); +			return 1; +		}  	} -    } -    UNLOCK; -    return 0; +	UNLOCK; +	return 0;  }  void * memalign (size_t alignment, size_t size)  { -    void * 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(result); -		UNLOCK; +	void * result; +	unsigned long int adj; + +	result = malloc (size + alignment - 1); +	if (result == NULL)  		return NULL; -	    } -	    l->next = _aligned_blocks; -	    _aligned_blocks = l; + +	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(result); +				UNLOCK; +				return NULL; +			} +			l->next = _aligned_blocks; +			_aligned_blocks = l; +		} +		l->exact = result; +		result = l->aligned = (char *) result + alignment - adj; +		UNLOCK;  	} -	l->exact = result; -	result = l->aligned = (char *) result + alignment - adj; -	UNLOCK; -    } -    return result; +	return result;  }  #endif  | 
