<br><br><div class="gmail_quote">2012/7/2 Sebastian Huber <span dir="ltr"><<a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-brains.de</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 07/02/2012 12:50 PM, Ashi wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I'm thinking about how to deal with critical region in my POSIX key project. My<br>
current approach is the one-rbtree approach, that is the critical region are<br>
one global rbtree which contains all the keys' data value and the chain-list in<br>
each thread's TCB. I'm confused with _Thread_Disable_dispatch() and<br>
_ISR_Disable(_level). What's the difference between them? Does _ISR_Disable()<br>
disable thread dispatch?<br>
</blockquote>
<br></div>
Single processor RTEMS systems require one hardware mechanism to ensure protection of critical sections against concurrent access.  Concurrent access in a single processor system can only occur due to interrupts.  Thus the protection mechanism is disabling and enabling of interrupts.  The high level<br>

synchronization primitives like events, semaphores, mutexes, barriers, message queues, etc. are based on such critical sections.<br>
<br>
The _ISR_Disable/Enable/Flash is something like a big kernel lock.<br>
<br>
In order to avoid some large critical sections the thread dispatch disable level was introduced.  It protects code sections from interruptions due to thread dispatching.  Sections protected by _Thread_Disable_dispatch() are not automatically protected from interruption by an interrupt service.  The _Thread_Disable_dispatch() is also a non-blocking operation.<div class="im">
<br></div></blockquote><div>Sebastian, thanks for your clear explanation.<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="im">
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I also find some operations like _RBTree_Find(),<br>
_Chain_Insert() in the RBTree API and Chain API call _ISR_Disable(), and some<br>
operation like _Objects_Get() which is called by _POSIX_Keys_Get() calls<br>
_Thread_Diable_dispath().<br>
BTW, I also checked the IRC meeting log, and find Joel has said "allocating<br>
memory from the workspace is a different lock than thread disable dispatch".<br>
Joel, what are the details of the different lock?<br></blockquote></div></blockquote><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="im">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
</blockquote>
The memory allocation uses the _RTEMS_Lock_allocator() lock.  This is a potentially blocking operation.<br></div></blockquote><div><br></div><div> </div><div>>POSIX has no requirements that the pthread key operations be safe to call from an ISR so you are primarily concerned about<br>


>+ memory allocation protection, if there is any<br><br>Joel, does it mean use _RTEMS_Lock_allocator()  before allocating anything from workspace? If so, why is there no _RTEMS_Lock_allocator() in current keycreate.c(there is _workspace_allocate() at line 80 in keycreate.c)?<br>
<br>
>+ dispatch disable, preventing other threads from running<br><br>
>The methods which use _XXX_Get to turn an id into a pointer implicitly disable dispatching. So this part should be ok </div></div><br><br clear="all"><br>-- <br>Best wishes!<br>Zhongwei Yao<br><br>