1 /*
2  * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3  *
4  */
5 
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <stdint.h>
9 #include <string.h>
10 
11 #include "uvoice_os.h"
12 
13 #include "uvoice_common.h"
14 #include "uvoice_message.h"
15 
16 
uvoice_msgqueue_recv(uvoice_msgqueue_t * msgqueue,int type,void * msg,int size,int timeout)17 int uvoice_msgqueue_recv(uvoice_msgqueue_t *msgqueue, int type, void *msg, int size, int timeout)
18 {
19 	int flag = timeout == OS_WAIT_FOREVER ? 0 : IPC_NOWAIT;
20 	return msgrcv(msgqueue->qid, msg, size, type, flag);
21 }
22 
uvoice_msgqueue_send(uvoice_msgqueue_t * msgqueue,void * msg,int size,int block)23 int uvoice_msgqueue_send(uvoice_msgqueue_t *msgqueue, void *msg, int size, int block)
24 {
25 	int flag = block ? 0 : IPC_NOWAIT;
26 	return msgsnd(msgqueue->qid, msg, size, flag);
27 }
28 
uvoice_msgqueue_create(char * filename,int id)29 uvoice_msgqueue_t *uvoice_msgqueue_create(char *filename, int id)
30 {
31 	uvoice_msgqueue_t *msgqueue;
32 	key_t key;
33 
34 	if (!filename) {
35 		M_LOGE("filename null !\n");
36 		return -1;
37 	}
38 
39 	if (id < 0 || id > 255) {
40 		M_LOGE("id %d invalid !\n", id);
41 		return -1;
42 	}
43 
44 	msgqueue = snd_zalloc(sizeof(uvoice_msgqueue_t), AFM_EXTN);
45 	if (!msgqueue) {
46 		M_LOGE("alloc msgqueue failed !\n");
47 		return NULL;
48 	}
49 	msgqueue->id = id;
50 
51 	key = ftok(filename, id);
52 	if (key == -1) {
53 		M_LOGE("generate key failed !\n");
54 		snd_free(msgqueue);
55 		return NULL;
56 	}
57 
58 	msgqueue->id = msgget(key, IPC_CREAT|0666);
59 	if (msgqueue->id == -1) {
60 		M_LOGE("create msgqueue failed !\n");
61 		snd_free(msgqueue);
62 		return NULL;
63 	}
64 
65 	msgqueue->lock = os_mutex_new();
66 	msgqueue->recv_sem = os_sem_new(0);
67 
68 	return msgqueue;
69 }
70 
71 
uvoice_msgqueue_release(uvoice_msgqueue_t * msgqueue)72 int uvoice_msgqueue_release(uvoice_msgqueue_t *msgqueue)
73 {
74 	if (!msgqueue) {
75 		M_LOGE("msgqueue null !\n");
76 		return NULL;
77 	}
78 
79 	os_sem_free(msgqueue->recv_sem);
80 	os_mutex_free(msgqueue->lock);
81 
82 	snd_free(msgqueue);
83 	return 0;
84 }
85 
86