static struct chanspy_ds *chanspy_ds_free(struct chanspy_ds *chanspy_ds) { if (!chanspy_ds) return NULL; ast_mutex_lock(&chanspy_ds->lock); if (chanspy_ds->chan) { struct ast_datastore *datastore; struct ast_channel *chan; chan = chanspy_ds->chan; ast_channel_lock(chan); if ((datastore = ast_channel_datastore_find(chan, &chanspy_ds_info, chanspy_ds->unique_id))) { ast_channel_datastore_remove(chan, datastore); /* chanspy_ds->chan is NULL after this call */ chanspy_ds_destroy(datastore->data); datastore->data = NULL; ast_channel_datastore_free(datastore); } ast_channel_unlock(chan); } ast_mutex_unlock(&chanspy_ds->lock); return NULL; }
static struct chanspy_ds *chanspy_ds_free(struct chanspy_ds *chanspy_ds) { struct ast_channel *chan; if (!chanspy_ds) { return NULL; } ast_mutex_lock(&chanspy_ds->lock); while ((chan = chanspy_ds->chan)) { struct ast_datastore *datastore; if (ast_channel_trylock(chan)) { DEADLOCK_AVOIDANCE(&chanspy_ds->lock); continue; } if ((datastore = ast_channel_datastore_find(chan, &chanspy_ds_info, chanspy_ds->unique_id))) { ast_channel_datastore_remove(chan, datastore); /* chanspy_ds->chan is NULL after this call */ chanspy_ds_destroy(datastore->data); datastore->data = NULL; ast_channel_datastore_free(datastore); } ast_channel_unlock(chan); break; } ast_mutex_unlock(&chanspy_ds->lock); return NULL; }
static int volume_write(struct ast_channel *chan, const char *cmd, char *data, const char *value) { struct ast_datastore *datastore = NULL; struct volume_information *vi = NULL; int is_new = 0; if (!(datastore = ast_channel_datastore_find(chan, &volume_datastore, NULL))) { /* Allocate a new datastore to hold the reference to this volume and audiohook information */ if (!(datastore = ast_channel_datastore_alloc(&volume_datastore, NULL))) return 0; if (!(vi = ast_calloc(1, sizeof(*vi)))) { ast_channel_datastore_free(datastore); return 0; } ast_audiohook_init(&vi->audiohook, AST_AUDIOHOOK_TYPE_MANIPULATE, "Volume"); vi->audiohook.manipulate_callback = volume_callback; ast_set_flag(&vi->audiohook, AST_AUDIOHOOK_WANTS_DTMF); is_new = 1; } else { vi = datastore->data; } /* Adjust gain on volume information structure */ if (!strcasecmp(data, "tx")) vi->tx_gain = atoi(value); else if (!strcasecmp(data, "rx")) vi->rx_gain = atoi(value); if (is_new) { datastore->data = vi; ast_channel_datastore_add(chan, datastore); ast_audiohook_attach(chan, &vi->audiohook); } return 0; }