[asterisk-commits] rizzo: branch rizzo/video_v2 r87723 - in /team/rizzo/video_v2: channels/ incl...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Oct 30 17:05:59 CDT 2007
Author: rizzo
Date: Tue Oct 30 17:05:59 2007
New Revision: 87723
URL: http://svn.digium.com/view/asterisk?view=rev&rev=87723
Log:
Implement part of the stringfield modifications suggested
on the -dev list, namely:
+ new api ast_string_field_free_memory replaces
the previous ast_string_field_free_all() and
ast_string_field_free_pools()
+ remove ast_string_field_free(), use ast_string_field_set()
with a NULL argument. Fix the function to handle a NULL;
+ leave ast_string_field_free_all() defined for the time being,
as there is one place (in chan_sip.c) where it is actually
used properly, to cleanup an ast_threadstorage object across calls.
This will need further work however, because a side effect of this
usage pattern is that it will effectively leak memory
Modified:
team/rizzo/video_v2/channels/chan_iax2.c
team/rizzo/video_v2/channels/chan_sip.c
team/rizzo/video_v2/include/asterisk/stringfields.h
team/rizzo/video_v2/main/channel.c
team/rizzo/video_v2/res/res_features.c
Modified: team/rizzo/video_v2/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/video_v2/channels/chan_iax2.c?view=diff&rev=87723&r1=87722&r2=87723
==============================================================================
--- team/rizzo/video_v2/channels/chan_iax2.c (original)
+++ team/rizzo/video_v2/channels/chan_iax2.c Tue Oct 30 17:05:59 2007
@@ -2155,7 +2155,7 @@
iax2_frame_free(frame.data);
jb_destroy(pvt->jb);
/* gotta free up the stringfields */
- ast_string_field_free_pools(pvt);
+ ast_string_field_free_memory(pvt);
ast_free(pvt);
}
}
@@ -9409,7 +9409,7 @@
if (peer->mwi_event_sub)
ast_event_unsubscribe(peer->mwi_event_sub);
- ast_string_field_free_pools(peer);
+ ast_string_field_free_memory(peer);
}
/*! \brief Create peer structure based on configuration */
@@ -9661,7 +9661,7 @@
ast_variables_destroy(user->vars);
user->vars = NULL;
}
- ast_string_field_free_pools(user);
+ ast_string_field_free_memory(user);
}
/*! \brief Create in-memory user structure from configuration */
@@ -9702,7 +9702,7 @@
if (user) {
if (firstpass) {
- ast_string_field_free_pools(user);
+ ast_string_field_free_memory(user);
memset(user, 0, sizeof(struct iax2_user));
if (ast_string_field_init(user, 32)) {
user = user_unref(user);
Modified: team/rizzo/video_v2/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/video_v2/channels/chan_sip.c?view=diff&rev=87723&r1=87722&r2=87723
==============================================================================
--- team/rizzo/video_v2/channels/chan_sip.c (original)
+++ team/rizzo/video_v2/channels/chan_sip.c Tue Oct 30 17:05:59 2007
@@ -3601,7 +3601,7 @@
ast_sched_del(sched, reg->expire);
if (reg->timeout > -1)
ast_sched_del(sched, reg->timeout);
- ast_string_field_free_pools(reg);
+ ast_string_field_free_memory(reg);
regobjs--;
ast_free(reg);
@@ -3708,7 +3708,7 @@
}
ast_mutex_destroy(&p->pvt_lock);
- ast_string_field_free_pools(p);
+ ast_string_field_free_memory(p);
ast_free(p);
}
@@ -6454,7 +6454,7 @@
if (!ast_strlen_zero(p->url)) {
add_header(resp, "Access-URL", p->url);
- ast_string_field_free(p, url);
+ ast_string_field_set(p, url, NULL);
}
return 0;
@@ -6564,7 +6564,7 @@
if (!ast_strlen_zero(p->url)) {
add_header(req, "Access-URL", p->url);
- ast_string_field_free(p, url);
+ ast_string_field_set(p, url, NULL);
}
return 0;
@@ -6606,7 +6606,7 @@
{
struct sip_pvt *p = data;
- ast_string_field_free_pools(p);
+ ast_string_field_free_memory(p);
ast_free(data);
}
@@ -6656,7 +6656,7 @@
__transmit_response(p, msg, req, XMIT_UNRELIABLE);
/* Free the string fields, but not the pool space */
- ast_string_field_free_all(p);
+ ast_string_field_free_strings(p);
return 0;
}
@@ -8175,7 +8175,7 @@
} else {
p = r->call;
make_our_tag(p->tag, sizeof(p->tag)); /* create a new local tag for every register attempt */
- ast_string_field_free(p, theirtag); /* forget their old tag, so we don't match tags when getting response */
+ ast_string_field_set(p, theirtag, NULL); /* forget their old tag, so we don't match tags when getting response */
}
} else {
/* Build callid for registration if we haven't registered before */
@@ -10219,8 +10219,8 @@
p->timer_t1 = peer->lastms;
if (ast_test_flag(&peer->flags[0], SIP_INSECURE_INVITE)) {
/* Pretend there is no required authentication */
- ast_string_field_free(p, peersecret);
- ast_string_field_free(p, peermd5secret);
+ ast_string_field_set(p, peersecret, NULL);
+ ast_string_field_set(p, peermd5secret, NULL);
}
if (!(res = check_auth(p, req, peer->name, p->peersecret, p->peermd5secret, sipmethod, uri2, reliable, req->ignore))) {
ast_copy_flags(&p->flags[0], &peer->flags[0], SIP_FLAGS_TO_COPY);
@@ -13157,7 +13157,7 @@
p->options->auth_type = resp;
/* Then we AUTH */
- ast_string_field_free(p, theirtag); /* forget their old tag, so we don't match tags when getting response */
+ ast_string_field_set(p, theirtag, NULL); /* forget their old tag, so we don't match tags when getting response */
if (!req->ignore) {
if (p->authtries < MAX_AUTHTRIES)
p->invitestate = INV_CALLING;
@@ -14715,7 +14715,7 @@
}
p->invitestate = INV_COMPLETED;
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
- ast_string_field_free(p, theirtag);
+ ast_string_field_set(p, theirtag, NULL);
return 0;
}
@@ -16831,7 +16831,7 @@
SIP/peername will still use the full contact */
if (ext) {
ast_string_field_set(p, username, ext);
- ast_string_field_free(p, fullcontact);
+ ast_string_field_set(p, fullcontact, NULL);
}
#if 0
printf("Setting up to call extension '%s' at '%s'\n", ext ? ext : "<none>", host);
Modified: team/rizzo/video_v2/include/asterisk/stringfields.h
URL: http://svn.digium.com/view/asterisk/team/rizzo/video_v2/include/asterisk/stringfields.h?view=diff&rev=87723&r1=87722&r2=87723
==============================================================================
--- team/rizzo/video_v2/include/asterisk/stringfields.h (original)
+++ team/rizzo/video_v2/include/asterisk/stringfields.h Tue Oct 30 17:05:59 2007
@@ -45,10 +45,10 @@
\code
struct sample_fields *sample;
- sample = calloc(1, sizeof(*sample));
+ sample = ast_calloc(1, sizeof(*sample));
if (sample) {
if (ast_string_field_init(sample, 256)) {
- free(sample);
+ ast_free(sample);
sample = NULL;
}
}
@@ -59,8 +59,8 @@
\endcode
Fields will default to pointing to an empty string, and will
- revert to that when ast_string_field_free() is called. This means
- that a string field will \b never contain NULL.
+ revert to that when ast_string_field_set() is called with a NULL
+ argument: a string field will \b never contain NULL.
Using the fields is much like using regular 'char *' fields
in the structure, except that writing into them must be done
@@ -74,8 +74,8 @@
and their storage pool must be freed:
\code
- ast_string_field_free_all(sample);
- free(sample);
+ ast_string_field_memory(sample);
+ ast_free(sample);
\endcode
*/
@@ -235,14 +235,15 @@
*/
#define ast_string_field_index_set(x, index, data) do { \
- size_t __dlen__ = strlen(data); \
+ const char *__d__ = (data); \
+ size_t __dlen__ = (__d__) ? strlen(__d__) : 0; \
const char **__p__ = (const char **)&((x)->__field_mgr_pool) + 1 + index; \
if (__dlen__ == 0) \
*__p__ = __ast_string_field_empty; \
else if (__dlen__ <= strlen(*__p__)) \
- strcpy((char *)*__p__, data); \
+ strcpy((char *)*__p__, __d__); \
else if ( (*__p__ = __ast_string_field_alloc_space(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__ + 1) ) ) \
- strcpy((char *)*__p__, data); \
+ strcpy((char *)*__p__, __d__); \
} while (0)
/*!
@@ -305,35 +306,6 @@
__ast_string_field_index_build_va(&(x)->__field_mgr, &(x)->__field_mgr_pool, ast_string_field_index(x, field), fmt, args1, args2)
/*!
- \brief Free a field's value.
- \param x Pointer to a structure containing fields
- \param index Index position of the field within the structure
- \return nothing
-
- \note Because of the storage pool used, the memory
- occupied by the field's value is \b not recovered; the field
- pointer is just changed to point to an empty string.
-*/
-#define ast_string_field_index_free(x, index) do { \
- const char **__p__ = (const char **)&(x)->__field_mgr_pool + 1 + index; \
- *__p__ = __ast_string_field_empty; \
- } while(0)
-
-/*!
- \brief Free a field's value.
- \param x Pointer to a structure containing fields
- \param field Name of the field to free
- \return nothing
-
- \note Because of the storage pool used, the memory
- occupied by the field's value is \b not recovered; the field
- pointer is just changed to point to an empty string.
-*/
-#define ast_string_field_free(x, field) do { \
- ast_string_field_index_free(x, ast_string_field_index(x, field)) ; \
- } while (0)
-
-/*!
\brief Free the stringfield storage pools attached to a structure
\param x Pointer to a structure containing fields
\return nothing.
@@ -342,14 +314,15 @@
structure; it should only be called immediately before freeing
the structure itself.
*/
-#define ast_string_field_free_pools(x) do { \
+#define ast_string_field_free_memory(x) do { \
struct ast_string_field_pool *this; \
while ( (this = (x)->__field_mgr_pool)) { \
(x)->__field_mgr_pool = this->prev; \
- free(this); \
+ ast_free(this); \
} \
} while(0)
+#if 1 /* deprecated but not deleted yet */
/*!
\brief Free the stringfields in a structure
\param x Pointer to a structure containing fields
@@ -359,12 +332,13 @@
attached to the structure will be available for use by
stringfields again.
*/
-#define ast_string_field_free_all(x) do { \
+#define ast_string_field_free_strings(x) do { \
const char **__p__ = (const char **)&(x)->__field_mgr_pool + 1; \
while ((struct ast_string_field_mgr *)__p__ != &(x)->__field_mgr) \
*__p__++ = __ast_string_field_empty; \
(x)->__field_mgr.used = 0; \
(x)->__field_mgr.space = (x)->__field_mgr.size; \
} while(0)
+#endif
#endif /* _ASTERISK_STRINGFIELDS_H */
Modified: team/rizzo/video_v2/main/channel.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/video_v2/main/channel.c?view=diff&rev=87723&r1=87722&r2=87723
==============================================================================
--- team/rizzo/video_v2/main/channel.c (original)
+++ team/rizzo/video_v2/main/channel.c Tue Oct 30 17:05:59 2007
@@ -667,7 +667,7 @@
if (needqueue) {
if (pipe(tmp->alertpipe)) {
ast_log(LOG_WARNING, "Channel allocation failed: Can't create alert pipe!\n");
- ast_string_field_free_pools(tmp);
+ ast_string_field_free_memory(tmp);
ast_free(tmp);
return NULL;
} else {
@@ -1160,7 +1160,7 @@
/* Destroy the jitterbuffer */
ast_jb_destroy(chan);
- ast_string_field_free_pools(chan);
+ ast_string_field_free_memory(chan);
ast_free(chan);
AST_RWLIST_UNLOCK(&channels);
Modified: team/rizzo/video_v2/res/res_features.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/video_v2/res/res_features.c?view=diff&rev=87723&r1=87722&r2=87723
==============================================================================
--- team/rizzo/video_v2/res/res_features.c (original)
+++ team/rizzo/video_v2/res/res_features.c Tue Oct 30 17:05:59 2007
@@ -1259,11 +1259,11 @@
AST_RWLIST_WRLOCK(&feature_groups);
while ((fg = AST_LIST_REMOVE_HEAD(&feature_groups, entry))) {
while ((fge = AST_LIST_REMOVE_HEAD(&fg->features, entry))) {
- ast_string_field_free_all(fge);
+ ast_string_field_free_memory(fge);
ast_free(fge);
}
- ast_string_field_free_all(fg);
+ ast_string_field_free_memory(fg);
ast_free(fg);
}
AST_RWLIST_UNLOCK(&feature_groups);
More information about the asterisk-commits
mailing list