Asterisk - The Open Source Telephony Project GIT-master-f36a736
Macros | Functions
channel_internal.h File Reference

Internal channel functions for channel.c to use. More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ast_channel_internal_alloc(destructor, assignedid, requestor)   __ast_channel_internal_alloc(destructor, assignedid, requestor, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 

Functions

struct ast_channel__ast_channel_internal_alloc (void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *file, int line, const char *function)
 
struct ast_channel__ast_channel_internal_alloc_with_initializers (void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const struct ast_channel_initializers *initializers, const char *file, int line, const char *function)
 
void ast_channel_internal_cleanup (struct ast_channel *chan)
 
enum ast_channel_error ast_channel_internal_errno (void)
 
void ast_channel_internal_errno_set (enum ast_channel_error error)
 
void ast_channel_internal_finalize (struct ast_channel *chan)
 
int ast_channel_internal_is_finalized (struct ast_channel *chan)
 
void ast_channel_internal_set_stream_topology (struct ast_channel *chan, struct ast_stream_topology *topology)
 
void ast_channel_internal_set_stream_topology_change_source (struct ast_channel *chan, void *change_source)
 
int ast_channel_internal_setup_topics (struct ast_channel *chan)
 
void ast_channel_internal_swap_stream_topology (struct ast_channel *chan1, struct ast_channel *chan2)
 

Detailed Description

Internal channel functions for channel.c to use.

Definition in file channel_internal.h.

Macro Definition Documentation

◆ ast_channel_internal_alloc

#define ast_channel_internal_alloc (   destructor,
  assignedid,
  requestor 
)    __ast_channel_internal_alloc(destructor, assignedid, requestor, __FILE__, __LINE__, __PRETTY_FUNCTION__)

Definition at line 24 of file channel_internal.h.

Function Documentation

◆ __ast_channel_internal_alloc()

struct ast_channel * __ast_channel_internal_alloc ( void(*)(void *obj)  destructor,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  file,
int  line,
const char *  function 
)

Definition at line 1410 of file channel_internal_api.c.

1412{
1413 return __ast_channel_internal_alloc_with_initializers(destructor, assignedids, requestor, NULL, file, line, function);
1414}
struct ast_channel * __ast_channel_internal_alloc_with_initializers(void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const struct ast_channel_initializers *initializers, const char *file, int line, const char *function)
#define NULL
Definition: resample.c:96

References __ast_channel_internal_alloc_with_initializers(), make_ari_stubs::file, and NULL.

Referenced by __ast_dummy_channel_alloc().

◆ __ast_channel_internal_alloc_with_initializers()

struct ast_channel * __ast_channel_internal_alloc_with_initializers ( void(*)(void *obj)  destructor,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const struct ast_channel_initializers initializers,
const char *  file,
int  line,
const char *  function 
)

Definition at line 1333 of file channel_internal_api.c.

1335{
1336 struct ast_channel *tmp;
1337
1338 tmp = __ao2_alloc(sizeof(*tmp), destructor,
1339 AO2_ALLOC_OPT_LOCK_MUTEX, "", file, line, function);
1340
1341 if (!tmp) {
1342 return NULL;
1343 }
1344
1345 if ((ast_string_field_init(tmp, 128))) {
1346 return ast_channel_unref(tmp);
1347 }
1348
1351 if (!tmp->dialed_causes) {
1352 return ast_channel_unref(tmp);
1353 }
1354
1355 /* Check initializers validity here for early abort. Unfortunately, we can't do much here because
1356 * tenant ID is part of linked ID, which would overwrite it further down. */
1357 if (initializers) {
1358 if (initializers->version == 0) {
1359 ast_log(LOG_ERROR, "Channel initializers must have a non-zero version.\n");
1360 return ast_channel_unref(tmp);
1361 } else if (initializers->version != AST_CHANNEL_INITIALIZERS_VERSION) {
1362 ast_log(LOG_ERROR, "ABI mismatch for ast_channel_initializers. "
1363 "Please ensure all modules were compiled for "
1364 "this version of Asterisk.\n");
1365 return ast_channel_unref(tmp);
1366 }
1367 }
1368
1369 /* set the creation time in the uniqueid */
1370 tmp->uniqueid.creation_time = time(NULL);
1371 tmp->uniqueid.creation_unique = ast_atomic_fetchadd_int(&uniqueint, 1);
1372
1373 /* use provided id or default to historical {system-}time.# format */
1374 if (assignedids && !ast_strlen_zero(assignedids->uniqueid)) {
1375 ast_copy_string(tmp->uniqueid.unique_id, assignedids->uniqueid, sizeof(tmp->uniqueid.unique_id));
1377 snprintf(tmp->uniqueid.unique_id, sizeof(tmp->uniqueid.unique_id), "%li.%d",
1378 (long)(tmp->uniqueid.creation_time),
1379 tmp->uniqueid.creation_unique);
1380 } else {
1381 snprintf(tmp->uniqueid.unique_id, sizeof(tmp->uniqueid.unique_id), "%s-%li.%d",
1383 (long)(tmp->uniqueid.creation_time),
1384 tmp->uniqueid.creation_unique);
1385 }
1386
1387 /* copy linked id from parent channel if known */
1388 if (requestor) {
1389 tmp->linkedid = requestor->linkedid;
1390 } else {
1391 tmp->linkedid = tmp->uniqueid;
1392 }
1393
1394 /* Things like tenant ID need to be set here, otherwise they would be overwritten by
1395 * things like inheriting linked ID above. */
1396 if (initializers) {
1397 ast_copy_string(tmp->linkedid.tenant_id, initializers->tenantid, sizeof(tmp->linkedid.tenant_id));
1398 }
1399
1401
1402 /* Force all channel snapshot segments to be created on first use, so we don't have to check if
1403 * an old snapshot exists.
1404 */
1405 ast_set_flag(&tmp->snapshot_segment_flags, AST_FLAGS_ALL);
1406
1407 return tmp;
1408}
#define ast_log
Definition: astobj2.c:42
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
void * __ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn, unsigned int options, const char *tag, const char *file, int line, const char *func) attribute_warn_unused_result
Definition: astobj2.c:768
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition: astobj2.h:1303
static int tmp()
Definition: bt_open.c:389
#define AST_CHANNEL_INITIALIZERS_VERSION
struct ABI version
Definition: channel.h:620
#define AST_MAX_FDS
Definition: channel.h:196
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:3004
static int uniqueint
The monotonically increasing integer counter for channel uniqueids.
static int pvt_cause_cmp_fn(void *obj, void *vstr, int flags)
Comparison function for pvt cause code frames.
#define DIALED_CAUSES_BUCKETS
static int pvt_cause_hash_fn(const void *vpc, const int flags)
Hash function for pvt cause code frames.
#define LOG_ERROR
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
Definition: lock.h:757
const char * ast_config_AST_SYSTEM_NAME
Definition: options.c:170
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
const char * uniqueid
Definition: channel.h:607
const char * tenantid
Definition: channel.h:626
uint32_t version
struct ABI version
Definition: channel.h:625
Main Channel structure associated with a channel.
struct ast_channel_id linkedid
#define ast_set_flag(p, flag)
Definition: utils.h:70
#define AST_FLAGS_ALL
Definition: utils.h:196
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition: vector.h:113

References __ao2_alloc(), AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ast_atomic_fetchadd_int(), AST_CHANNEL_INITIALIZERS_VERSION, ast_channel_unref, ast_config_AST_SYSTEM_NAME, ast_copy_string(), AST_FLAGS_ALL, ast_log, AST_MAX_FDS, ast_set_flag, ast_string_field_init, ast_strlen_zero(), AST_VECTOR_INIT, DIALED_CAUSES_BUCKETS, make_ari_stubs::file, ast_channel::linkedid, LOG_ERROR, NULL, pvt_cause_cmp_fn(), pvt_cause_hash_fn(), ast_channel_initializers::tenantid, tmp(), ast_assigned_ids::uniqueid, uniqueint, and ast_channel_initializers::version.

Referenced by __ast_channel_alloc_ap(), and __ast_channel_internal_alloc().

◆ ast_channel_internal_cleanup()

void ast_channel_internal_cleanup ( struct ast_channel chan)

Definition at line 1500 of file channel_internal_api.c.

1501{
1502 if (chan->dialed_causes) {
1503 ao2_t_ref(chan->dialed_causes, -1,
1504 "done with dialed causes since the channel is going away");
1505 chan->dialed_causes = NULL;
1506 }
1507
1509
1512
1513 ao2_cleanup(chan->topic);
1514 chan->topic = NULL;
1515
1517
1518 AST_VECTOR_FREE(&chan->fds);
1519}
#define ao2_t_ref(o, delta, tag)
Definition: astobj2.h:460
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
void ast_channel_internal_set_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
struct stasis_forward * stasis_forward_cancel(struct stasis_forward *forward)
Definition: stasis.c:1549
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374
struct stasis_topic * topic
struct ao2_container * dialed_causes
struct ast_channel::@331 fds
struct stasis_forward * endpoint_forward
struct stasis_forward * channel_forward
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition: vector.h:174

References ao2_cleanup, ao2_t_ref, ast_channel_internal_set_stream_topology(), ast_string_field_free_memory, AST_VECTOR_FREE, ast_channel::channel_forward, ast_channel::dialed_causes, ast_channel::endpoint_forward, ast_channel::fds, NULL, stasis_forward_cancel(), and ast_channel::topic.

Referenced by ast_channel_destructor(), and ast_dummy_channel_destructor().

◆ ast_channel_internal_errno()

enum ast_channel_error ast_channel_internal_errno ( void  )

Definition at line 1602 of file channel_internal_api.c.

1603{
1604 enum ast_channel_error *error_code = ast_threadstorage_get(&channel_errno, sizeof(*error_code));
1605 if (!error_code) {
1607 }
1608
1609 return *error_code;
1610}
ast_channel_error
Definition: channel.h:4841
@ AST_CHANNEL_ERROR_UNKNOWN
Definition: channel.h:4843
static struct ast_threadstorage channel_errno
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.

References AST_CHANNEL_ERROR_UNKNOWN, ast_threadstorage_get(), and channel_errno.

Referenced by ast_channel_errno().

◆ ast_channel_internal_errno_set()

void ast_channel_internal_errno_set ( enum ast_channel_error  error)

Definition at line 1592 of file channel_internal_api.c.

1593{
1594 enum ast_channel_error *error_code = ast_threadstorage_get(&channel_errno, sizeof(*error_code));
1595 if (!error_code) {
1596 return;
1597 }
1598
1599 *error_code = error;
1600}
int error(const char *format,...)
Definition: utils/frame.c:999

References ast_threadstorage_get(), channel_errno, and error().

Referenced by __ast_channel_alloc_ap().

◆ ast_channel_internal_finalize()

void ast_channel_internal_finalize ( struct ast_channel chan)

Definition at line 1521 of file channel_internal_api.c.

1522{
1523 chan->finalized = 1;
1524}
unsigned int finalized

References ast_channel::finalized.

Referenced by __ast_channel_alloc_ap().

◆ ast_channel_internal_is_finalized()

int ast_channel_internal_is_finalized ( struct ast_channel chan)

Definition at line 1526 of file channel_internal_api.c.

1527{
1528 return chan->finalized;
1529}

References ast_channel::finalized.

Referenced by ast_channel_destructor().

◆ ast_channel_internal_set_stream_topology()

void ast_channel_internal_set_stream_topology ( struct ast_channel chan,
struct ast_stream_topology topology 
)

Definition at line 659 of file channel_internal_api.c.

661{
663 chan->stream_topology = topology;
665}
static void channel_set_default_streams(struct ast_channel *chan)
void ast_stream_topology_free(struct ast_stream_topology *topology)
Unreference and destroy a stream topology.
Definition: stream.c:746
struct ast_stream_topology * stream_topology

References ast_stream_topology_free(), channel_set_default_streams(), and ast_channel::stream_topology.

Referenced by __ast_channel_alloc_ap(), ast_channel_internal_cleanup(), ast_channel_nativeformats_set(), and ast_channel_set_stream_topology().

◆ ast_channel_internal_set_stream_topology_change_source()

void ast_channel_internal_set_stream_topology_change_source ( struct ast_channel chan,
void *  change_source 
)

◆ ast_channel_internal_setup_topics()

int ast_channel_internal_setup_topics ( struct ast_channel chan)

Definition at line 1556 of file channel_internal_api.c.

1557{
1558 char *topic_name;
1559 int ret;
1560 ast_assert(chan->topic == NULL);
1561
1562 if (ast_strlen_zero(chan->uniqueid.unique_id)) {
1563 static int dummy_id;
1564 ret = ast_asprintf(&topic_name, "channel:dummy-%d", ast_atomic_fetchadd_int(&dummy_id, +1));
1565 } else {
1566 ret = ast_asprintf(&topic_name, "channel:%s", chan->uniqueid.unique_id);
1567 }
1568
1569 if (ret < 0) {
1570 return -1;
1571 }
1572
1573 chan->topic = stasis_topic_create(topic_name);
1574 ast_free(topic_name);
1575 if (!chan->topic) {
1576 return -1;
1577 }
1578
1581 if (!chan->channel_forward) {
1582 ao2_ref(chan->topic, -1);
1583 chan->topic = NULL;
1584 return -1;
1585 }
1586
1587 return 0;
1588}
#define ast_free(a)
Definition: astmm.h:180
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
struct stasis_topic * ast_channel_topic(struct ast_channel *chan)
A topic which publishes the events for a particular channel.
struct stasis_topic * ast_channel_topic_all(void)
A topic which publishes the events for all channels.
struct stasis_topic * stasis_topic_create(const char *name)
Create a new topic.
Definition: stasis.c:618
struct stasis_forward * stasis_forward_all(struct stasis_topic *from_topic, struct stasis_topic *to_topic)
Create a subscription which forwards all messages from one topic to another.
Definition: stasis.c:1579
char unique_id[AST_MAX_UNIQUEID]
struct ast_channel_id uniqueid
#define ast_assert(a)
Definition: utils.h:739

References ao2_ref, ast_asprintf, ast_assert, ast_atomic_fetchadd_int(), ast_channel_topic(), ast_channel_topic_all(), ast_free, ast_strlen_zero(), ast_channel::channel_forward, NULL, stasis_forward_all(), stasis_topic_create(), ast_channel::topic, ast_channel_id::unique_id, and ast_channel::uniqueid.

Referenced by __ast_channel_alloc_ap(), and __ast_dummy_channel_alloc().

◆ ast_channel_internal_swap_stream_topology()

void ast_channel_internal_swap_stream_topology ( struct ast_channel chan1,
struct ast_channel chan2 
)

Definition at line 1657 of file channel_internal_api.c.

1659{
1660 struct ast_stream_topology *tmp_topology;
1661
1662 ast_assert(chan1 != NULL && chan2 != NULL);
1663
1664 tmp_topology = chan1->stream_topology;
1665 chan1->stream_topology = chan2->stream_topology;
1666 chan2->stream_topology = tmp_topology;
1667
1670}

References ast_assert, channel_set_default_streams(), NULL, and ast_channel::stream_topology.

Referenced by channel_do_masquerade().