This patch fixes the library code for the saMsgSendReceive call. This
call can block, and therefore we need to create a new ipc connection
in the library.
Also fixed the ipc_msg.h file such that the response structure for
this call includes the reply message.
Ryan
Index: include/ipc_msg.h
===================================================================
--- include/ipc_msg.h (revision 1878)
+++ include/ipc_msg.h (working copy)
@@ -302,6 +302,8 @@
struct res_lib_msg_messagesendreceive {
coroipc_response_header_t header;
+ SaTimeT reply_time;
+ SaMsgMessageT message;
};
struct req_lib_msg_messagereply {
@@ -313,8 +315,8 @@
struct res_lib_msg_messagereply {
coroipc_response_header_t header;
-}
-;
+};
+
struct req_lib_msg_messagereplyasync {
coroipc_request_header_t header;
SaMsgMessageT reply_message;
Index: lib/msg.c
===================================================================
--- lib/msg.c (revision 1878)
+++ lib/msg.c (working copy)
@@ -1361,7 +1361,7 @@
struct req_lib_msg_messageget req_lib_msg_messageget;
struct res_lib_msg_messageget *res_lib_msg_messageget;
struct iovec iov;
- hdb_handle_t msg_handle;
+ hdb_handle_t ipc_handle;
void * buffer;
@@ -1382,7 +1382,7 @@
IPC_REQUEST_SIZE,
IPC_RESPONSE_SIZE,
IPC_DISPATCH_SIZE,
- &msg_handle);
+ &ipc_handle);
if (error != SA_AIS_OK) {
goto error_hdb_put;
}
@@ -1403,7 +1403,7 @@
iov.iov_len = sizeof (struct req_lib_msg_messageget);
error = coroipcc_msg_send_reply_receive_in_buf_get (
- msg_handle,
+ ipc_handle,
&iov,
1,
&buffer);
@@ -1438,9 +1438,9 @@
*senderId = res_lib_msg_messageget->sender_id;
error_ipc_put:
- coroipcc_msg_send_reply_receive_in_buf_put (msg_handle);
+ coroipcc_msg_send_reply_receive_in_buf_put (ipc_handle);
error_disconnect:
- coroipcc_service_disconnect (msg_handle);
+ coroipcc_service_disconnect (ipc_handle);
error_hdb_put:
hdb_handle_put (&queueHandleDatabase, queueHandle);
error_exit:
@@ -1538,9 +1538,12 @@
{
struct msgInstance *msgInstance;
struct req_lib_msg_messagesendreceive req_lib_msg_messagesendreceive;
- struct res_lib_msg_messagesendreceive res_lib_msg_messagesendreceive;
+ struct res_lib_msg_messagesendreceive *res_lib_msg_messagesendreceive;
struct iovec iov[2];
+ hdb_handle_t ipc_handle;
+ void * buffer;
+
SaAisErrorT error = SA_AIS_OK;
/* DEBUG */
@@ -1552,38 +1555,84 @@
goto error_exit;
}
+ error = coroipcc_service_connect (
+ COROSYNC_SOCKET_NAME,
+ MSG_SERVICE,
+ IPC_REQUEST_SIZE,
+ IPC_RESPONSE_SIZE,
+ IPC_DISPATCH_SIZE,
+ &ipc_handle);
+ if (error != SA_AIS_OK) {
+ goto error_hdb_put;
+ }
+
req_lib_msg_messagesendreceive.header.size =
sizeof (struct req_lib_msg_messagesendreceive) +
sendMessage->size;
req_lib_msg_messagesendreceive.header.id =
MESSAGE_REQ_MSG_MESSAGESENDRECEIVE;
+ req_lib_msg_messagesendreceive.timeout = timeout;
+
memcpy (&req_lib_msg_messagesendreceive.destination,
destination, sizeof (SaNameT));
memcpy (&req_lib_msg_messagesendreceive.message,
sendMessage, sizeof (SaMsgMessageT));
- req_lib_msg_messagesendreceive.timeout = timeout;
-
iov[0].iov_base = &req_lib_msg_messagesendreceive;
iov[0].iov_len = sizeof (struct req_lib_msg_messagesendreceive);
iov[1].iov_base = sendMessage->data;
iov[1].iov_len = sendMessage->size;
+ /*
error = coroipcc_msg_send_reply_receive (
msgInstance->ipc_handle,
iov,
2,
&res_lib_msg_messagesendreceive,
sizeof (struct res_lib_msg_messagesendreceive));
+ */
+ error = coroipcc_msg_send_reply_receive_in_buf_get (
+ ipc_handle,
+ iov,
+ 2,
+ &buffer);
+
/* if (error != SA_AIS_OK) */
- if (res_lib_msg_messagesendreceive.header.error != SA_AIS_OK) {
- error = res_lib_msg_messagesendreceive.header.error;
- goto error_put; /* ! */
+ res_lib_msg_messagesendreceive = buffer;
+
+ if (res_lib_msg_messagesendreceive->header.error != SA_AIS_OK) {
+ error = res_lib_msg_messagesendreceive->header.error;
+ goto error_disconnect;
}
-error_put:
+ if (receiveMessage->data == NULL) {
+ receiveMessage->size =
res_lib_msg_messagesendreceive->message.size;
+ receiveMessage->data = malloc (receiveMessage->size);
+ if (receiveMessage->data == NULL) {
+ error = SA_AIS_ERR_NO_MEMORY;
+ goto error_ipc_put;
+ }
+ }
+ else {
+ if (res_lib_msg_messagesendreceive->message.size >
receiveMessage->size) {
+ error = SA_AIS_ERR_NO_SPACE;
+ goto error_ipc_put;
+ }
+ }
+
+ memcpy (receiveMessage->data, ((char *)(buffer) +
+ sizeof (struct res_lib_msg_messagesendreceive)),
+ res_lib_msg_messagesendreceive->message.size);
+
+ *replySendTime = res_lib_msg_messagesendreceive->reply_time;
+
+error_ipc_put:
+ coroipcc_msg_send_reply_receive_in_buf_put (ipc_handle);
+error_disconnect:
+ coroipcc_service_disconnect (ipc_handle);
+error_hdb_put:
hdb_handle_put (&msgHandleDatabase, msgHandle);
error_exit:
return (error);
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais