[IE][VPU][XLink]: XLink semaphore wrappers impl (#3079)
[platform/upstream/dldt.git] / inference-engine / thirdparty / movidius / XLink / shared / src / XLinkPrivateFields.c
1 // Copyright (C) 2018-2020 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <stdio.h>
6 #include <string.h>
7 #include "stdlib.h"
8
9 #include "XLinkPrivateFields.h"
10 #include "XLinkPrivateDefines.h"
11 #include "XLinkErrorUtils.h"
12
13 #ifdef MVLOG_UNIT_NAME
14 #undef MVLOG_UNIT_NAME
15 #define MVLOG_UNIT_NAME xLink
16 #endif
17
18 #include "XLinkLog.h"
19
20 xLinkDesc_t* getLinkById(linkId_t id)
21 {
22     int i;
23     for (i = 0; i < MAX_LINKS; i++)
24         if (availableXLinks[i].id == id)
25             return &availableXLinks[i];
26     return NULL;
27 }
28
29 xLinkDesc_t* getLink(void* fd)
30 {
31     int i;
32     for (i = 0; i < MAX_LINKS; i++)
33         if (availableXLinks[i].deviceHandle.xLinkFD == fd)
34             return &availableXLinks[i];
35     return NULL;
36 }
37
38 streamId_t getStreamIdByName(xLinkDesc_t* link, const char* name)
39 {
40     streamDesc_t* stream = getStreamByName(link, name);
41
42     if (stream) {
43         streamId_t id = stream->id;
44         releaseStream(stream);
45         return id;
46     }
47
48     return INVALID_STREAM_ID;
49 }
50
51 streamDesc_t* getStreamById(void* fd, streamId_t id)
52 {
53     xLinkDesc_t* link = getLink(fd);
54     XLINK_RET_ERR_IF(link == NULL, NULL);
55     int stream;
56     for (stream = 0; stream < XLINK_MAX_STREAMS; stream++) {
57         if (link->availableStreams[stream].id == id) {
58             XLink_sem_wait(&link->availableStreams[stream].sem);
59
60             return &link->availableStreams[stream];
61         }
62     }
63     return NULL;
64 }
65
66 streamDesc_t* getStreamByName(xLinkDesc_t* link, const char* name)
67 {
68     XLINK_RET_ERR_IF(link == NULL, NULL);
69     int stream;
70     for (stream = 0; stream < XLINK_MAX_STREAMS; stream++) {
71         if (link->availableStreams[stream].id != INVALID_STREAM_ID &&
72             strcmp(link->availableStreams[stream].name, name) == 0) {
73             XLink_sem_wait(&link->availableStreams[stream].sem);
74
75             return &link->availableStreams[stream];
76         }
77     }
78     return NULL;
79 }
80
81 void releaseStream(streamDesc_t* stream)
82 {
83     if (stream && stream->id != INVALID_STREAM_ID) {
84         XLink_sem_post(&stream->sem);
85     }
86     else {
87         mvLog(MVLOG_DEBUG,"trying to release a semaphore for a released stream\n");
88     }
89 }
90
91 xLinkState_t getXLinkState(xLinkDesc_t* link)
92 {
93     XLINK_RET_ERR_IF(link == NULL, XLINK_NOT_INIT);
94     mvLog(MVLOG_DEBUG,"%s() link %p link->peerState %d\n", __func__,link, link->peerState);
95     return link->peerState;
96 }