Using talloc in Samba4
======================
.. contents::
Andrew Tridgell
August 2009
The most current version of this document is available at
http://samba.org/ftp/unpacked/talloc/talloc_guide.txt
If you are used to the "old" talloc from Samba3 before 3.0.20 then please read
this carefully, as talloc has changed a lot. With 3.0.20 (or 3.0.14?) the
Samba4 talloc has been ported back to Samba3, so this guide applies to both.
The new talloc is a hierarchical, reference counted memory pool system
with destructors. Quite a mouthful really, but not too bad once you
get used to it.
Perhaps the biggest change from Samba3 is that there is no distinction
between a "talloc context" and a "talloc pointer". Any pointer
returned from talloc() is itself a valid talloc context. This means
you can do this::
struct foo *X = talloc(mem_ctx, struct foo);
X->name = talloc_strdup(X, "foo");
and the pointer X->name would be a "child" of the talloc context "X"
which is itself a child of "mem_ctx". So if you do talloc_free(mem_ctx)
then it is all destroyed, whereas if you do talloc_free(X) then just X
and X->name are destroyed, and if you do talloc_free(X->name) then
just the name element of X is destroyed.
If you think about this, then what this effectively gives you is an
n-ary tree, where you can free any part of the tree with
talloc_free().
If you find this confusing, then I suggest you run the testsuite to
watch talloc in action. You may also like to add your own tests to
testsuite.c to clarify how some particular situation is handled.
Performance
-----------
All the additional features of talloc() over malloc() do come at a
price. We have a simple performance test in Samba4 that measures
talloc() versus malloc() performance, and it seems that talloc() is
about 4% slower than malloc() on my x86 Debian Linux box. For Samba,
the great reduction in code complexity that we get by using talloc
makes this worthwhile, especially as the total overhead of
talloc/malloc in Samba is already quite small.
talloc API
----------
The following is a complete guide to the talloc API. Read it all at
least twice.
Multi-threading
---------------
talloc itself does not deal with threads. It is thread-safe (assuming
the underlying "malloc" is), as long as each thread uses different
memory contexts.
If two threads use the same context then they need to synchronize in
order to be safe. In particular:
- when using talloc_enable_leak_report(), giving directly NULL as a
parent context implicitly refers to a hidden "null context" global
variable, so this should not be used in a multi-threaded environment
without proper synchronization. In threaded code turn off null tracking using
talloc_disable_null_tracking(). ;
- the context returned by talloc_autofree_context() is also global so
shouldn't be used by several threads simultaneously without
synchronization.
talloc and shared objects
-------------------------
talloc can be used in shared objects. Special care needs to be taken
to never use talloc_autofree_context() in code that might be loaded
with dlopen() and unloaded with dlclose(), as talloc_autofree_context()
internally uses atexit(3). Some platforms like modern Linux handles
this fine, but for example FreeBSD does not deal well with dlopen()
and atexit() used simultaneously: dlclose() does not clean up the list
of atexit-handlers, so when the program exits the code that was
registered from within talloc_autofree_context() is gone, the program
crashes at exit.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
(type *)talloc(const void *context, type);
The talloc() macro is the core of the talloc library. It takes a
memory context and a type, and returns a pointer to a new area of
memory of the given type.
The returned pointer is itself a talloc context, so you can use it as
the context argument to more calls to talloc if you wish.
The returned pointer is a "child" of the supplied context. This means
that if you talloc_free() the context then the new child disappears as
well. Alternatively you can free just the child.
The context argument to talloc() can be NULL, in which case a new top
level context is created.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void *talloc_size(const void *context, size_t size);
The function talloc_size() should be used when you don't have a
convenient type to pass to talloc(). Unlike talloc(), it is not type
safe (as it returns a void *), so you are on your own for type checking.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
(typeof(ptr)) talloc_ptrtype(const void *ctx, ptr);
The talloc_ptrtype() macro should be used when you have a pointer and
want to allocate memory to point at with this pointer. When compiling
with gcc >= 3 it is typesafe. Note this is a wrapper of talloc_size()
and talloc_get_name() will return the current location in the source file.
and not the type.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
int talloc_free(void *ptr);
The talloc_free() function frees a piece of talloc memory, and all its
children. You can call talloc_free() on any pointer returned by
talloc().
The return value of talloc_free() indicates success or failure, with 0
returned for success and -1 for failure. A possible failure condition
is if the pointer had a destructor attached to it and the destructor
returned -1. See talloc_set_destructor() for details on
destructors. Likewise, if "ptr" is NULL, then the function will make
no modifications and returns -1.
From version 2.0 and onwards, as a special case, talloc_free() is
refused on pointers that have more than one parent associated, as talloc
would have no way of knowing which parent should be removed. This is
different from older versions in the sense that always the reference to
the most recently established parent has been destroyed. Hence to free a
pointer that has more than one parent please use talloc_unlink().
To help you find problems in your code caused by this behaviour, if
you do try and free a pointer with more than one parent then the
talloc logging function will be called to give output like this:
ERROR: talloc_free with references at some_dir/source/foo.c:123
reference at some_dir/source/other.c:325
reference at some_dir/source/third.c:121
Please see the documentation for talloc_set_log_fn() and
talloc_set_log_stderr() for more information on talloc logging
functions.
talloc_free() operates recursively on its children.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void talloc_free_children(void *ptr);
The talloc_free_children() walks along the list of all children of a
talloc context and talloc_free()s only the children, not the context
itself.
A NULL argument is handled as no-op.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void *talloc_reference(const void *context, const void *ptr);
The talloc_reference() function makes "context" an additional parent
of "ptr".
The return value of talloc_reference() is always the original pointer
"ptr", unless talloc ran out of memory in creating the reference in
which case it will return NULL (each additional reference consumes
around 48 bytes of memory on intel x86 platforms).
If "ptr" is NULL, then the function is a no-op, and simply returns NULL.
After creating a reference you can free it in one of the following
ways:
- you can talloc_free() any parent of the original pointer. That
will reduce the number of parents of this pointer by 1, and will
cause this pointer to be freed if it runs out of parents.
- you can talloc_free() the pointer itself if it has at maximum one
parent. This behaviour has been changed since the release of version
2.0. Further informations in the description of "talloc_free".
For more control on which parent to remove, see talloc_unlink()
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
没有合适的资源?快使用搜索试试~ 我知道了~
samba-4.9.2.tar.gz
需积分: 5 0 下载量 84 浏览量
2024-03-14
11:41:42
上传
评论
收藏 17.21MB GZ 举报
温馨提示
openwrt的dl库,下载软件代码包
资源推荐
资源详情
资源评论
收起资源包目录
samba-4.9.2.tar.gz (2000个子文件)
codepoints.c 939KB
srv_spoolss_nt.c 309KB
torture.c 297KB
trans2.c 252KB
reply.c 216KB
net_rpc.c 201KB
srv_samr_nt.c 182KB
pdb_ldap.c 179KB
vfs_fruit.c 164KB
client.c 159KB
clifile.c 149KB
open.c 147KB
lanman.c 141KB
posix_acls.c 139KB
loadparm.c 125KB
srv_lsa_nt.c 123KB
cli_winreg_spoolss.c 121KB
ldb_mod_op_test.c 117KB
winbindd_cache.c 114KB
pyldb.c 111KB
cli_smb2_fnum.c 109KB
process.c 106KB
pdb_samba_dsdb.c 104KB
cmd_spoolss.c 103KB
smb2_server.c 102KB
py_passdb.c 102KB
ldap.c 101KB
cliconnect.c 99KB
user.c 96KB
loadparm.c 95KB
winbindd_cm.c 92KB
krb5_samba.c 91KB
printing.c 90KB
cli_pipe.c 88KB
net_ads.c 87KB
convert_string.c 87KB
libsmb_xattr.c 85KB
cmd_samr.c 85KB
denytest.c 84KB
namequery.c 83KB
nttrans.c 82KB
winbindd_pam.c 82KB
nmbd_winsserver.c 81KB
getdate.c 80KB
srv_srvsvc_nt.c 79KB
ldb_index.c 76KB
vfs_shadow_copy2.c 76KB
vfs_default.c 75KB
passdb.c 73KB
libnet_join.c 73KB
srv_netlog_nt.c 72KB
vfs_snapper.c 72KB
talloc.c 70KB
test_smb2.c 69KB
net_rpc_printer.c 69KB
clirap2.c 69KB
ntlm_auth.c 69KB
vfs.c 69KB
vfs_full_audit.c 68KB
pdb_interface.c 67KB
nmbd_packets.c 67KB
vfs_time_audit.c 66KB
vfs_gpfs.c 65KB
libnetapi.c 63KB
nt_printing.c 62KB
libsmb_dir.c 62KB
auth_util.c 62KB
tldap.c 61KB
brlock.c 60KB
ldb_tdb.c 58KB
rijndael-alg-fst.c 58KB
cmd_lsarpc.c 57KB
vfs_catia.c 56KB
net_sam.c 56KB
dir.c 55KB
net_rpc_conf.c 55KB
regedit_dialog.c 55KB
netdomjoin-gui.c 54KB
machine_account_secrets.c 54KB
server.c 53KB
util.c 53KB
winbindd_util.c 53KB
regfio.c 53KB
net_rpc_registry.c 53KB
ldb.c 52KB
tsocket_bsd.c 52KB
reg_backend_db.c 52KB
ldb_sqlite3.c 52KB
vfs_media_harmony.c 52KB
testsuite.c 52KB
cmd_vfs.c 52KB
smbldap.c 51KB
srv_pipe.c 50KB
winbindd_dual_srv.c 50KB
smb2_create.c 50KB
ldif_handlers.c 50KB
smbXsrv_session.c 49KB
dbwrap_ctdb.c 49KB
mdssvc.c 49KB
winbindd.c 48KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
Cool2Feel
- 粉丝: 193
- 资源: 186
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功