Index: b/include/asterisk/channel.h
===================================================================
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -4601,6 +4601,18 @@ int ast_channel_dialed_causes_add(const
  */
 void ast_channel_dialed_causes_clear(const struct ast_channel *chan);
 
+/*
+ * \brief Return the mutex associated to the global channels container.
+ *
+ * \details
+ * Note that the mutex is destroyed when the channels container is destroyed
+ * (during asterisk shutdown), but we have no way to safely get a reference to the
+ * channels container to make sure it isn't destroyed while we still have a reference
+ * on its mutex, so we ignore this whole situation completely and suppose the returned
+ * pointer is always valid.
+ */
+ast_mutex_t *ast_channels_get_mutex(void);
+
 struct ast_flags *ast_channel_flags(struct ast_channel *chan);
 
 /*!
Index: b/main/channel.c
===================================================================
--- a/main/channel.c
+++ b/main/channel.c
@@ -11313,3 +11313,36 @@ void ast_channel_clear_flag(struct ast_c
 	ast_channel_unlock(chan);
 }
 
+// Credits to bloom1 and fblackburn
+// https://github.com/wazo-platform/asterisk/pull/171/commits/7ca688a05aaadfa429792f85184a34e2c0cb5980
+struct ast_channelstorage_driver_pvt {
+	struct ao2_container *handle;
+};
+
+ast_mutex_t *ast_channels_get_mutex(void)
+{
+	void *lock_addr = NULL;
+	if(!current_channel_storage_driver) {
+		return NULL;
+	}
+	if(!current_channel_storage_driver->driver_name) {
+		return NULL;
+	}
+	if(!current_channel_storage_instance) {
+		return NULL;
+	}
+	if(!current_channel_storage_instance->handle) {
+		return NULL;
+	}
+	if(!strcasecmp(current_channel_storage_driver->driver_name, "ao2_legacy")) {
+		lock_addr = ao2_object_get_lockaddr(current_channel_storage_instance->handle->handle);
+		ast_log(LOG_DEBUG, "ao2_legacy: lockaddr handle is %p\n", lock_addr);
+		return lock_addr;
+	} else if (!strcasecmp(current_channel_storage_driver->driver_name, "cpp_map_name_id")) {
+		lock_addr = current_channel_storage_instance->lock_handle;
+		ast_log(LOG_DEBUG, "cpp_map_name_id: lock handle is %p\n", lock_addr);
+		return lock_addr;
+	}
+	ast_log(LOG_WARNING, "No driver name match: %s\n", current_channel_storage_driver->driver_name);
+	return NULL;
+}
