kb_machblue_core_semaphore.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:6k
源码类别:

DVD

开发平台:

C/C++

  1. //*****************************************************************************
  2. //File Name: kb_machblue_core_semaphore.c
  3. //
  4. //Description: semaphore function
  5. //
  6. // used by Machblue to access the platform's synchronization
  7. //
  8. //Author: steven
  9. //
  10. //Date:  2006.12.29
  11. //
  12. //Version:  v1.0
  13. //*****************************************************************************
  14. #include "semaphor.h"
  15. #include "mutex.h"
  16. #include "ostime.h"
  17. #include "machblue_defines.h"
  18. #include "machblue_customer.h"
  19. #include "machblue_porting_core.h"
  20. /**
  21.  * Creates a new semaphore.
  22.  * semaphore  < pointer to semaphore to create >
  23.  * initial_value  < initial number of resource >
  24.  
  25.  * @return MB_SUCCESS and updates "semaphore" or MB_FAILURE on failure.
  26.  */
  27. mb_error_t mb_semaphore_create(mb_semaphore_t *semaphore,unsigned int initial_value)
  28. {
  29. semaphore_t *pSem;
  30. pSem=semaphore_create_fifo_timeout(initial_value);
  31. if(pSem==NULL)
  32. {
  33. mb_printf("n[Machblue]:Semaphore create error.");
  34. return MB_FAILURE;
  35. }
  36. *semaphore=(mb_semaphore_t)pSem;
  37. return MB_SUCCESS;
  38. }
  39. /**
  40.  * Deletes a semaphore.
  41.  * semaphore  < semaphore to delete >
  42.  
  43.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  44.  */
  45. mb_error_t mb_semaphore_delete(mb_semaphore_t semaphore)
  46. {
  47. semaphore_t *pSem=(semaphore_t *)semaphore;
  48. if(pSem==NULL)
  49. {
  50. mb_printf("n[Machblue]:Semaphore delete NULL.");
  51. return MB_FAILURE;
  52. }
  53. semaphore_delete(pSem); 
  54. return MB_SUCCESS;
  55. }
  56. /**
  57.  * Signals a counting semaphore (V).
  58.  * semaphore   < counting semaphore to signal >
  59.  
  60.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  61.  */
  62. mb_error_t mb_semaphore_signal(mb_semaphore_t semaphore)
  63. {
  64. semaphore_t *pSem=(semaphore_t *)semaphore;
  65. if(pSem==NULL)
  66. {
  67. mb_printf("n[Machblue]:Semaphore signal NULL.");
  68. return MB_FAILURE;
  69. }
  70. semaphore_signal(pSem); 
  71. return MB_SUCCESS;
  72. }
  73. /**
  74.  * Waits on a counting semaphore (P).
  75.  * semaphore   < Semaphore to wait on >
  76.  
  77.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  78.  */
  79. mb_error_t mb_semaphore_wait(mb_semaphore_t semaphore)
  80. {
  81. int ret;
  82. semaphore_t *pSem=(semaphore_t *)semaphore;
  83. if(pSem==NULL)
  84. {
  85. mb_printf("n[Machblue]:Semaphore wait NULL.");
  86. return MB_FAILURE;
  87. }
  88. ret=semaphore_wait_timeout(pSem,(clock_t*)TIMEOUT_INFINITY);
  89. if(ret!=0)
  90. {
  91. mb_printf("n[Machblue]:Semaphore wait error[%d].",ret);
  92. return MB_FAILURE;
  93. }
  94. return MB_SUCCESS;
  95. }
  96. /**
  97.  * Tries to wait on a semaphore (non-blocking). Returns immediatly 
  98.  * (does not block) if the semaphore has a zero count otherwise atomically 
  99.  * decreases count (consumes the resource). 
  100.  * @return MB_SUCCESS on success, MB_BUSY if the semaphore count is zero
  101.  * or MB_FAILURE on failure.
  102.  */
  103. mb_error_t mb_semaphore_trywait(mb_semaphore_t semaphore)
  104. {
  105. int ret;
  106. semaphore_t *pSem=(semaphore_t *)semaphore;
  107. if(pSem==NULL)
  108. {
  109. mb_printf("n[Machblue]:Semaphore try wait NULL.");
  110. return MB_FAILURE;
  111. }
  112. ret=semaphore_wait_timeout(pSem,(clock_t*)TIMEOUT_IMMEDIATE );
  113. if(ret!=0)
  114. {
  115. return MB_BUSY;
  116. }
  117. return MB_SUCCESS;
  118. }
  119. /**
  120.  * Creates a new mutex. This should maps to the fast mutex implementation 
  121.  * (a.k.a. non reccursive mutex) on the platform.
  122.  * mutex   < pointer to mutex to create >
  123.  
  124.  * @return MB_SUCCESS and update "mutex" on success, or MB_FAILURE on failure.
  125.  */
  126. mb_error_t mb_mutex_create(mb_mutex_t *mutex)
  127. {
  128. mutex_t *pMutex=NULL;
  129. pMutex=mutex_create_fifo();
  130. if(pMutex==NULL)
  131. {
  132. mb_printf("n[Machblue]:Mutex create error.");
  133. return MB_FAILURE;
  134. }
  135. *mutex=(mb_mutex_t)pMutex;
  136. return MB_SUCCESS;
  137. }
  138. /**
  139.  * Deletes a mutex.
  140.  * mutex   < mutex to delete >
  141.  
  142.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  143.  */
  144. mb_error_t mb_mutex_delete(mb_mutex_t mutex)
  145. {
  146. mutex_t *pMutex=(mutex_t *)mutex;
  147. int ret;
  148. if(pMutex==NULL)
  149. {
  150. mb_printf("n[Machblue]:Mutex delete NULL.");
  151. return MB_FAILURE;
  152. }
  153. ret=mutex_delete(pMutex); 
  154. if(ret!=0)
  155. {
  156. mb_printf("n[Machblue]:Mutex delete error.");
  157. return MB_FAILURE;
  158. }
  159. return MB_SUCCESS;
  160. }
  161. /**
  162.  * Locks a mutex.
  163.  * mutex    < mutex to lock >
  164.  
  165.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  166.  */
  167. mb_error_t mb_mutex_lock(mb_mutex_t mutex)
  168. {
  169. mutex_t *pMutex=(mutex_t *)mutex;
  170. if(pMutex==NULL)
  171. {
  172. mb_printf("n[Machblue]:Mutex lock NULL.");
  173. return MB_FAILURE;
  174. }
  175. mutex_lock(pMutex);
  176. return MB_SUCCESS;
  177. }
  178. /**
  179.  * Unlocks a mutex
  180.  
  181.  * mutex   < mutex to unlock >
  182.  
  183.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  184.  */
  185. mb_error_t mb_mutex_unlock(mb_mutex_t mutex)
  186. {
  187. mutex_t *pMutex=(mutex_t *)mutex;
  188. int ret;
  189. if(pMutex==NULL)
  190. {
  191. mb_printf("n[Machblue]:Mutex unlock NULL.");
  192. return MB_FAILURE;
  193. }
  194. ret=mutex_release(pMutex);
  195. if(ret!=0)
  196. {
  197. mb_printf("n[Machblue]:Mutex unlock error.");
  198. return MB_FAILURE;
  199. }
  200. return MB_SUCCESS;
  201. }
  202. /**
  203.  * Tries to lock a mutex (non-blocking). Returns immediatly (does 
  204.  * not block) if the mutex is already locked otherwise locks it.
  205.  
  206.  * mutex    < mutex to lock >
  207.  
  208.  * @return MB_SUCCESS on success, MB_BUSY if the mutex is already locked
  209.  * or MB_FAILURE on failure.
  210.  */
  211. mb_error_t mb_mutex_trylock(mb_mutex_t mutex)
  212. {
  213. mutex_t *pMutex=(mutex_t *)mutex;
  214. if(pMutex==NULL)
  215. {
  216. mb_printf("n[Machblue]:Mutex try lock NULL.");
  217. return MB_FAILURE;
  218. }
  219. if((pMutex->mutex_count)>0)
  220. return MB_BUSY;
  221. mutex_lock(pMutex);
  222. return MB_SUCCESS;
  223. }
  224. /** @} */