Browse Source

VxWorks message queue use SylixOS kernel send/receive double pend support message queue.

master
Hanhui 8 years ago
parent
commit
c7c9df3f27
  1. 2
      target/h/msgQLibCommon.h
  2. 49
      target/src/msgQLib.c

2
target/h/msgQLibCommon.h

@ -54,7 +54,7 @@ typedef struct { /* MSG_Q_INFO */
} MSG_Q_INFO;
typedef struct {
LW_HANDLE wrSync;
LW_HANDLE reserved;
LW_HANDLE syMsgq;
} MSG_Q_HDL;
typedef MSG_Q_HDL *MSG_Q_ID;

49
target/src/msgQLib.c

@ -123,13 +123,6 @@ MSG_Q_ID msgQCreate (int maxMsgs, int maxMsgLength, int options)
return (LW_NULL);
}
qid->wrSync = API_SemaphoreBCreate("vxWorks MsgQWr", LW_TRUE, ulOpt, LW_NULL);
if (qid->syMsgq == LW_OBJECT_HANDLE_INVALID) {
API_MsgQueueDelete(&qid->syMsgq);
free(qid);
return (LW_NULL);
}
return (qid);
}
@ -147,7 +140,6 @@ STATUS msgQDelete (MSG_Q_ID msgQId)
return (ERROR);
}
API_SemaphoreBDelete(&msgQId->wrSync);
free(msgQId);
return (OK);
@ -166,36 +158,19 @@ STATUS msgQSend (MSG_Q_ID msgQId, char *buffer, UINT nBytes,
return (ERROR);
}
for (;;) {
if (priority == MSG_PRI_URGENT) {
ulError = API_MsgQueueSendEx(msgQId->syMsgq, buffer, nBytes, LW_OPTION_URGENT);
} else {
ulError = API_MsgQueueSend(msgQId->syMsgq, buffer, nBytes);
}
if (ulError == ERROR_NONE) {
return (OK);
} else if (ulError != ERROR_MSGQUEUE_FULL) {
return (ERROR);
}
if (API_InterGetNesting()) {
errno = ERROR_MSGQUEUE_FULL;
return (ERROR);
if (priority == MSG_PRI_URGENT) {
ulError = API_MsgQueueSendEx2(msgQId->syMsgq, buffer, nBytes,
vx2syMsgQTo(timeout), LW_OPTION_URGENT);
} else {
ulError = API_MsgQueueSend2(msgQId->syMsgq, buffer, nBytes, vx2syMsgQTo(timeout));
}
} else {
ulError = API_SemaphoreBPend(msgQId->wrSync, vx2syMsgQTo(timeout));
}
if (ulError == ERROR_NONE) {
return (OK);
if (ulError) {
errno = ERROR_MSGQUEUE_FULL;
return (ERROR);
}
} else {
return (ERROR);
}
return (ERROR);
}
/*
@ -217,8 +192,8 @@ int msgQReceive (MSG_Q_ID msgQId, char *buffer, UINT maxNBytes, int timeout)
errno = S_objLib_OBJ_UNAVAILABLE;
}
return (ERROR);
} else {
API_SemaphoreBPost(msgQId->wrSync);
return (OK);
}
}
@ -253,6 +228,7 @@ STATUS msgQInfoGet (MSG_Q_ID msgQId, MSG_Q_INFO *pInfo)
if (ulError) {
errno = S_objLib_OBJ_UNAVAILABLE;
return (ERROR);
} else {
pInfo->maxMsgLength = (int)stMaxMsgLen;
pInfo->maxMsgs = (int)ulMaxMsgNum;
@ -282,6 +258,7 @@ int msgQNumMsgs (MSG_Q_ID msgQId)
if (ulError) {
errno = S_objLib_OBJ_UNAVAILABLE;
return (ERROR);
} else {
return ((int)ulMsg);
}

Loading…
Cancel
Save