From d35ca599593ea76d19536477a4a3c6a3bb493e55 Mon Sep 17 00:00:00 2001 From: Brian West Date: Thu, 26 Feb 2009 18:24:05 +0000 Subject: [PATCH] Tue Feb 3 10:31:33 CST 2009 Pekka Pessi * su_wait.h: added su_root_clone() git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@12299 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- libs/sofia-sip/.update | 2 +- .../libsofia-sip-ua/su/sofia-sip/su_wait.h | 3 ++ libs/sofia-sip/libsofia-sip-ua/su/su_root.c | 42 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 3bf2c4c1d0..46eeb2177e 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Thu Feb 26 12:22:23 CST 2009 +Thu Feb 26 12:23:25 CST 2009 diff --git a/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h b/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h index 8584ea3e62..ad67723bb4 100644 --- a/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h +++ b/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h @@ -487,6 +487,9 @@ SOFIAPUBFUN int su_root_has_thread(su_root_t *root); SOFIAPUBFUN int su_root_set_max_defer(su_root_t *, su_duration_t max_defer); SOFIAPUBFUN su_duration_t su_root_get_max_defer(su_root_t const *self); +SOFIAPUBFUN su_root_t *su_root_clone(su_root_t *root, su_root_magic_t *magic) + __attribute__((__malloc__)); + /* Timers */ SOFIAPUBFUN su_timer_t *su_timer_create(su_task_r const, su_duration_t msec) __attribute__((__malloc__)); diff --git a/libs/sofia-sip/libsofia-sip-ua/su/su_root.c b/libs/sofia-sip/libsofia-sip-ua/su/su_root.c index 128dd8be06..e2179714e0 100644 --- a/libs/sofia-sip/libsofia-sip-ua/su/su_root.c +++ b/libs/sofia-sip/libsofia-sip-ua/su/su_root.c @@ -409,6 +409,48 @@ su_root_t *su_root_create(su_root_magic_t *magic) return su_root_create_with_port(magic, su_port_create()); } +/* Initializer used by su_root_clone() */ +static int +su_root_clone_initializer(su_root_t *root, + su_root_magic_t *magic) +{ + *(su_root_t **)magic = root; + return 0; +} + +/** Create a a new root object sharing port/thread with existing one. + * + * Allocate and initialize the instance of su_root_t. + * + * @param magic pointer to user data + * + * @return A pointer to allocated su_root_t instance, NULL on error. + * + * @NEW_1_12_11 + */ +su_root_t * +su_root_clone(su_root_t *self, su_root_magic_t *magic) +{ + int threading = 0, error; + su_clone_r clone; + su_root_t *cloned = NULL; + + if (self == NULL) + return NULL; + + threading = self->sur_threading, self->sur_threading = 0; + error = su_clone_start(self, clone, + (void *)&cloned, su_root_clone_initializer, NULL); + self->sur_threading = threading; + + if (error) + return NULL; + + su_clone_forget(clone); /* destroyed with su_root_destroy() */ + su_root_set_magic(cloned, magic); + return cloned; +} + /**@internal * * Create a reactor object using given message port.