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