Index: funcs/func_lock.c =================================================================== --- funcs/func_lock.c (revision 187107) +++ funcs/func_lock.c (working copy) @@ -87,11 +87,14 @@ AST_LIST_HEAD_STATIC(locklist, lock_frame); static void lock_free(void *data); +static void lock_fixup(void *data, struct ast_channel *original, struct ast_channel *clone); + static int unloading = 0; static struct ast_datastore_info lock_info = { .type = "MUTEX", .destroy = lock_free, + .chan_fixup = lock_fixup }; struct lock_frame { @@ -133,6 +136,27 @@ ast_free(oldlist); } +static void lock_fixup(void *data, struct ast_channel *original, struct ast_channel *clone) { + struct channel_lock_frame *clframe; + struct ast_channel *bridged; + struct ast_datastore *lock_store; + + bridged = ast_bridged_channel(original); + if (bridged) { + AST_LIST_HEAD(, channel_lock_frame) *oldlist = data; + AST_LIST_LOCK(oldlist); + AST_LIST_TRAVERSE(oldlist, clframe, list) { + clframe->channel = bridged; + clframe->lock_frame->channel = bridged; + } + AST_LIST_UNLOCK(oldlist); + if ((lock_store = ast_channel_datastore_find(clone, &lock_info, NULL))) { + ast_channel_datastore_remove(clone, lock_store); + ast_channel_datastore_add(bridged, lock_store); + } + } +} + static int get_lock(struct ast_channel *chan, char *lockname, int try) { struct ast_datastore *lock_store = ast_channel_datastore_find(chan, &lock_info, NULL);