Wed Jan 8 2020 09:49:58

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 More...
 
void ast_autochan_new_channel (struct ast_channel *old_chan, struct ast_channel *new_chan)
 Switch what channel autochans point to. More...
 
struct ast_autochanast_autochan_setup (struct ast_channel *chan)
 set up a new ast_autochan structure More...
 

Detailed Description

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

Author
Mark Michelson mmich.nosp@m.elso.nosp@m.n@dig.nosp@m.ium..nosp@m.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
autochanThe autochan that you wish to destroy
Return values
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, ast_channel::autochans, ast_autochan::chan, and ast_autochan::list.

Referenced by channel_spy(), common_exec(), launch_monitor_thread(), and mixmonitor_thread().

64 {
65  struct ast_autochan *autochan_iter;
66 
67  ast_channel_lock(autochan->chan);
68  AST_LIST_TRAVERSE_SAFE_BEGIN(&autochan->chan->autochans, autochan_iter, list) {
69  if (autochan_iter == autochan) {
71  ast_debug(1, "Removed autochan %p from the list, about to free it\n", autochan);
72  break;
73  }
74  }
76  ast_channel_unlock(autochan->chan);
77 
78  autochan->chan = ast_channel_unref(autochan->chan);
79 
80  ast_free(autochan);
81 }
#define ast_channel_lock(chan)
Definition: channel.h:2466
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2502
struct ast_channel * chan
Definition: autochan.h:33
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:600
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:236
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:554
#define ast_channel_unlock(chan)
Definition: channel.h:2467
#define ast_free(a)
Definition: astmm.h:97
struct ast_channel::autochans autochans
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
struct ast_autochan::@144 list
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_chanThe channel that autochans may currently point to
new_chanThe channel that we want to point those autochans to now
Return values
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, ast_channel::autochans, ast_autochan::chan, ast_autochan::list, and ast_channel::name.

Referenced by ast_do_masquerade().

84 {
85  struct ast_autochan *autochan;
86 
87  AST_LIST_APPEND_LIST(&new_chan->autochans, &old_chan->autochans, list);
88 
89  AST_LIST_TRAVERSE(&new_chan->autochans, autochan, list) {
90  if (autochan->chan == old_chan) {
91  autochan->chan = ast_channel_unref(old_chan);
92  autochan->chan = ast_channel_ref(new_chan);
93 
94  ast_debug(1, "Autochan %p used to hold channel %s (%p) but now holds channel %s (%p)\n",
95  autochan, old_chan->name, old_chan, new_chan->name, new_chan);
96  }
97  }
98 }
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2502
struct ast_channel * chan
Definition: autochan.h:33
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:236
const ast_string_field name
Definition: channel.h:787
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2491
struct ast_channel::autochans autochans
#define AST_LIST_APPEND_LIST(head, list, field)
Appends a whole list to the tail of a list.
Definition: linkedlists.h:768
struct ast_autochan::@144 list
struct ast_autochan* ast_autochan_setup ( struct ast_channel chan)

set up a new ast_autochan structure

Just what the $!# is an autochan?

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.

Parameters
chanThe channel our new autochan will point to
Note
autochans must be freed using ast_autochan_destroy
Return values
NULLFailure
non-NULLsuccess

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, ast_channel::autochans, ast_autochan::chan, ast_autochan::list, and ast_channel::name.

Referenced by channel_spy(), common_exec(), launch_monitor_thread(), and next_channel().

41 {
42  struct ast_autochan *autochan;
43 
44  if (!chan) {
45  return NULL;
46  }
47 
48  if (!(autochan = ast_calloc(1, sizeof(*autochan)))) {
49  return NULL;
50  }
51 
52  autochan->chan = ast_channel_ref(chan);
53 
54  ast_channel_lock(autochan->chan);
55  AST_LIST_INSERT_TAIL(&autochan->chan->autochans, autochan, list);
56  ast_channel_unlock(autochan->chan);
57 
58  ast_debug(1, "Created autochan %p to hold channel %s (%p)\n", autochan, chan->name, chan);
59 
60  return autochan;
61 }
#define ast_channel_lock(chan)
Definition: channel.h:2466
struct ast_channel * chan
Definition: autochan.h:33
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:236
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:716
const ast_string_field name
Definition: channel.h:787
#define ast_channel_unlock(chan)
Definition: channel.h:2467
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2491
#define ast_calloc(a, b)
Definition: astmm.h:82
struct ast_channel::autochans autochans
struct ast_autochan::@144 list