Simplify output from GateMPApp
[ipc/ipcdev.git] / qnx / src / tests / GateMPApp / GateMPApp.c
1 /*
2  * Copyright (c) 2013-2014, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
33 /*
34  *  ======== GateMPApp.c ========
35  *
36  */
38 /* host header files */
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <unistd.h>
43 /* package header files */
44 #include <ti/ipc/Std.h>
45 #include <ti/ipc/MessageQ.h>
46 #include <ti/ipc/GateMP.h>
48 /* local header files */
49 #include "GateMPApp.h"
51 #include <ti/shmemallocator/SharedMemoryAllocatorUsr.h>
52 #include <ti/ipc/tests/GateMPAppCommon.h>
54 /* module structure */
55 typedef struct {
56     MessageQ_Handle       hostQue;    /* created locally */
57     MessageQ_QueueId      slaveQue;   /* opened remotely */
58     UInt16                heapId;     /* MessageQ heapId */
59     UInt32                msgSize;    /* Size of messages */
60     volatile UInt32 *     intPtr;     /* Integer pointer */
61     UInt32                physAddr;   /* Physical address of shared memory */
62     GateMP_Handle         hostGateMPHandle;  /* handle to host-created gate */
63     GateMP_Handle         slaveGateMPHandle; /* handle to slave-created gate */
64     shm_buf               buf;        /* shared memory buffer */
65 } GateMPApp_Module;
67 /* private data */
68 static GateMPApp_Module Module;
71 /*
72  *  ======== GateMPApp_create ========
73  */
75 Int GateMPApp_create()
76 {
77     Int                 status    =0;
78     MessageQ_Params     msgqParams;
79     GateMP_Params       gateParams;
81     printf("--> GateMPApp_create:\n");
83     /* setting default values */
84     Module.hostQue = NULL;
85     Module.slaveQue = MessageQ_INVALIDMESSAGEQ;
86     Module.heapId = GateMPApp_MsgHeapId;
87     Module.intPtr = NULL;
88     Module.physAddr = 0;
89     Module.hostGateMPHandle = NULL;
90     Module.slaveGateMPHandle = NULL;
91     Module.msgSize = sizeof(GateMPApp_Msg);
93     /* create local message queue (inbound messages) */
94     MessageQ_Params_init(&msgqParams);
96     Module.hostQue = MessageQ_create(GateMPApp_HostMsgQueName, &msgqParams);
98     if (Module.hostQue == NULL) {
99         printf("GateMPApp_create: Failed creating MessageQ\n");
100         status = GATEMPAPP_E_FAILURE;
101         goto leave;
102     }
104     /* open the remote message queue */
105     do {
106         status = MessageQ_open(GateMPApp_SlaveMsgQueName, &Module.slaveQue);
107         sleep(1);
108     } while (status == MessageQ_E_NOTFOUND);
110     if (status < 0) {
111         printf("GateMPApp_create: Failed opening MessageQ\n");
112         status = GATEMPAPP_E_FAILURE;
113         goto leave;
114     }
116     /* allocate space from shared memory for an integer */
117     status = SHM_alloc_aligned(sizeof(UInt32), sizeof(UInt32), &Module.buf);
118     if (status < 0) {
119         printf("GateMPApp_create: Could not allocate shared memory\n");
120         status = GATEMPAPP_E_FAILURE;
121         goto leave;
122     }
123     Module.intPtr = (UInt32 *)Module.buf.vir_addr;
124     Module.physAddr = (UInt32)Module.buf.phy_addr;
126     if ((Module.intPtr == NULL) || (Module.physAddr == NULL)) {
127         printf("GateMPApp_create: Failed to get buffer address\n");
128         status = GATEMPAPP_E_FAILURE;
129         goto leave;
130     }
132     /* create GateMP */
133     GateMP_Params_init(&gateParams);
135     gateParams.name             = GATEMP_HOST_NAME;
136     gateParams.localProtect     = GateMP_LocalProtect_PROCESS;
137     gateParams.remoteProtect    = GateMP_RemoteProtect_SYSTEM;
139     Module.hostGateMPHandle = GateMP_create (&gateParams);
141     if (Module.hostGateMPHandle == NULL) {
142         status = GATEMPAPP_E_FAILURE;
143         printf("GateMPApp_create: Failed to create GateMP\n");
144         goto leave;
145     }
146     printf("GateMPApp_create: Host is ready\n");
148 leave:
149     printf("<-- GateMPApp_create:\n");
150     return(status);
154 /*
155  *  ======== GateMPApp_delete ========
156  */
157 Int GateMPApp_delete(Void)
159     Int         status;
160     GateMPApp_Msg *   msg;
162     printf("--> GateMPApp_delete:\n");
164     /* allocate message */
165     msg = (GateMPApp_Msg *)MessageQ_alloc(Module.heapId, Module.msgSize);
167     if (msg == NULL) {
168         status = GATEMPAPP_E_FAILURE;
169         goto leave;
170     }
172     /* set the return address in the message header */
173     MessageQ_setReplyQueue(Module.hostQue, (MessageQ_Msg)msg);
175     /* sending shutdown command */
176     msg->cmd = GATEMPAPP_CMD_SHUTDOWN;
177     MessageQ_put(Module.slaveQue, (MessageQ_Msg)msg);
179     /* wait for acknowledgement message */
180     status = MessageQ_get(Module.hostQue, (MessageQ_Msg *)&msg,
181             MessageQ_FOREVER);
183     if (status < 0) {
184         status = GATEMPAPP_E_FAILURE;
185         goto leave;
186     }
188     if (msg->cmd != GATEMPAPP_CMD_SHUTDOWN_ACK) {
189         status = GATEMPAPP_E_UNEXPECTEDMSG;
190         goto leave;
191     }
193     /* free the message */
194     MessageQ_free((MessageQ_Msg)msg);
196     /* delete GateMP */
197     GateMP_delete(&Module.hostGateMPHandle);
199     /* free shared memory buffer */
200     status = SHM_release(&Module.buf);
201     if(status < 0) {
202         status = GATEMPAPP_E_FAILURE;
203         goto leave;
204     }
206     /* close remote resources */
207     status = MessageQ_close(&Module.slaveQue);
209     if (status < 0) {
210         status = GATEMPAPP_E_FAILURE;
211         goto leave;
212     }
214     /* delete the host message queue */
215     status = MessageQ_delete(&Module.hostQue);
217     if (status < 0) {
218         status = GATEMPAPP_E_FAILURE;
219         goto leave;
220     }
222 leave:
223     printf("<-- GateMPApp_delete:\n");
224     return(status);
228 /*
229  *  ======== GateMPApp_exec ========
230  */
231 Int GateMPApp_exec(Void)
233     Int         status;
234     Int         i;
235     GateMPApp_Msg *   msg;
236     IArg        gateKey         = 0;
237     UInt32      num;
238     UInt32      prevNum;
240     printf("--> GateMPApp_exec:\n");
242     /* set shared variable initial value */
243     *Module.intPtr = 500;
245     /* allocate message */
246     msg = (GateMPApp_Msg *)MessageQ_alloc(Module.heapId, Module.msgSize);
247     if (msg == NULL) {
248         status = GATEMPAPP_E_FAILURE;
249         goto leave;
250     }
252     /* set the return address in the message header */
253     MessageQ_setReplyQueue(Module.hostQue, (MessageQ_Msg)msg);
255     /* fill in message payload */
256     msg->cmd = GATEMPAPP_CMD_SPTR_ADDR;
257     msg->payload = Module.physAddr;
259     /* send message */
260     MessageQ_put(Module.slaveQue, (MessageQ_Msg)msg);
262     /* wait for return message */
263     status = MessageQ_get(Module.hostQue, (MessageQ_Msg *)&msg,
264         MessageQ_FOREVER);
265     if (status < 0) {
266         goto leave;
267     }
269     if (msg->cmd != GATEMPAPP_CMD_SPTR_ADDR_ACK)
270     {
271         status = GATEMPAPP_E_UNEXPECTEDMSG;
272         goto leave;
273     }
275     /* free the message */
276     MessageQ_free((MessageQ_Msg)msg);
278     /* open slave-created GateMP */
279     do {
280         status = GateMP_open(GATEMP_SLAVE_NAME, &Module.slaveGateMPHandle);
281     } while (status == GateMP_E_NOTFOUND);
283     if (status < 0) {
284         printf("GateMPApp_exec: Failed to open slave-created GateMP");
285         status = GATEMPAPP_E_FAILURE;
286         goto leave;
287     }
289     printf("GateMPApp_exec: Using host-created gate\n");
290     for (i = 0; i < LOOP_ITR; i++) {
291         /* read the shared variable as long as no one is currently modifying
292          * it
293          */
295         /* enter GateMP */
296         gateKey = GateMP_enter(Module.hostGateMPHandle);
298         /* read shared variable value */
299         prevNum = *Module.intPtr;
301         /* randomly modify the shared variable */
302         if (rand() % 2) {
303             *Module.intPtr -= 1;
304         }
305         else {
306             *Module.intPtr += 1;
307         }
309         /* read shared variable value again*/
310         num = *Module.intPtr;
312         if ((prevNum != num + 1) && (prevNum != num - 1)) {
313             printf("GateMPApp_exec: unexpected variable value." \
314                 "Test failed.\n");
315             printf("GateMPApp_exec: Previous value: %d, " \
316                 "current value=%d\n", prevNum, num);
318             status = GATEMPAPP_E_FAILURE;
319             goto leave;
320         }
322         /* exit GateMP */
323         GateMP_leave(Module.hostGateMPHandle, gateKey);
324     }
326     /* allocate message */
327     msg = (GateMPApp_Msg *)MessageQ_alloc(Module.heapId, Module.msgSize);
328     if (msg == NULL) {
329         status = GATEMPAPP_E_FAILURE;
330         goto leave;
331     }
333     /* set the return address in the message header */
334     MessageQ_setReplyQueue(Module.hostQue, (MessageQ_Msg)msg);
336     /* fill in message payload */
337     msg->cmd = GATEMPAPP_CMD_SYNC;
339     /* send sync message */
340     MessageQ_put(Module.slaveQue, (MessageQ_Msg)msg);
342     /* wait for return sync message before we switch gates */
343     status = MessageQ_get(Module.hostQue, (MessageQ_Msg *)&msg,
344         MessageQ_FOREVER);
345     if (status < 0) {
346         goto leave;
347     }
349     if (msg->cmd != GATEMPAPP_CMD_SYNC)
350     {
351         status = GATEMPAPP_E_UNEXPECTEDMSG;
352         goto leave;
353     }
355     /* free the message */
356     MessageQ_free((MessageQ_Msg)msg);
358     printf("GateMPApp_exec: Using slave-created gate\n");
359     for (i = 0; i < LOOP_ITR; i++) {
360         /* read the shared variable as long as no one is currently modifying
361          * it
362          */
364         /* enter GateMP */
365         gateKey = GateMP_enter(Module.slaveGateMPHandle);
367         /* read shared variable value */
368         prevNum = *Module.intPtr;
370         /* randomly modify the shared variable */
371         if (rand() % 2) {
372             *Module.intPtr -= 1;
373         }
374         else {
375             *Module.intPtr += 1;
376         }
378         /* read shared variable value again */
379         num = *Module.intPtr;
381         if ((prevNum != num + 1) && (prevNum != num - 1)) {
382             printf("GateMPApp_exec: unexpected variable value." \
383                 "Test failed.\n");
384             printf("GateMPApp_exec: Previous value: %d, " \
385                 "current value=%d\n", prevNum, num);
387             status = GATEMPAPP_E_FAILURE;
388             goto leave;
389         }
391         /* exit GateMP */
392         GateMP_leave(Module.slaveGateMPHandle, gateKey);
393     }
395 leave:
396     if (Module.slaveGateMPHandle) {
397         GateMP_close(&Module.slaveGateMPHandle);
398     }
400     printf("<-- GateMPApp_exec: %d\n", status);
401     return(status);