> I think sched_lock() should be completely removed
> most case we can replace sched_lock() with enter_critical_section(),
> at the sametime we add sched_lock()'s ability to the enter_critical_section()
> we can replace sched_lock() with mutex ,sem or spinlock。
> directly removal

I would not remove sched_lock().  I think is it very important in a real time system.  Most RTOSs support something like this internally.

enter_critical_section() is not a replacement for sched_lock() because it disables interrupts and, hence, harms real time performance.  Interrupts must be disabled as little as possible because it destroys deterministic OS behavior.  sched_lock(), on the other hand, has little or now real time performance implications if used properly.

sched_lock() postpones a task from losing the CPU until sched_unlock() is called.  Misuses would include locking the scheduler for too long or, in the SMP case, misunderstanding the functionality of sched_lock() and assuming that it is always equivalent to a critical section.  Locking the scheduler for too long is probably not as damaging to performance has holding the critical section too long!

Both are very light weight in the single CPU modes.  But in SMP, enter_critical_section() is huge performance pig and should be avoided when at all possible.  sched_lock() is much more real time friendly in SMP.

Your primary complaint and the thing that no one argues with is that
nxsched "sched_lock() is very easy to misuse and difficult to understand."  However, that is not a sane justification to remove an important OS function.  You don't have a valid, technical justification for doing that.

However, we should address your concern (but NOT by removing sched_lock()).  How can be make sched_lock() more intuititive and less prone to miunderstanding by naive users?

I think that all we can do is change the naming or perhaps modify semantics.

First of all, sched_lock() is a non-standard, internal OS and should never be exposed to applications.  It is for the use by informed developers within the OS only.  The naive user should not even be aware that it exists.  So at a minimum, (1) it should be renamed nxsched_lock(), (2) the user syscall interface should be removed from syscall/ and include/sys, and (3) the prototype should be removed from include/sched.h and moved to include/nuttx/sched.h

The naming could be further improved.  The name nxsched_disable_preemption() and nxsched_enable_preemption(), while a bit long, do make the functionality of the internal interfaces much clearer and those are the names that I would recommend.



Reply via email to