[asterisk-dev] Updating call limits
Kaloyan Kovachev
kkovachev at varna.net
Fri Jun 16 09:29:55 CDT 2017
Thank You for the answer!
The caller's channel is enough for me, so it
Just one more question when i walk trough the heap should i remove and
re-add the ast_bridge_hook_timer(s) or it is enough to update their
values in place:
ast_heap_wrlock(features->interval_hooks);
for (idx = ast_heap_size(features->interval_hooks); idx; --idx) {
struct ast_bridge_hook hook;
hook = ast_heap_peek(hooks, idx);
if ( hook->type == AST_BRIDGE_HOOK_TYPE_TIMER ) {
// bridge_features_limits_copy -> remove -> modify -> re-add
// or update in place ?
}
}
ast_heap_unlock(features->interval_hooks);
На 2017-06-14 01:01, Richard Mudgett написа:
> On Mon, Jun 12, 2017 at 8:10 AM, Kaloyan Kovachev <kkovachev at varna.net>
> wrote:
>
>> Hi,
>> I need to update the call limit of an active call, but the old method
>> of updating "struct ast_bridge_config" is not working anymore.
>> The fields 'timelimit', 'play_warning' and 'warning_freq' are used
>> just to populate the new interval hook and 'nexteventts' is completely
>> unused (and probably should be removed in trunk).
>>
>> What is the right way to update the call limit (and related warning
>> time) - modify duration and warning inside ast_bridge_features_limits?
>> And the second question is how to get access to the relevant
>> structures/data are there any builtin functions to access them?
>
> The new method wasn't designed for dynamic changes to the limit times.
> Since
> there was no way for a user to dynamically change them before, it was
> not a
> requirement that the new method be able to do so either. The old way
> simply
> checked each limit timer for every frame that passed through a straight
> forward
> two party bridge loop. The new way is more complicated because of the
> new
> bridging architecture. The new bridging architecture does not allow
> direct
> access to other channels in the bridge. A bridge can change from a
> simple two
> party bridge to a multi-party bridge at any time because each channel
> has its
> own caretaker thread and can be moved easily from bridge to bridge.
>
> You cannot simply modify the duration, warning, and frequency values in
> the
> ast_bridge_features_limits structure dynamically as you mention either.
> Those
> values are only used to construct up to three interval hooks by
> bridge_builtin_interval_features.c:bridge_builtin_set_limits(). It is
> those interval
> hooks that actually control the timing. The interval hooks are put
> into a priority
> heap where the next to expire hook timer is at the top of the heap.
> The bridge
> channel thread then waits for either the next interval hook timer to
> expire or a
> frame to arrive. The other change with the new way is that each
> channel gets
> its own interval timers with limits set depending upon if it is the
> chan or peer
> channel in the initial two party bridge. Each channel then acts
> independently
> on its own interval timers. There is currently no API call to allow
> access-to or changing-of the interval hook
> timers once they are set. It won't be easy to gain access to the
> necessary
> interval hook structures on both channels either. You can get close to
> locating
> the needed interval hooks by following this chain: with an ast_channel
> pointer use
> ast_channel_internal_bridge_channel() to get the associated
> ast_bridge_channel
> pointer. With the ast_bridge_channel pointer dereference the features
> member
> which you then have access to the interval_hooks member. The
> interval_hooks
> heap is a heap of struct ast_bridge_hook_timer pointers. However, the
> interval_hooks heap is not searchable for specific hooks and following
> the chain
> may be hazardous because of all the links that need to be followed.
> You will
> definitely need to hold the channel lock to get the ast_bridge_channel
> pointer.
> Also the locking order to keep in mind is: ast_bridge locks
> ast_bridge_channel
> locks ast_channel. Locking against this order requires deadlock
> avoidance.
>
> Richard
More information about the asterisk-dev
mailing list