For a project I'm working on, we need a kernel version of "realloc()".
Two questions:

    #1 Does the patch below look correct?

    #2 If so, is this something worth committing?

Thanks for any comments.

-Archie

__________________________________________________________________________
Archie Cobbs     *     Packet Design     *     http://www.packetdesign.com

--- sys/malloc.h.orig   Wed Nov 28 21:56:23 2001
+++ sys/malloc.h        Thu Nov 29 10:58:30 2001
@@ -176,6 +176,8 @@
 void   *malloc __P((unsigned long size, struct malloc_type *type, int flags));
 void   malloc_init __P((void *));
 void   malloc_uninit __P((void *));
+void   *realloc __P((void *addr, unsigned long size,
+                     struct malloc_type *type, int flags));
 #endif /* _KERNEL */
 
 #endif /* !_SYS_MALLOC_H_ */
--- kern/kern_malloc.c.orig     Wed Nov 28 21:45:18 2001
+++ kern/kern_malloc.c  Wed Nov 28 22:12:07 2001
@@ -404,6 +404,43 @@
 }
 
 /*
+ *     realloc: change the size of a memory block
+ */
+void *
+realloc(addr, size, type, flags)
+       void *addr;
+       unsigned long size;
+       struct malloc_type *type;
+       int flags;
+{
+       struct kmemusage *kup;
+       long alloc;
+       void *mem;
+
+       /* Sanity checks */
+       if (type->ks_limit == 0)
+               panic("realloc with unknown type (%s)", type->ks_shortdesc);
+       KASSERT(kmembase <= (char *)addr && (char *)addr < kmemlimit,
+           ("realloc: address %p out of range", (void *)addr));
+
+       /* Get size of original block; reuse if appropriate */
+       kup = btokup(addr);
+       alloc = 1 << kup->ku_indx;
+       if (size <= alloc
+           && (size >= (alloc >> 1) || alloc == MINALLOCSIZE))
+               return (addr);
+
+       /* Allocate new block */
+       if ((mem = malloc(size, type, flags)) == NULL)
+               return (NULL);
+
+       /* Copy over contents */
+       bcopy(addr, mem, alloc);
+       free(addr, type);
+       return (mem);
+}
+
+/*
  * Initialize the kernel memory allocator
  */
 /* ARGSUSED*/

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to