Mon Mar 19 11:30:36 2012

Asterisk developer's documentation


autochan.h File Reference

"smart" channels that update automatically if a channel is masqueraded More...

#include "asterisk.h"
#include "asterisk/linkedlists.h"

Go to the source code of this file.

Data Structures

struct  ast_autochan

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_autochanast_autochan_setup (struct ast_channel *chan)
 set up a new ast_autochan structure


Detailed Description

"smart" channels that update automatically if a channel is masqueraded

Author:
Mark Michelson <mmichelson@digium.com>

Definition in file autochan.h.


Function Documentation

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

Parameters:
autochan The autochan that you wish to destroy
Return values:
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.

Precondition:
Both channels must be locked before calling this function.
Parameters:
old_chan The channel that autochans may currently point to
new_chan The channel that we want to point those autochans to now
Return values:
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.

Parameters:
chan The channel our new autochan will point to
Note:
autochans must be freed using ast_autochan_destroy
Return values:
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 }


Generated on Mon Mar 19 11:30:36 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7