From 696f9ed6770cec3d2a43317c3a0839f6854248a3 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Tue, 17 Oct 2006 22:24:45 +0000 Subject: Merged revisions 45408 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r45408 | kpfleming | 2006-10-17 17:24:10 -0500 (Tue, 17 Oct 2006) | 3 lines optimize the 'quick response' code a bit more... no more malloc() or memset() for each response expand stringfields API a bit to allow reusing the stringfield pool on a structure when needed, and remove some unnecessary code when the structure was being freed ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@45409 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 12 +++++----- channels/chan_sip.c | 52 ++++++++++++++++++++++------------------- include/asterisk/stringfields.h | 26 +++++++++++++++++---- main/ast_expr2.c | 2 +- main/channel.c | 4 ++-- 5 files changed, 58 insertions(+), 38 deletions(-) diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index f71a32af5..7abe62fdf 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -1751,7 +1751,7 @@ retry: iax2_frame_free(frame.data); jb_destroy(pvt->jb); /* gotta free up the stringfields */ - ast_string_field_free_all(pvt); + ast_string_field_free_pools(pvt); free(pvt); } } @@ -8309,7 +8309,7 @@ static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, st peer->expire = -1; ast_clear_flag(peer, IAX_DYNAMIC); if (ast_dnsmgr_lookup(v->value, &peer->addr.sin_addr, &peer->dnsmgr)) { - ast_string_field_free_all(peer); + ast_string_field_free_pools(peer); free(peer); return NULL; } @@ -8320,7 +8320,7 @@ static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, st inet_aton("255.255.255.255", &peer->mask); } else if (!strcasecmp(v->name, "defaultip")) { if (ast_get_ip(&peer->defaddr, v->value)) { - ast_string_field_free_all(peer); + ast_string_field_free_pools(peer); free(peer); return NULL; } @@ -8456,7 +8456,7 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, st if (user) { if (firstpass) { - ast_string_field_free_all(user); + ast_string_field_free_pools(user); memset(user, 0, sizeof(struct iax2_user)); if (ast_string_field_init(user, 32)) { free(user); @@ -8654,7 +8654,7 @@ static void destroy_user(struct iax2_user *user) ast_variables_destroy(user->vars); user->vars = NULL; } - ast_string_field_free_all(user); + ast_string_field_free_pools(user); free(user); } @@ -8695,7 +8695,7 @@ static void destroy_peer(struct iax2_peer *peer) register_peer_exten(peer, 0); if (peer->dnsmgr) ast_dnsmgr_release(peer->dnsmgr); - ast_string_field_free_all(peer); + ast_string_field_free_pools(peer); free(peer); } diff --git a/channels/chan_sip.c b/channels/chan_sip.c index b3cfa3840..bc2d1c291 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -716,7 +716,7 @@ struct sip_auth { #define SIP_PROG_INBAND_NEVER (0 << 25) #define SIP_PROG_INBAND_NO (1 << 25) #define SIP_PROG_INBAND_YES (2 << 25) -#define SIP_FREE_BIT (1 << 27) /*!< Undefined bit - not in use */ +#define SIP_NO_HISTORY (1 << 27) /*!< Suppress recording request/response history */ #define SIP_CALL_LIMIT (1 << 28) /*!< Call limit enforced for this call */ #define SIP_SENDRPID (1 << 29) /*!< Remote Party-ID Support */ #define SIP_INC_COUNT (1 << 30) /*!< Did this connection increment the counter of in-use calls? */ @@ -1790,7 +1790,7 @@ static void append_history_full(struct sip_pvt *p, const char *fmt, ...) { va_list ap; - if (!recordhistory || !p) + if (!p) return; va_start(ap, fmt); append_history_va(p, fmt, ap); @@ -1977,7 +1977,7 @@ static void sip_scheddestroy(struct sip_pvt *p, int ms) } if (sip_debug_test_pvt(p)) ast_verbose("Scheduling destruction of SIP dialog '%s' in %d ms (Method: %s)\n", p->callid, ms, sip_methods[p->method].text); - if (recordhistory) + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) append_history(p, "SchedDestroy", "%d ms", ms); if (p->autokillid > -1) @@ -2111,7 +2111,7 @@ static int send_response(struct sip_pvt *p, struct sip_request *req, enum xmitty ast_inet_ntoa(dst->sin_addr), ntohs(dst->sin_port), req->data); } - if (recordhistory) { + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) { struct sip_request tmp; parse_copy(&tmp, req); append_history(p, reliable ? "TxRespRel" : "TxResp", "%s / %s - %s", tmp.data, get_header(&tmp, "CSeq"), @@ -2137,7 +2137,7 @@ static int send_request(struct sip_pvt *p, struct sip_request *req, enum xmittyp else ast_verbose("%sTransmitting (no NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(p->sa.sin_addr), ntohs(p->sa.sin_port), req->data); } - if (recordhistory) { + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) { struct sip_request tmp; parse_copy(&tmp, req); append_history(p, reliable ? "TxReqRel" : "TxReq", "%s / %s - %s", tmp.data, get_header(&tmp, "CSeq"), sip_methods[tmp.method].text); @@ -2805,7 +2805,7 @@ static void sip_registry_destroy(struct sip_registry *reg) ast_sched_del(sched, reg->expire); if (reg->timeout > -1) ast_sched_del(sched, reg->timeout); - ast_string_field_free_all(reg); + ast_string_field_free_pools(reg); regobjs--; free(reg); @@ -2898,7 +2898,7 @@ static void __sip_destroy(struct sip_pvt *p, int lockowner) } ast_mutex_destroy(&p->lock); - ast_string_field_free_all(p); + ast_string_field_free_pools(p); free(p); } @@ -3313,7 +3313,7 @@ static int sip_hangup(struct ast_channel *ast) transmit_request_with_auth(p, SIP_BYE, 0, XMIT_RELIABLE, 1); /* Get RTCP quality before end of call */ - if (recordhistory) { + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) { if (p->rtp) append_history(p, "RTCPaudio", "Quality:%s", audioqos); if (p->vrtp) @@ -3804,7 +3804,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit for (v = i->chanvars ; v ; v = v->next) pbx_builtin_setvar_helper(tmp,v->name,v->value); - if (recordhistory) + if (!ast_test_flag(&i->flags[0], SIP_NO_HISTORY)) append_history(i, "NewChan", "Channel %s - from %s", tmp->name, i->callid); return tmp; @@ -4112,6 +4112,8 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si ast_copy_flags(&p->flags[0], &global_flags[0], SIP_FLAGS_TO_COPY); ast_copy_flags(&p->flags[1], &global_flags[1], SIP_PAGE2_FLAGS_TO_COPY); + ast_set2_flag(&p->flags[0], !recordhistory, SIP_NO_HISTORY); + p->branch = ast_random(); make_our_tag(p->tag, sizeof(p->tag)); p->ocseq = INITIAL_CSEQ; @@ -5543,12 +5545,14 @@ static int transmit_response_using_temp(ast_string_field callid, struct sockaddr return -1; } - memset(p, 0, sizeof(*p)); + /* if the structure was just allocated, initialize it */ + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) { + ast_set_flag(&p->flags[0], SIP_NO_HISTORY); + if (ast_string_field_init(p, 512)) + return -1; + } /* Initialize the bare minimum */ - if (ast_string_field_init(p, 512)) - return -1; - p->method = intended_method; if (sin) { @@ -5575,7 +5579,7 @@ static int transmit_response_using_temp(ast_string_field callid, struct sockaddr /* Use this temporary pvt structure to send the message */ __transmit_response(p, msg, req, XMIT_UNRELIABLE); - /* Now do a simple destruction */ + /* Free the string fields, but not the pool space */ ast_string_field_free_all(p); return 0; @@ -6286,7 +6290,7 @@ static int transmit_reinvite_with_sdp(struct sip_pvt *p) add_header(&req, "Supported", SUPPORTED_EXTENSIONS); if (sipdebug) add_header(&req, "X-asterisk-Info", "SIP re-invite (External RTP bridge)"); - if (recordhistory) + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) append_history(p, "ReInv", "Re-invite sent"); add_sdp(&req, p); /* Use this as the basis */ @@ -6911,7 +6915,7 @@ static int sip_reregister(void *data) if (!r) return 0; - if (r->call && recordhistory) + if (r->call && !ast_test_flag(&r->call->flags[0], SIP_NO_HISTORY)) append_history(r->call, "RegistryRenew", "Account: %s@%s", r->username, r->hostname); /* Since registry's are only added/removed by the the monitor thread, this may be overkill to reference/dereference at all here */ @@ -7011,7 +7015,7 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char * ast_log(LOG_WARNING, "Unable to allocate registration transaction (memory or socket error)\n"); return 0; } - if (recordhistory) + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) append_history(p, "RegistryInit", "Account: %s@%s", r->username, r->hostname); /* Find address to hostname */ if (create_addr(p, r->hostname)) { @@ -10818,7 +10822,7 @@ static int do_register_auth(struct sip_pvt *p, struct sip_request *req, enum sip /* No old challenge */ return -1; } - if (recordhistory) + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) append_history(p, "RegistryAuth", "Try: %d", p->authtries); if (sip_debug_test_pvt(p) && p->registry) ast_verbose("Responding to challenge, registration to domain/host name %s\n", p->registry->hostname); @@ -13037,7 +13041,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int if (option_debug) ast_log(LOG_DEBUG, "Hm.... No sdp for the moment\n"); } - if (recordhistory) /* This is a response, note what it was for */ + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) /* This is a response, note what it was for */ append_history(p, "ReInv", "Re-invite received"); } } else if (debug) @@ -13836,18 +13840,18 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req) ast_set_flag(&p->flags[0], SIP_ALREADYGONE); /* Get RTCP quality before end of call */ - if (recordhistory || p->owner) { + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY) || p->owner) { char *audioqos, *videoqos; if (p->rtp) { audioqos = ast_rtp_get_quality(p->rtp); - if (recordhistory) + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) append_history(p, "RTCPaudio", "Quality:%s", audioqos); if (p->owner) pbx_builtin_setvar_helper(p->owner, "RTPAUDIOQOS", audioqos); } if (p->vrtp) { videoqos = ast_rtp_get_quality(p->vrtp); - if (recordhistory) + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) append_history(p, "RTCPvideo", "Quality:%s", videoqos); if (p->owner) pbx_builtin_setvar_helper(p->owner, "RTPVIDEOQOS", videoqos); @@ -14469,7 +14473,7 @@ static int sipsock_read(int *id, int fd, short events, void *ignore) } p->recv = sin; - if (recordhistory) /* This is a request or response, note what it was for */ + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) /* This is a request or response, note what it was for */ append_history(p, "Rx", "%s / %s / %s", req.data, get_header(&req, "CSeq"), req.rlPart2); if (!lockretry) { @@ -16465,7 +16469,7 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struc } if (changed && !ast_test_flag(&p->flags[0], SIP_GOTREFER)) { if (chan->_state != AST_STATE_UP) { /* We are in early state */ - if (recordhistory) + if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) append_history(p, "ExtInv", "Initial invite sent with remote bridge proposal."); if (option_debug) ast_log(LOG_DEBUG, "Early remote bridge setting SIP '%s' - Sending media to %s\n", p->callid, ast_inet_ntoa(rtp ? p->redirip.sin_addr : p->ourip)); diff --git a/include/asterisk/stringfields.h b/include/asterisk/stringfields.h index 9b5fbc6df..bf4c0a055 100644 --- a/include/asterisk/stringfields.h +++ b/include/asterisk/stringfields.h @@ -248,6 +248,7 @@ void __ast_string_field_index_build(struct ast_string_field_mgr *mgr, } \ } while (0) #endif + /*! \brief Set a field to a simple string value \param x Pointer to a structure containing fields @@ -262,6 +263,7 @@ void __ast_string_field_index_build(struct ast_string_field_mgr *mgr, #define ast_string_field_logset(x, field, data, logstr) \ ast_string_field_index_logset(x, ast_string_field_index(x, field), data, logstr) #endif + /*! \brief Set a field to a complex (built) value \param x Pointer to a structure containing fields @@ -312,7 +314,7 @@ void __ast_string_field_index_build(struct ast_string_field_mgr *mgr, ast_string_field_index_free(x, ast_string_field_index(x, field)) /*! - \brief Free all fields (and the storage pool) in a structure + \brief Free the stringfield storage pools attached to a structure \param x Pointer to a structure containing fields \return nothing @@ -320,15 +322,29 @@ void __ast_string_field_index_build(struct ast_string_field_mgr *mgr, structure; it should only be called immediately before freeing the structure itself. */ -#define ast_string_field_free_all(x) do { \ - int index; \ +#define ast_string_field_free_pools(x) do { \ struct ast_string_field_pool *this, *prev; \ - for (index = 0; index < ast_string_field_count(x); index ++) \ - ast_string_field_index_free(x, index); \ for (this = (x)->__field_mgr.pool; this; this = prev) { \ prev = this->prev; \ free(this); \ } \ } while(0) +/*! + \brief Free the stringfields in a structure + \param x Pointer to a structure containing fields + \return nothing + + After calling this macro, the most recently allocated pool + attached to the structure will be available for use by + stringfields again. +*/ +#define ast_string_field_free_all(x) do { \ + int index; \ + for (index = 0; index < ast_string_field_count(x); index++) \ + ast_string_field_index_free(x, index); \ + (x)->__field_mgr.used = 0; \ + (x)->__field_mgr.space = (x)->__field_mgr.size; \ + } while(0) + #endif /* _ASTERISK_STRINGFIELDS_H */ diff --git a/main/ast_expr2.c b/main/ast_expr2.c index 6532093c5..bd152549b 100644 --- a/main/ast_expr2.c +++ b/main/ast_expr2.c @@ -142,7 +142,7 @@ #include "asterisk.h" #ifndef STANDALONE -ASTERISK_FILE_VERSION(__FILE__, "$Revision: 40546 $") +ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #endif #include diff --git a/main/channel.c b/main/channel.c index 605bb5b7e..9a1b6dfca 100644 --- a/main/channel.c +++ b/main/channel.c @@ -654,7 +654,7 @@ struct ast_channel *ast_channel_alloc(int needqueue) if (needqueue) { if (pipe(tmp->alertpipe)) { ast_log(LOG_WARNING, "Channel allocation failed: Can't create alert pipe!\n"); - ast_string_field_free_all(tmp); + ast_string_field_free_pools(tmp); free(tmp); return NULL; } else { @@ -1055,7 +1055,7 @@ void ast_channel_free(struct ast_channel *chan) /* Destroy the jitterbuffer */ ast_jb_destroy(chan); - ast_string_field_free_all(chan); + ast_string_field_free_pools(chan); free(chan); AST_LIST_UNLOCK(&channels); -- cgit v1.2.3