#include "asterisk.h"
#include "asterisk/autochan.h"
#include "asterisk/utils.h"
#include "asterisk/linkedlists.h"
#include "asterisk/options.h"
#include "asterisk/channel.h"
Go to the source code of this file.
Functions | |
void | ast_autochan_destroy (struct ast_autochan *autochan) |
destroy an ast_autochan structure | |
void | ast_autochan_new_channel (struct ast_channel *old_chan, struct ast_channel *new_chan) |
Switch what channel autochans point to. | |
ast_autochan * | ast_autochan_setup (struct ast_channel *chan) |
set up a new ast_autochan structure |
Definition in file autochan.c.
void ast_autochan_destroy | ( | struct ast_autochan * | autochan | ) |
destroy an ast_autochan structure
Removes the passed-in autochan from the list of autochans and unrefs the channel that is pointed to. Also frees the autochan struct itself. This function will unref the channel reference which was made in ast_autochan_setup
autochan | The autochan that you wish to destroy |
void |
Definition at line 59 of file autochan.c.
References ast_channel_lock, ast_channel_unlock, ast_channel_unref, ast_debug, ast_free, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_channel::autochans, ast_autochan::chan, and ast_autochan::list.
Referenced by channel_spy(), common_exec(), launch_monitor_thread(), and mixmonitor_thread().
00060 { 00061 struct ast_autochan *autochan_iter; 00062 00063 ast_channel_lock(autochan->chan); 00064 AST_LIST_TRAVERSE_SAFE_BEGIN(&autochan->chan->autochans, autochan_iter, list) { 00065 if (autochan_iter == autochan) { 00066 AST_LIST_REMOVE_CURRENT(list); 00067 ast_debug(1, "Removed autochan %p from the list, about to free it\n", autochan); 00068 break; 00069 } 00070 } 00071 AST_LIST_TRAVERSE_SAFE_END; 00072 ast_channel_unlock(autochan->chan); 00073 00074 autochan->chan = ast_channel_unref(autochan->chan); 00075 00076 ast_free(autochan); 00077 }
void ast_autochan_new_channel | ( | struct ast_channel * | old_chan, | |
struct ast_channel * | new_chan | |||
) |
Switch what channel autochans point to.
Traverses the list of autochans. All autochans which point to old_chan will be updated to point to new_chan instead. Currently this is only called from ast_do_masquerade in channel.c.
old_chan | The channel that autochans may currently point to | |
new_chan | The channel that we want to point those autochans to now |
void |
Definition at line 79 of file autochan.c.
References ast_channel_ref, ast_channel_unref, ast_debug, AST_LIST_APPEND_LIST, AST_LIST_TRAVERSE, ast_channel::autochans, ast_autochan::chan, ast_autochan::list, and ast_channel::name.
Referenced by ast_do_masquerade().
00080 { 00081 struct ast_autochan *autochan; 00082 00083 AST_LIST_APPEND_LIST(&new_chan->autochans, &old_chan->autochans, list); 00084 00085 AST_LIST_TRAVERSE(&new_chan->autochans, autochan, list) { 00086 if (autochan->chan == old_chan) { 00087 autochan->chan = ast_channel_unref(old_chan); 00088 autochan->chan = ast_channel_ref(new_chan); 00089 00090 ast_debug(1, "Autochan %p used to hold channel %s (%p) but now holds channel %s (%p)\n", 00091 autochan, old_chan->name, old_chan, new_chan->name, new_chan); 00092 } 00093 } 00094 }
struct ast_autochan* ast_autochan_setup | ( | struct ast_channel * | chan | ) |
set up a new ast_autochan structure
Allocates and initializes an ast_autochan, sets the autochan's chan pointer to point to the chan parameter, and adds the autochan to the global list of autochans. The newly- created autochan is returned to the caller. This function will cause the refcount of chan to increase by 1.
chan | The channel our new autochan will point to |
NULL | Failure | |
non-NULL | success |
Definition at line 36 of file autochan.c.
References ast_calloc, ast_channel_lock, ast_channel_ref, ast_channel_unlock, ast_debug, AST_LIST_INSERT_TAIL, ast_autochan::chan, ast_autochan::list, and ast_channel::name.
Referenced by channel_spy(), common_exec(), launch_monitor_thread(), and next_channel().
00037 { 00038 struct ast_autochan *autochan; 00039 00040 if (!chan) { 00041 return NULL; 00042 } 00043 00044 if (!(autochan = ast_calloc(1, sizeof(*autochan)))) { 00045 return NULL; 00046 } 00047 00048 autochan->chan = ast_channel_ref(chan); 00049 00050 ast_channel_lock(autochan->chan); 00051 AST_LIST_INSERT_TAIL(&autochan->chan->autochans, autochan, list); 00052 ast_channel_unlock(autochan->chan); 00053 00054 ast_debug(1, "Created autochan %p to hold channel %s (%p)\n", autochan, chan->name, chan); 00055 00056 return autochan; 00057 }