📄 bbpc_mtx.c
字号:
<font color="#6920ac">/* completion message */</font> <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: Example: Completed ...\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>()); <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(1000)); <b>return</b>;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font><font color="blue">Error_Exc:</font> <b>return</b>;}<font color="#6920ac">/* The Producer thread */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="Producer">Producer</a></font></b>(<i>crtx_Void_t</i>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Uint32_t</i> Item; <i>crtx_Uint32_t</i> Napping;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <b>while</b>(1) { Item = <a href="rand.FIND-FUNC">rand</a>(); <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: produced item %ld\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Item); <a href="#Deposit">Deposit</a>(Item); Napping = <a href="rand.FIND-FUNC">rand</a>()%(1000*<a href="PNAP.FIND-DEF">PNAP</a>); <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: deposited item %ld and napping for %ld msecs\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Item, Napping); <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(Napping)); } <b>return</b>;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* The Consumer thread */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="Consumer">Consumer</a></font></b>(<i>crtx_Void_t</i>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Uint32_t</i> Item; <i>crtx_Uint32_t</i> Napping;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <b>while</b>(1) { <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: wants to consume ...\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>()); Item = <a href="#Fetch">Fetch</a>(); Napping = <a href="rand.FIND-FUNC">rand</a>()%(1000*<a href="CNAP.FIND-DEF">CNAP</a>); <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: fetched item %ld and napping for %ld msecs\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Item, Napping); <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(Napping)); } <b>return</b>;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* The bounded buffer deposit routine */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="Deposit">Deposit</a></font></b>(<i>crtx_Uint32_t</i> Item_a){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="mutx_Lock.FIND-FUNC">mutx_Lock</a>(pMutex); <font color="#6920ac">/* lock mutex */</font> <b>while</b> (Count == <a href="BOUNDED_BUFFER_SIZE.FIND-DEF">BOUNDED_BUFFER_SIZE</a>) { <a href="mutx_Wait.FIND-FUNC">mutx_Wait</a>(pNotFull, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>); } Buffer[PutIn] = Item_a; <font color="#6920ac">/* put item in buffer */</font> <font color="#6920ac">/* increment PutIn index */</font> PutIn = (PutIn + 1) % <a href="BOUNDED_BUFFER_SIZE.FIND-DEF">BOUNDED_BUFFER_SIZE</a>; Count++; <font color="#6920ac">/* increment items counter */</font> <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: Deposit: there are now %d item(s) in the buffer\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Count); <a href="mutx_Signal.FIND-FUNC">mutx_Signal</a>(pNotEmpty); <font color="#6920ac">/* signal that buffer is not empty */</font> <a href="mutx_Unlock.FIND-FUNC">mutx_Unlock</a>(pMutex); <font color="#6920ac">/* release mutex */</font> <b>return</b>;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* The bounded buffer fetch routine */</font><font size="+1"><i>crtx_Uint32_t</i> <b><font color="azure1"><a name="Fetch">Fetch</a></font></b>(<i>crtx_Void_t</i>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Uint32_t</i> Item;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="mutx_Lock.FIND-FUNC">mutx_Lock</a>(pMutex); <font color="#6920ac">/* lock mutex */</font> <b>while</b> (Count == 0) { <a href="mutx_Wait.FIND-FUNC">mutx_Wait</a>(pNotEmpty, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>); } Item = Buffer[TakeOut]; <font color="#6920ac">/* take item form the buffer */</font> <font color="#6920ac">/* increment TakeOut index */</font> TakeOut = (TakeOut + 1) % <a href="BOUNDED_BUFFER_SIZE.FIND-DEF">BOUNDED_BUFFER_SIZE</a>; Count--; <font color="#6920ac">/* decriment item counter */</font> <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: Fetch: there are now %d item(s) in the buffer\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Count); <a href="mutx_Signal.FIND-FUNC">mutx_Signal</a>(pNotFull); <font color="#6920ac">/* signal that buffer is not full */</font> <a href="mutx_Unlock.FIND-FUNC">mutx_Unlock</a>(pMutex); <font color="#6920ac">/* release mutex */</font> <b>return</b> Item;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}</pre></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -