[asterisk-dev] (mis)use of threadstorage.h ?
Luigi Rizzo
rizzo at icir.org
Sat Nov 25 08:18:10 MST 2006
could someone explain how the code in threadstorage.h is used
and what is it supposed to do ?
I am not sure i follow the code too well because it is hidden
behind several macros, nor i could find in the code any comment
on what this code is supposed to provide.
Browsing through the asterisk source code (details below), i see that
there are the following usages:
1. frame.c and iax2-parser.c, seems the only reasonable usage -
provide a per-thread freelist of frames. But then i wonder why
it is not used also in ast_frame_header_new(). (I am also unsure
why the code in frame.c is replicated in iax2-parser.c)
2. in some cases to make certain routines thread-safe
(but still not reentrant). As you can see below, in many of these
cases this is more expensive than it should be; and the fact
that the code is not reentrant is almost as dangerous as not
having it thread-safe:
utils.c
thread-safe version of ast_inet_ntoa.
chan_skinny.c::device2str_threadbuf
local buffer for device2str
but it would be cheaper to use an automatic buffer in
the caller (skinny_show_devices())
chan_skinny.c::control2str_threadbuf
local buffer for control2str
but it would be cheaper to use an automatic buffer in
the caller (skinny_indicate())
channel.c
buffer to make ast_state2str thread-safe (but not reentrant)
3. in the remaining cases, i think threadstorage is used in the wrong way,
as it just allocates a variable whose scope is limited to a single
function. Here, a plain automatic variable, or an alloca(), would
suffice, and would avoid the overhead of the ast_alloc()
(which has locking, and is used anyways for the first allocation
of these objects):
chan_sip.c::ts_temp_pvt
this can just be replaced by an alloca()
cli.c
just an alloca() here ? the scope is only local to the function
ast_cli
logger.c
verbose_buf, alloca() ?
log_buf, alloca() ?
Anything wrong in the above analysis ?
cheers
luigi
More information about the asterisk-dev
mailing list