Asterisk - The Open Source Telephony Project GIT-master-7e7a603
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)
 
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 1317 of file channel_internal_api.c.

1318{
1319 struct ast_channel *tmp;
1320
1321 tmp = __ao2_alloc(sizeof(*tmp), destructor,
1322 AO2_ALLOC_OPT_LOCK_MUTEX, "", file, line, function);
1323
1324 if (!tmp) {
1325 return NULL;
1326 }
1327
1328 if ((ast_string_field_init(tmp, 128))) {
1329 return ast_channel_unref(tmp);
1330 }
1331
1334 if (!tmp->dialed_causes) {
1335 return ast_channel_unref(tmp);
1336 }
1337
1338 /* set the creation time in the uniqueid */
1339 tmp->uniqueid.creation_time = time(NULL);
1340 tmp->uniqueid.creation_unique = ast_atomic_fetchadd_int(&uniqueint, 1);
1341
1342 /* use provided id or default to historical {system-}time.# format */
1343 if (assignedids && !ast_strlen_zero(assignedids->uniqueid)) {
1344 ast_copy_string(tmp->uniqueid.unique_id, assignedids->uniqueid, sizeof(tmp->uniqueid.unique_id));
1346 snprintf(tmp->uniqueid.unique_id, sizeof(tmp->uniqueid.unique_id), "%li.%d",
1347 (long)(tmp->uniqueid.creation_time),
1348 tmp->uniqueid.creation_unique);
1349 } else {
1350 snprintf(tmp->uniqueid.unique_id, sizeof(tmp->uniqueid.unique_id), "%s-%li.%d",
1352 (long)(tmp->uniqueid.creation_time),
1353 tmp->uniqueid.creation_unique);
1354 }
1355
1356 /* copy linked id from parent channel if known */
1357 if (requestor) {
1358 tmp->linkedid = requestor->linkedid;
1359 } else {
1360 tmp->linkedid = tmp->uniqueid;
1361 }
1362
1364
1365 /* Force all channel snapshot segments to be created on first use, so we don't have to check if
1366 * an old snapshot exists.
1367 */
1368 ast_set_flag(&tmp->snapshot_segment_flags, AST_FLAGS_ALL);
1369
1370 return tmp;
1371}
@ 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_MAX_FDS
Definition: channel.h:194
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2958
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.
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 NULL
Definition: resample.c:96
#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:605
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_unref, ast_config_AST_SYSTEM_NAME, ast_copy_string(), AST_FLAGS_ALL, 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, NULL, pvt_cause_cmp_fn(), pvt_cause_hash_fn(), tmp(), ast_assigned_ids::uniqueid, and uniqueint.

Referenced by __ast_channel_alloc_ap(), and __ast_dummy_channel_alloc().

◆ ast_channel_internal_cleanup()

void ast_channel_internal_cleanup ( struct ast_channel chan)

Definition at line 1457 of file channel_internal_api.c.

1458{
1459 if (chan->dialed_causes) {
1460 ao2_t_ref(chan->dialed_causes, -1,
1461 "done with dialed causes since the channel is going away");
1462 chan->dialed_causes = NULL;
1463 }
1464
1466
1469
1470 ao2_cleanup(chan->topic);
1471 chan->topic = NULL;
1472
1474
1475 AST_VECTOR_FREE(&chan->fds);
1476}
#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:1548
#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 1559 of file channel_internal_api.c.

1560{
1561 enum ast_channel_error *error_code = ast_threadstorage_get(&channel_errno, sizeof(*error_code));
1562 if (!error_code) {
1564 }
1565
1566 return *error_code;
1567}
ast_channel_error
Definition: channel.h:4793
@ AST_CHANNEL_ERROR_UNKNOWN
Definition: channel.h:4795
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 1549 of file channel_internal_api.c.

1550{
1551 enum ast_channel_error *error_code = ast_threadstorage_get(&channel_errno, sizeof(*error_code));
1552 if (!error_code) {
1553 return;
1554 }
1555
1556 *error_code = error;
1557}
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 1478 of file channel_internal_api.c.

1479{
1480 chan->finalized = 1;
1481}
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 1483 of file channel_internal_api.c.

1484{
1485 return chan->finalized;
1486}

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 643 of file channel_internal_api.c.

645{
647 chan->stream_topology = topology;
649}
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:743
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 1513 of file channel_internal_api.c.

1514{
1515 char *topic_name;
1516 int ret;
1517 ast_assert(chan->topic == NULL);
1518
1519 if (ast_strlen_zero(chan->uniqueid.unique_id)) {
1520 static int dummy_id;
1521 ret = ast_asprintf(&topic_name, "channel:dummy-%d", ast_atomic_fetchadd_int(&dummy_id, +1));
1522 } else {
1523 ret = ast_asprintf(&topic_name, "channel:%s", chan->uniqueid.unique_id);
1524 }
1525
1526 if (ret < 0) {
1527 return -1;
1528 }
1529
1530 chan->topic = stasis_topic_create(topic_name);
1531 ast_free(topic_name);
1532 if (!chan->topic) {
1533 return -1;
1534 }
1535
1538 if (!chan->channel_forward) {
1539 ao2_ref(chan->topic, -1);
1540 chan->topic = NULL;
1541 return -1;
1542 }
1543
1544 return 0;
1545}
#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:617
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:1578
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 1614 of file channel_internal_api.c.

1616{
1617 struct ast_stream_topology *tmp_topology;
1618
1619 ast_assert(chan1 != NULL && chan2 != NULL);
1620
1621 tmp_topology = chan1->stream_topology;
1622 chan1->stream_topology = chan2->stream_topology;
1623 chan2->stream_topology = tmp_topology;
1624
1627}

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

Referenced by channel_do_masquerade().