summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1996-07-03 05:03:07 +0000
committerphk <phk@FreeBSD.org>1996-07-03 05:03:07 +0000
commitc88590ee78befb7671a33f796f76fba407d31b47 (patch)
tree7f2aa7ee60aecbdd9827b1a7e8cc9155c82ba2dc /lib
parent7032fc70f0086793352baa7d231a2a74f9ae56a7 (diff)
downloadFreeBSD-src-c88590ee78befb7671a33f796f76fba407d31b47.zip
FreeBSD-src-c88590ee78befb7671a33f796f76fba407d31b47.tar.gz
Isolated all the crap for thread-safe so I can see what goes on again...
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdlib/malloc.c109
1 files changed, 48 insertions, 61 deletions
diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c
index caa12d1..e8543e4 100644
--- a/lib/libc/stdlib/malloc.c
+++ b/lib/libc/stdlib/malloc.c
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id: malloc.c,v 1.9 1996/01/05 23:30:41 phk Exp $
+ * $Id: malloc.c,v 1.10 1996/01/22 00:01:44 julian Exp $
*
*/
@@ -806,13 +806,10 @@ malloc_bytes(size_t size)
/*
* Allocate a piece of memory
*/
-void *
-malloc(size_t size)
+static __inline void *
+imalloc(size_t size)
{
void *result;
-#ifdef _THREAD_SAFE
- int status;
-#endif
if (!initialized)
malloc_init();
@@ -820,9 +817,6 @@ malloc(size_t size)
if (suicide)
abort();
-#ifdef _THREAD_SAFE
- _thread_kern_sig_block(&status);
-#endif
if (size <= malloc_maxsize)
result = malloc_bytes(size);
else
@@ -834,25 +828,19 @@ malloc(size_t size)
if (malloc_zero)
memset(result,0,size);
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return result;
}
/*
* Change the size of an allocation.
*/
-void *
-realloc(void *ptr, size_t size)
+static __inline void *
+irealloc(void *ptr, size_t size)
{
void *p;
u_long osize,index;
struct pginfo **mp;
int i;
-#ifdef _THREAD_SAFE
- int status;
-#endif
if (suicide)
return 0;
@@ -870,24 +858,15 @@ realloc(void *ptr, size_t size)
return 0;
}
-#ifdef _THREAD_SAFE
- _thread_kern_sig_block(&status);
-#endif
index = ptr2index(ptr);
if (index < malloc_pageshift) {
wrtwarning("realloc(): junk pointer (too low)\n");
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return 0;
}
if (index > last_index) {
wrtwarning("realloc(): junk pointer (too high)\n");
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return 0;
}
@@ -898,9 +877,6 @@ realloc(void *ptr, size_t size)
/* Check the pointer */
if ((u_long)ptr & malloc_pagemask) {
wrtwarning("realloc(): modified page pointer.\n");
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return 0;
}
@@ -911,9 +887,6 @@ realloc(void *ptr, size_t size)
if (!malloc_realloc && /* unless we have to, */
size <= osize && /* .. or are too small, */
size > (osize - malloc_pagesize)) { /* .. or can free a page, */
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return ptr; /* don't do anything. */
}
@@ -922,9 +895,6 @@ realloc(void *ptr, size_t size)
/* Check the pointer for sane values */
if (((u_long)ptr & ((*mp)->size-1))) {
wrtwarning("realloc(): modified chunk pointer.\n");
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return 0;
}
@@ -934,9 +904,6 @@ realloc(void *ptr, size_t size)
/* Verify that it isn't a free chunk already */
if (tst_bit(*mp,i)) {
wrtwarning("realloc(): already free chunk.\n");
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return 0;
}
@@ -946,17 +913,11 @@ realloc(void *ptr, size_t size)
size < osize && /* ..or are too small, */
(size > osize/2 || /* ..or could use a smaller size, */
osize == malloc_minsize)) { /* ..(if there is one) */
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return ptr; /* ..Don't do anything */
}
} else {
wrtwarning("realloc(): wrong page pointer.\n");
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return 0;
}
@@ -970,9 +931,6 @@ realloc(void *ptr, size_t size)
memcpy(p,ptr,size);
free(ptr);
}
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return p;
}
@@ -1162,14 +1120,11 @@ free_bytes(void *ptr, int index, struct pginfo *info)
free(vp);
}
-void
-free(void *ptr)
+static __inline void
+ifree(void *ptr)
{
struct pginfo *info;
int index;
-#ifdef _THREAD_SAFE
- int status;
-#endif
/* This is legal */
if (!ptr)
@@ -1184,24 +1139,15 @@ free(void *ptr)
if (suicide)
return;
-#ifdef _THREAD_SAFE
- _thread_kern_sig_block(&status);
-#endif
index = ptr2index(ptr);
if (index < malloc_pageshift) {
wrtwarning("free(): junk pointer (too low)\n");
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return;
}
if (index > last_index) {
wrtwarning("free(): junk pointer (too high)\n");
-#ifdef _THREAD_SAFE
- _thread_kern_sig_unblock(status);
-#endif
return;
}
@@ -1211,8 +1157,49 @@ free(void *ptr)
free_pages(ptr,index,info);
else
free_bytes(ptr,index,info);
+ return;
+}
+
+void *
+malloc(size_t size)
+{
#ifdef _THREAD_SAFE
+ int status;
+ register void *r;
+ _thread_kern_sig_block(&status);
+ r = imalloc(size);
_thread_kern_sig_unblock(status);
+ return r;
+#else
+ return imalloc(size);
+#endif
+}
+
+void
+free(void *ptr)
+{
+#ifdef _THREAD_SAFE
+ int status;
+ _thread_kern_sig_block(&status);
+ ifree(ptr);
+ _thread_kern_sig_unblock(status);
+#else
+ ifree(ptr);
#endif
return;
}
+
+void *
+realloc(void *ptr, size_t size)
+{
+#ifdef _THREAD_SAFE
+ int status;
+ register void *r;
+ _thread_kern_sig_block(&status);
+ r = irealloc(ptr, size);
+ _thread_kern_sig_unblock(status);
+ return r;
+#else
+ return irealloc(ptr, size);
+#endif
+}
OpenPOWER on IntegriCloud