svn commit: samba r2649 - in branches/SAMBA_4_0/source: include lib
libcli/raw torture/raw
tridge at samba.org
tridge at samba.org
Sun Sep 26 04:59:04 GMT 2004
Author: tridge
Date: 2004-09-26 04:59:03 +0000 (Sun, 26 Sep 2004)
New Revision: 2649
WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source&rev=2649&nolog=1
Log:
- used some cpp tricks to make users of talloc() and talloc_realloc()
to get auto-naming of pointers very cheaply.
- fixed a couple of memory leaks found with the new tricks
A typical exit report for smbd is now:
talloc report on 'null_context' (total 811 bytes in 54 blocks)
auth/auth_sam.c:334 contains 20 bytes in 1 blocks
struct auth_serversupplied_info contains 498 bytes in 33 blocks
UNNAMED contains 8 bytes in 1 blocks
lib/data_blob.c:40 contains 16 bytes in 1 blocks
iconv(CP850,UTF8) contains 61 bytes in 4 blocks
iconv(UTF8,CP850) contains 61 bytes in 4 blocks
iconv(UTF8,UTF-16LE) contains 67 bytes in 4 blocks
iconv(UTF-16LE,UTF8) contains 67 bytes in 4 blocks
UNNAMED contains 13 bytes in 1 blocks
which is much better than before
Modified:
branches/SAMBA_4_0/source/include/talloc.h
branches/SAMBA_4_0/source/lib/data_blob.c
branches/SAMBA_4_0/source/lib/talloc.c
branches/SAMBA_4_0/source/libcli/raw/rawtrans.c
branches/SAMBA_4_0/source/torture/raw/search.c
Changeset:
Modified: branches/SAMBA_4_0/source/include/talloc.h
===================================================================
--- branches/SAMBA_4_0/source/include/talloc.h 2004-09-26 03:50:24 UTC (rev 2648)
+++ branches/SAMBA_4_0/source/include/talloc.h 2004-09-26 04:59:03 UTC (rev 2649)
@@ -24,10 +24,20 @@
/* this is only needed for compatibility with the old talloc */
typedef void TALLOC_CTX;
+/*
+ this uses a little trick to allow __LINE__ to be stringified
+*/
+#define _STRING_LINE_(s) #s
+#define _STRING_LINE2_(s) _STRING_LINE_(s)
+#define __LINESTR__ _STRING_LINE2_(__LINE__)
+#define __location__ __FILE__ ":" __LINESTR__
+
/* useful macros for creating type checked pointers */
+#define talloc(ctx, size) talloc_named_const(ctx, size, __location__)
+#define talloc_realloc(ptr, size) _talloc_realloc(ptr, size, __location__)
#define talloc_p(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type)
-#define talloc_array_p(ctx, type, count) (type *)talloc_array(ctx, sizeof(type), count)
-#define talloc_realloc_p(p, type, count) (type *)talloc_realloc_array(p, sizeof(type), count)
+#define talloc_array_p(ctx, type, count) (type *)talloc_array(ctx, sizeof(type), count, __location__)
+#define talloc_realloc_p(p, type, count) (type *)talloc_realloc_array(p, sizeof(type), count, __location__)
#define talloc_destroy(ctx) talloc_free(ctx)
Modified: branches/SAMBA_4_0/source/lib/data_blob.c
===================================================================
--- branches/SAMBA_4_0/source/lib/data_blob.c 2004-09-26 03:50:24 UTC (rev 2648)
+++ branches/SAMBA_4_0/source/lib/data_blob.c 2004-09-26 04:59:03 UTC (rev 2649)
@@ -56,6 +56,11 @@
if (ret.data) {
ret.data = talloc_steal(mem_ctx, ret.data);
+ } else {
+ /* this ensures the blob has the context attached, so a zero length call
+ to data_blob_talloc followed by a realloc doesn't cause the memory to come
+ from the NULL context */
+ ret.data = talloc(mem_ctx, 0);
}
return ret;
}
Modified: branches/SAMBA_4_0/source/lib/talloc.c
===================================================================
--- branches/SAMBA_4_0/source/lib/talloc.c 2004-09-26 03:50:24 UTC (rev 2648)
+++ branches/SAMBA_4_0/source/lib/talloc.c 2004-09-26 04:59:03 UTC (rev 2649)
@@ -26,6 +26,9 @@
#include "includes.h"
+#undef talloc
+#define talloc(ctx, size) _talloc(ctx, size)
+
#define MAX_TALLOC_SIZE 0x10000000
#define TALLOC_MAGIC 0xe814ec4f
#define TALLOC_MAGIC_FREE 0x7faebef3
@@ -59,7 +62,7 @@
/*
Allocate a bit of memory as a child of an existing pointer
*/
-void *talloc(void *context, size_t size)
+void *_talloc(void *context, size_t size)
{
struct talloc_chunk *tc;
@@ -289,7 +292,7 @@
/*
A talloc version of realloc
*/
-void *talloc_realloc(void *ptr, size_t size)
+void *_talloc_realloc(void *ptr, size_t size, const char *name)
{
struct talloc_chunk *tc;
void *new_ptr;
@@ -302,7 +305,7 @@
/* realloc(NULL) is equavalent to malloc() */
if (ptr == NULL) {
- return talloc(NULL, size);
+ return talloc_named_const(NULL, size, name);
}
tc = talloc_chunk_from_ptr(ptr);
@@ -330,6 +333,7 @@
}
tc->size = size;
+ talloc_set_name_const(tc+1, name);
return (void *)(tc+1);
}
@@ -582,26 +586,30 @@
/*
alloc an array, checking for integer overflow in the array size
*/
-void *talloc_array(void *ctx, size_t el_size, uint_t count)
+void *talloc_array(void *ctx, size_t el_size, uint_t count, const char *name)
{
if (count == 0 ||
count >= MAX_TALLOC_SIZE/el_size) {
return NULL;
}
- return talloc(ctx, el_size * count);
+ return talloc_named_const(ctx, el_size * count, name);
}
/*
realloc an array, checking for integer overflow in the array size
*/
-void *talloc_realloc_array(void *ptr, size_t el_size, uint_t count)
+void *talloc_realloc_array(void *ptr, size_t el_size, uint_t count, const char *name)
{
if (count == 0 ||
count >= MAX_TALLOC_SIZE/el_size) {
return NULL;
}
- return talloc_realloc(ptr, el_size * count);
+ ptr = talloc_realloc(ptr, el_size * count);
+ if (ptr) {
+ talloc_set_name_const(ptr, name);
+ }
+ return ptr;
}
/*
Modified: branches/SAMBA_4_0/source/libcli/raw/rawtrans.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/raw/rawtrans.c 2004-09-26 03:50:24 UTC (rev 2648)
+++ branches/SAMBA_4_0/source/libcli/raw/rawtrans.c 2004-09-26 04:59:03 UTC (rev 2649)
@@ -84,7 +84,7 @@
/* allocate it */
if (total_data != 0) {
- tdata = talloc_realloc(parms->out.data.data,total_data);
+ tdata = talloc(mem_ctx, total_data);
if (!tdata) {
DEBUG(0,("smb_raw_receive_trans: failed to enlarge data buffer to %d bytes\n", total_data));
req->status = NT_STATUS_NO_MEMORY;
@@ -94,7 +94,7 @@
}
if (total_param != 0) {
- tparam = talloc_realloc(parms->out.params.data,total_param);
+ tparam = talloc(mem_ctx, total_param);
if (!tparam) {
DEBUG(0,("smb_raw_receive_trans: failed to enlarge param buffer to %d bytes\n", total_param));
req->status = NT_STATUS_NO_MEMORY;
Modified: branches/SAMBA_4_0/source/torture/raw/search.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/search.c 2004-09-26 03:50:24 UTC (rev 2648)
+++ branches/SAMBA_4_0/source/torture/raw/search.c 2004-09-26 04:59:03 UTC (rev 2649)
@@ -681,6 +681,7 @@
}
free(fname);
}
+ talloc_free(result.list);
}
done:
@@ -898,6 +899,8 @@
}
}
+ talloc_free(result.list);
+
done:
smb_raw_exit(cli->session);
smbcli_deltree(cli->tree, BASEDIR);
More information about the samba-cvs
mailing list