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

DVD

开发平台:

C/C++

  1. //*****************************************************************************
  2. //File Name: kb_machblue_core_msg.c
  3. //
  4. //Description: msg function
  5. //
  6. // used by Machblue to access the platform's thread api
  7. // used by Machblue to access the platform's message passing
  8. //
  9. //Author: steven
  10. //
  11. //Date:  2006.12.29
  12. //
  13. //Version:  v1.0
  14. //*****************************************************************************
  15. #include "gendef.h"
  16. #include "osp.h"
  17. #include "machblue_defines.h"
  18. #include "machblue_porting_core.h"
  19. /**
  20.  * the msg information struct
  21.  */
  22. typedef struct _MB_MsgInfo_s
  23. {
  24. UINT32 queueID;
  25. UINT32 msgID;
  26. struct _MB_MsgInfo_s *pNext;
  27. }MB_MsgInfo_t;
  28. /**
  29.  * pointer to store the msg information
  30.  */
  31. static MB_MsgInfo_t *MsgInfo=NULL;
  32. #define MB_MAX_MESSAGE 128
  33. /**
  34.  * add the msg information
  35.  */
  36. void kb_addMsgInfo(UINT32 queueID,UINT32 msgID)
  37. {
  38. MB_MsgInfo_t *pInfo,*pTemp;
  39. pInfo=(MB_MsgInfo_t *)mb_malloc(sizeof(MB_MsgInfo_t));
  40. pInfo->queueID=queueID;
  41. pInfo->msgID=msgID;
  42. pInfo->pNext=NULL;
  43. if(MsgInfo==NULL)
  44. MsgInfo=pInfo;
  45. else
  46. {
  47. pTemp=MsgInfo;
  48. while(pTemp->pNext!=NULL)
  49. pTemp=pTemp->pNext;
  50. pTemp->pNext=pInfo;
  51. }
  52. }
  53. /**
  54.  * delete the msg information
  55.  */
  56. void kb_deleteMsgInfo(UINT32 msgID)
  57. {
  58. MB_MsgInfo_t *pInfo1,*pInfo2;
  59. if(MsgInfo==NULL)
  60. return;
  61. pInfo1=MsgInfo;
  62. pInfo2=pInfo1->pNext;
  63. if(pInfo1->msgID==msgID)
  64. {
  65. MsgInfo=MsgInfo->pNext;
  66. mb_free(pInfo1);
  67. return;
  68. }
  69. while(pInfo2!=NULL)
  70. {
  71. if(pInfo2->msgID==msgID)
  72. {
  73. pInfo1->pNext=pInfo2->pNext;
  74. mb_free(pInfo2);
  75. break;
  76. }
  77. pInfo1=pInfo2;
  78. pInfo2=pInfo1->pNext;
  79. }
  80. }
  81. /**
  82.  * get queue id by msg id from the msg information
  83.  */
  84. void kb_getQueueID(UINT32 *queueID,UINT32 msgID)
  85. {
  86. MB_MsgInfo_t *pInfo;
  87. pInfo=MsgInfo;
  88. while(pInfo!=NULL)
  89. {
  90. if(pInfo->msgID==msgID)
  91. {
  92. *queueID=pInfo->queueID;
  93. break;
  94. }
  95. pInfo=pInfo->pNext;
  96. }
  97. }
  98. /**
  99.  * Creates a new thread.
  100.  * tid  < pointer to location to store new thread id >
  101.  * thread_attrib < pointer to attributes of thread to create >
  102.  * start_function < pointer to thread start function >
  103.  * arg              < pointer to argument to pass to start function >
  104.  
  105.  * @return a MB_SUCCESS and updates "tid" on success or MB_FAILURE on failure.
  106.  */
  107. mb_error_t mb_thread_create(mb_tid_t *tid,mb_thread_attributes_t *thread_attrib,
  108.               mb_thread_start_function_t *start_function,void *arg)
  109. {
  110. int ret;
  111. UINT32 queueID,msgID,stackSize;
  112. T_OSP_QueueInfo *pQueueInfo;
  113. //create queue
  114. pQueueInfo = (T_OSP_QueueInfo*)mb_malloc(sizeof(T_OSP_QueueInfo));
  115. if(pQueueInfo == NULL)
  116. {
  117. mb_printf("n[Machblue]:Thread create memory malloc error.");
  118. return MB_FAILURE;
  119. }
  120. pQueueInfo->pQueueId = (message_queue_t*)mb_malloc(sizeof(message_queue_t));
  121. pQueueInfo->pQueueBuf = (void*)mb_malloc(MESSAGE_MEMSIZE_QUEUE(sizeof(mb_message_t),MB_MAX_MESSAGE));
  122. if( (pQueueInfo->pQueueId == NULL)
  123. || (pQueueInfo->pQueueBuf == NULL) )
  124. {
  125. mb_free((void*)pQueueInfo->pQueueId);
  126. mb_free((void*)pQueueInfo->pQueueBuf);
  127. mb_free((void*)pQueueInfo);
  128. mb_printf("n[Machblue]:Thread create memory malloc error.");
  129. return MB_FAILURE;
  130. }
  131. message_init_queue_timeout(pQueueInfo->pQueueId, pQueueInfo->pQueueBuf, sizeof(mb_message_t),(unsigned int)MB_MAX_MESSAGE);
  132. queueID = (UINT32)pQueueInfo->pQueueId;
  133. InserQueueNode(pQueueInfo);
  134. //create task
  135. stackSize=thread_attrib->stack_size;
  136. if(stackSize==0)
  137. stackSize=1024 * 8;
  138.      ret=KB_OSPTaskInit("MACHBLUE",stackSize,(void (*)(void*))start_function,3*16,arg,&msgID);
  139. if(ret!=Ret_OK)
  140. {
  141. mb_printf("n[Machblue]:Thread init error[%d].",ret);
  142. return MB_FAILURE;
  143. }
  144. *tid=msgID;
  145. kb_addMsgInfo(queueID,msgID);
  146. return MB_SUCCESS;
  147. }
  148. /**
  149.  * Deletes a thread. This simply deletes the handle to the 
  150.  * trhead on platforms that have such a notion. The thread should 
  151.  * not be killed as a result of this call.
  152.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  153.  */
  154. mb_error_t mb_thread_delete(mb_tid_t tid)
  155. {
  156. KB_OSPRet ret;
  157. ret=KB_OSPTaskDel(tid);
  158. if(ret!=Ret_OK)
  159. {
  160. mb_printf("n[Machblue]:Thread delete error[%d].",ret);
  161. return MB_FAILURE;
  162. }
  163. kb_deleteMsgInfo(tid);
  164. return MB_SUCCESS;
  165. }
  166. /**
  167.  * Joins (waits for completion of) a thread.
  168.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  169.  */
  170. mb_error_t mb_thread_join(mb_tid_t tid)
  171. {
  172. int ret;
  173. ret=task_wait( (task_t **)&tid,1,(clock_t*)TIMEOUT_INFINITY); 
  174. if(ret<0)
  175. {
  176. mb_printf("n[Machblue]:Thread join error.");
  177. return MB_FAILURE;
  178. }
  179. return MB_SUCCESS;
  180. }
  181. /**
  182.  * Gets the current thread id.
  183.  * @return MB_SUCCESS and updates tid on success, MB_FAILURE otherwise.
  184.  */
  185. mb_error_t mb_thread_id_get(mb_tid_t *tid)
  186. {
  187. task_t *taskID=task_id();
  188. if(taskID==NULL)
  189. {
  190. mb_printf("n[Machblue]:Thread ID get error.");
  191. return MB_FAILURE;
  192. }
  193. *tid=(mb_tid_t)taskID;
  194. return MB_SUCCESS;
  195. }
  196. /**
  197.  * Posts a message to a thread.
  198.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  199.  */
  200. mb_error_t mb_msg_post(mb_tid_t tid,mb_message_t *msg)
  201. {
  202. UINT32 queueID;
  203. mb_message_t * PtMessage;
  204. if(msg == NULL)
  205. {
  206. mb_printf("n[Machblue]:Msg post NULL.");
  207. return MB_FAILURE;
  208. }
  209. kb_getQueueID(&queueID,tid);
  210.      PtMessage = (mb_message_t *)message_claim_timeout((message_queue_t*)queueID, (clock_t*)TIMEOUT_INFINITY);
  211. if(PtMessage == NULL)
  212. {
  213. mb_printf("n[Machblue]:Msg post error.");
  214. return MB_FAILURE;
  215. }
  216.      mb_memcpy(PtMessage, msg, sizeof(mb_message_t));
  217. message_send((message_queue_t*)queueID, (void*)PtMessage);
  218. return MB_SUCCESS;
  219. }
  220. /**
  221.  * Waits for a message in the current thread mesasge queue.
  222.  * @return MB_SUCCESS on success or MB_FAILURE on failure.
  223.  */
  224. mb_error_t mb_msg_wait(mb_message_t *msg)
  225. {
  226. UINT32 queueID,msgID;
  227. void* pMessageReceived;
  228. if(msg == NULL)
  229. {
  230. mb_printf("n[Machblue]:Msg wait NULL.");
  231. return MB_FAILURE;
  232. }
  233. if(mb_thread_id_get(&msgID)==MB_FAILURE)
  234. {
  235. mb_printf("n[Machblue]:Msg wait error.");
  236. return MB_FAILURE;
  237. }
  238. kb_getQueueID(&queueID,msgID);
  239. pMessageReceived = message_receive_timeout((message_queue_t*)queueID,(clock_t*)TIMEOUT_INFINITY);
  240. if(pMessageReceived != NULL)
  241. {
  242. mb_memcpy(msg, pMessageReceived, sizeof(mb_message_t));
  243. message_release((message_queue_t*)queueID, pMessageReceived);
  244. return MB_SUCCESS;
  245. }
  246. else
  247. {
  248. mb_printf("n[Machblue]:Msg wait error.");
  249. return MB_FAILURE;
  250. }
  251. }
  252. /**
  253.  * Gets a message from the current thread message queue without waiting.
  254.  * If the queue is empty it @return immediatly.
  255.  * @return MB_SUCCESS if a message was successfully retrieved, MB_FAILURE otherwise.
  256.  */
  257. mb_error_t mb_msg_get_no_wait(mb_message_t *msg)
  258. {
  259. UINT32 queueID,msgID;
  260. void* pMessageReceived;
  261. if(msg == NULL)
  262. {
  263. mb_printf("n[Machblue]:Msg get no wait NULL.");
  264. return MB_FAILURE;
  265. }
  266. if(mb_thread_id_get(&msgID)==MB_FAILURE)
  267. {
  268. //mb_printf("n[Machblue]:Msg get no wait error.");
  269. return MB_FAILURE;
  270. }
  271. kb_getQueueID(&queueID,msgID);
  272. pMessageReceived = message_receive_timeout((message_queue_t*)queueID, (clock_t*)TIMEOUT_IMMEDIATE);
  273. if(pMessageReceived != NULL)
  274. {
  275. mb_memcpy(msg, pMessageReceived, sizeof(mb_message_t));
  276. message_release((message_queue_t*)queueID, pMessageReceived);
  277. return MB_SUCCESS;
  278. }
  279. else
  280. {
  281. //mb_printf("n[Machblue]:Msg get no wait error.");
  282. return MB_FAILURE;
  283. }
  284. }