"smart" channels More...
#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. | |
struct ast_autochan * | ast_autochan_setup (struct ast_channel *chan) |
set up a new ast_autochan structure |
"smart" channels
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 63 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, and ast_autochan::chan.
Referenced by channel_spy(), common_exec(), launch_monitor_thread(), and mixmonitor_thread().
00064 { 00065 struct ast_autochan *autochan_iter; 00066 00067 ast_channel_lock(autochan->chan); 00068 AST_LIST_TRAVERSE_SAFE_BEGIN(&autochan->chan->autochans, autochan_iter, list) { 00069 if (autochan_iter == autochan) { 00070 AST_LIST_REMOVE_CURRENT(list); 00071 ast_debug(1, "Removed autochan %p from the list, about to free it\n", autochan); 00072 break; 00073 } 00074 } 00075 AST_LIST_TRAVERSE_SAFE_END; 00076 ast_channel_unlock(autochan->chan); 00077 00078 autochan->chan = ast_channel_unref(autochan->chan); 00079 00080 ast_free(autochan); 00081 }
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 83 of file autochan.c.
References ast_channel_ref, ast_channel_unref, ast_debug, AST_LIST_APPEND_LIST, AST_LIST_TRAVERSE, and ast_autochan::chan.
Referenced by ast_do_masquerade().
00084 { 00085 struct ast_autochan *autochan; 00086 00087 AST_LIST_APPEND_LIST(&new_chan->autochans, &old_chan->autochans, list); 00088 00089 AST_LIST_TRAVERSE(&new_chan->autochans, autochan, list) { 00090 if (autochan->chan == old_chan) { 00091 autochan->chan = ast_channel_unref(old_chan); 00092 autochan->chan = ast_channel_ref(new_chan); 00093 00094 ast_debug(1, "Autochan %p used to hold channel %s (%p) but now holds channel %s (%p)\n", 00095 autochan, old_chan->name, old_chan, new_chan->name, new_chan); 00096 } 00097 } 00098 }
struct ast_autochan* ast_autochan_setup | ( | struct ast_channel * | chan | ) | [read] |
set up a new ast_autochan structure
An ast_autochan is a structure which contains an ast_channel. The pointer inside an autochan has the ability to update itself if the channel it points to is masqueraded into a different channel.
This has a great benefit for any application or service which creates a thread outside of the channel's main operating thread which keeps a pointer to said channel. when a masquerade occurs on the channel, the autochan's chan pointer will automatically update to point to the new channel.
Some rules for autochans
1. If you are going to use an autochan, then be sure to always refer to the channel using the chan pointer inside the autochan if possible, since this is the pointer that will be updated during a masquerade.
2. If you are going to save off a pointer to the autochan's chan, then be sure to save off the pointer using ast_channel_ref and to unref the channel when you are finished with the pointer. If you do not do this and a masquerade occurs on the channel, then it is possible that your saved pointer will become invalid.
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 40 of file autochan.c.
References ast_calloc, ast_channel_lock, ast_channel_ref, ast_channel_unlock, ast_debug, AST_LIST_INSERT_TAIL, and ast_autochan::chan.
Referenced by channel_spy(), common_exec(), launch_monitor_thread(), and next_channel().
00041 { 00042 struct ast_autochan *autochan; 00043 00044 if (!chan) { 00045 return NULL; 00046 } 00047 00048 if (!(autochan = ast_calloc(1, sizeof(*autochan)))) { 00049 return NULL; 00050 } 00051 00052 autochan->chan = ast_channel_ref(chan); 00053 00054 ast_channel_lock(autochan->chan); 00055 AST_LIST_INSERT_TAIL(&autochan->chan->autochans, autochan, list); 00056 ast_channel_unlock(autochan->chan); 00057 00058 ast_debug(1, "Created autochan %p to hold channel %s (%p)\n", autochan, chan->name, chan); 00059 00060 return autochan; 00061 }