extern msg_mclass_t sip_mclass[];
static msg_mclass_t const *_default = sip_mclass;
+static msg_mclass_t *_default_parser_cloned = NULL;
/** Return a built-in SIP parser object. */
msg_mclass_t const *sip_default_mclass(void)
return _default;
}
+/** Release SIP parser object if it was cloned. */
+void sip_cloned_parser_destroy(void)
+{
+ if (_default_parser_cloned) {
+ free(_default_parser_cloned);
+ _default_parser_cloned = NULL;
+ }
+}
+
/** Update the default SIP parser.
*
* Use the extended SIP parser as default one.
{
msg_mclass_t *mclass;
- if (input == NULL || input == _default)
- mclass = msg_mclass_clone(_default, 0, 0);
- else
+ if (input == NULL || input == _default) {
+ _default_parser_cloned = msg_mclass_clone(_default, 0, 0);
+ mclass = _default_parser_cloned;
+ } else {
mclass = input;
+ }
if (mclass) {
extern msg_hclass_t * const sip_extensions[];
continue;
if (msg_mclass_insert_header(mclass, hclass, 0) < 0) {
- if (input != mclass)
+ if (input != mclass) {
free(mclass);
+ _default_parser_cloned = NULL;
+ }
return mclass = NULL;
}
}
/** Return a built-in SIP parser object. */
SOFIAPUBFUN msg_mclass_t const *sip_default_mclass(void);
+/** Release SIP parser object if it was cloned. */
+SOFIAPUBFUN void sip_cloned_parser_destroy(void);
+
SOFIAPUBFUN int sip_update_default_mclass(msg_mclass_t const *mclass);
SOFIAPUBFUN msg_mclass_t *sip_extend_mclass(msg_mclass_t *input);
Release the clone of the default SIP parser
created by `sip_update_default_mclass(sip_extend_mclass(NULL))` call with NULL argument
*/
- free(sip_default_mclass());
+ sip_cloned_parser_destroy();
switch_mutex_lock(mod_sofia_globals.hash_mutex);
switch_core_hash_destroy(&mod_sofia_globals.profile_hash);