> 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.