[prev in list] [next in list] [prev in thread] [next in thread]
List: asterisk-dev
Subject: Re: [asterisk-dev] [Code Review] Add common implementation for a
From: "Russell Bryant" <russell () digium ! com>
Date: 2009-01-26 22:40:26
Message-ID: 20090126224026.23034.6485 () hotblack ! digium ! internal
[Download RAW message or body]
> On 2009-01-26 10:51:47, Mark Michelson wrote:
> > /trunk/channels/chan_iax2.c, lines 1263-1268
> > <http://reviewboard.digium.com/r/129/diff/1/?file=2315#file2315line1263>
> >
> > Why is it that scheduler entry replacement is not an atomic operation? At the \
> > least, I would expect a lock to be held around the calls to ast_sched_thread_del \
> > and ast_sched_thread_add so that nothing could happen between the deletion and \
> > addition. I ask also because the pre-existing AST_SCHED_REPLACE macro does not \
> > hold a lock around the removal and re-addition of scheduler entries.
> > Even though replacement can be accomplished as you have done here with separate \
> > calls to delete and add a scheduler entry, why not add a simple public API \
> > function for replacing scheduler entries (e.g. ast_sched_thread_replace)?
>
> wrote:
> Yeah, I think sched_thread_replace() is a good idea. I'll add it.
>
> wrote:
> After looking at this a bit closer, I'm having trouble coming up with a reason that \
> this operation needs to be atomic. Do you have a case where it not being atomic \
> could be problematic? The issues I thought of and have been addressing have to do \
> with synchronization between the scheduler thread and the add operations. The \
> deletes really aren't that big of a deal.
> wrote:
> No, I don't know of any specific situations where this needs to be atomic. That's \
> partially why I asked the question in the first place. I noticed the operation was \
> not atomic, and I was curious as to why. It may be that it is not atomic simply for \
> the reason that it doesn't actually hurt anything to not operate atomically.
> The question about the atomicity of the replacement operation was more to indulge \
> my curiosity than to state how I think it should be. My thought process was that a \
> replacement operation would be atomic, so I asked about it.
> wrote:
> Thanks for the feedback. I just wanted to clarify. I have thought about and I \
> think for replace, there is just no need for it to be atomic.
> wrote:
> There is actually good reason for it to be atomic. Consider the possible collision \
> of 2 threads:
> A: delete job, set id to -1
> B: Check id, see that it is -1 (nothing to cancel).
> B: Add job, set id.
> A: Add job, set id (B's id is lost and isn't cancellable).
>
> Furthermore:
>
> C: delete job, set id to -1.
> C: deallocate memory
> SCHED: job runs from what B scheduled, referencing free'd memory.
Thanks for the feedback, Tilghman. However, I do not think that either of those \
cases are related to synchronization requirements that should be enforced by this \
API.
The first case should be handled by proper external locking of the data structure \
holding the scheduler ID. Having two threads both operate on the same data like that \
is broken from a higher level.
In the second case, this would not be possible if proper reference counting is being \
done for the object with respect to scheduler entries.
- Russell
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://reviewboard.digium.com/r/129/#review321
-----------------------------------------------------------
On 2009-01-26 15:21:38, Russell Bryant wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://reviewboard.digium.com/r/129/
> -----------------------------------------------------------
>
> (Updated 2009-01-26 15:21:38)
>
>
> Review request for Asterisk Developers.
>
>
> Summary
> -------
>
> There are a number of modules that create a scheduler context. Some use a \
> dedicated thread, while others process the scheduler context within the context of \
> a thread that handles other things as well. I have noticed a number of bugs in \
> both types of implementations related to race conditions between checking how much \
> time until the next scheduled entry and sleeping for an appropriate amount of time. \
> To address the problems found in the implementations that use a dedicated thread, \
> I have written this patch. This patch adds a common implementation of a scheduler \
> context that uses a dedicated thread for processing.
> chan_iax2 has been updated to use this new API for its dedicated scheduler thread \
> instead of the one that was written into chan_iax2 directly. The previous \
> implementation has some race conditions that can lead to the scheduler thread \
> sleeping longer than it is supposed to, leading to scheduled actions not running \
> when they are supposed to. Bugs caused by this type of thing are often very subtle \
> and difficult to track down.
>
> Diffs
> -----
>
> /trunk/channels/chan_iax2.c 171450
> /trunk/include/asterisk/sched.h 171450
> /trunk/main/sched.c 171450
>
> Diff: http://reviewboard.digium.com/r/129/diff
>
>
> Testing
> -------
>
> It compiles. Basic chan_iax2 usage appears unaffected.
>
>
> Thanks,
>
> Russell
>
>
_______________________________________________
--Bandwidth and Colocation Provided by http://www.api-digital.com--
asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
http://lists.digium.com/mailman/listinfo/asterisk-dev
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic