1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "hci_failure.h"
17 
18 #include "btstack.h"
19 #include "hci.h"
20 #include "list.h"
21 #include "mutex.h"
22 
23 static List *g_hciFailureCallbackList = NULL;
24 static Mutex *g_hciFailureCallbackListLock = NULL;
25 
HciInitFailure()26 void HciInitFailure()
27 {
28     g_hciFailureCallbackList = ListCreate(NULL);
29     g_hciFailureCallbackListLock = MutexCreate();
30 }
31 
HciCloseFailure()32 void HciCloseFailure()
33 {
34     if (g_hciFailureCallbackList != NULL) {
35         ListDelete(g_hciFailureCallbackList);
36         g_hciFailureCallbackList = NULL;
37     }
38     if (g_hciFailureCallbackListLock != NULL) {
39         MutexDelete(g_hciFailureCallbackListLock);
40         g_hciFailureCallbackListLock = NULL;
41     }
42 }
43 
HCI_RegisterFailureCallback(const HciFailureCallbacks * callbacks)44 int HCI_RegisterFailureCallback(const HciFailureCallbacks *callbacks)
45 {
46     MutexLock(g_hciFailureCallbackListLock);
47 
48     ListAddLast(g_hciFailureCallbackList, (void *)callbacks);
49 
50     MutexUnlock(g_hciFailureCallbackListLock);
51     return BT_SUCCESS;
52 }
53 
HCI_DeregisterFailureCallback(const HciFailureCallbacks * callbacks)54 int HCI_DeregisterFailureCallback(const HciFailureCallbacks *callbacks)
55 {
56     MutexLock(g_hciFailureCallbackListLock);
57 
58     ListRemoveNode(g_hciFailureCallbackList, (void *)callbacks);
59 
60     MutexUnlock(g_hciFailureCallbackListLock);
61 
62     return BT_SUCCESS;
63 }
64 
HciOnCmdTimeout()65 void HciOnCmdTimeout()
66 {
67     HciFailureCallbacks *callbacks = NULL;
68     MutexLock(g_hciFailureCallbackListLock);
69 
70     ListNode *node = ListGetFirstNode(g_hciFailureCallbackList);
71     while (node != NULL) {
72         callbacks = ListGetNodeData(node);
73         if (callbacks != NULL) {
74             if (callbacks->onCmdTimeout != NULL) {
75                 callbacks->onCmdTimeout();
76             }
77         }
78         node = ListGetNextNode(node);
79     }
80 
81     MutexUnlock(g_hciFailureCallbackListLock);
82 }