source: azure_iot_hub_riscv/trunk/azure_iot_sdk/c-utility/adapters/lock_toppers.c@ 453

Last change on this file since 453 was 453, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 5.3 KB
Line 
1/*
2 * TOPPERS PROJECT Home Network Working Group Software
3 *
4 * Copyright (C) 2019 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id$
36 */
37#include <stdint.h>
38#include <stdlib.h>
39#include <kernel.h>
40#include <t_stdlib.h>
41#include "azure_c_shared_utility/lock.h"
42#include "azure_c_shared_utility/xlogging.h"
43
44#ifdef TOPPERS_SUPPORT_DYNAMIC_CRE
45#define MAX_MUTEX 4
46#define TASK_PRIORITY ((TMAX_TPRI + TMIN_TPRI) / 2)
47
48typedef struct _mutex
49{
50 ID mtxid;
51 ID tskid;
52 int count;
53} toppersMutex;
54static toppersMutex mutexs[MAX_MUTEX] = {0};
55#endif
56
57LOCK_HANDLE Lock_Init(void)
58{
59#ifndef TOPPERS_SUPPORT_DYNAMIC_CRE
60 LogError("TOPPERS/ASP does not support lock function.");
61 return LOCK_ERROR;
62#else
63 ER_ID ret;
64 T_CMTX cmtx;
65 toppersMutex *mutex = NULL;
66
67 for (int i = 0; i < MAX_MUTEX; i++)
68 {
69 if (mutexs[i].mtxid == 0)
70 {
71 mutex = &mutexs[i];
72 break;
73 }
74 }
75
76 if (mutex == NULL)
77 {
78 LogError("Not enough memory.");
79 }
80 else
81 {
82 memset(&cmtx, 0, sizeof(cmtx));
83
84 cmtx.mtxatr = TA_TPRI;
85 cmtx.ceilpri = TASK_PRIORITY;
86
87 ret = acre_mtx(&cmtx);
88 if (ret < 0)
89 {
90 mutex->mtxid = 0;
91 mutex = NULL;
92 LogError("Failed acre_mtx(%d).", ret);
93 }
94 else
95 {
96 mutex->mtxid = (ID)ret;
97 mutex->count = 0;
98 }
99 }
100
101 return (LOCK_HANDLE *)mutex;
102#endif
103}
104
105LOCK_RESULT Lock(LOCK_HANDLE handle)
106{
107#ifndef TOPPERS_SUPPORT_DYNAMIC_CRE
108 LogError("TOPPERS/ASP does not support lock function.");
109 return LOCK_ERROR;
110#else
111 T_RMTX rmtx;
112 toppersMutex *mutex = (toppersMutex *)handle;
113 ID tskid = 0;
114 ER ret;
115
116 if (mutex == NULL)
117 {
118 LogError("Invalid argument; handle is NULL.");
119 return LOCK_ERROR;
120 }
121
122 ret = get_tid(&tskid);
123 if (ret < 0) {
124 LogError("Failed task.");
125 return LOCK_ERROR;
126 }
127
128 ret = loc_mtx(mutex->mtxid);
129 if (ret == E_OBJ)
130 {
131 mutex->count++;
132 }
133 else if (ret < 0)
134 {
135 LogError("Failed loc_mtx(%d).", mutex->mtxid);
136 return LOCK_ERROR;
137 }
138
139 mutex->tskid = tskid;
140
141 return LOCK_OK;
142#endif
143}
144
145LOCK_RESULT Unlock(LOCK_HANDLE handle)
146{
147#ifndef TOPPERS_SUPPORT_DYNAMIC_CRE
148 LogError("TOPPERS/ASP does not support lock function.");
149 return LOCK_ERROR;
150#else
151 toppersMutex *mutex = (toppersMutex *)handle;
152 ID tskid = 0;
153 ER ret;
154
155 if (mutex == NULL)
156 {
157 LogError("Invalid argument; handle is NULL.");
158 return LOCK_ERROR;
159 }
160
161 ret = get_tid(&tskid);
162 if (ret < 0) {
163 LogError("Failed task.");
164 return LOCK_ERROR;
165 }
166
167 loc_cpu();
168
169 if ((mutex->tskid == tskid) && (mutex->count > 0))
170 {
171 mutex->count--;
172 unl_cpu();
173 }
174 else
175 {
176 unl_cpu();
177
178 ret = unl_mtx(mutex->mtxid);
179 if (ret < 0)
180 {
181 LogError("Failed unl_mtx(%d).", mutex->mtxid);
182 return LOCK_ERROR;
183 }
184 }
185
186 return LOCK_OK;
187#endif
188}
189
190LOCK_RESULT Lock_Deinit(LOCK_HANDLE handle)
191{
192#ifndef TOPPERS_SUPPORT_DYNAMIC_CRE
193 LogError("TOPPERS/ASP does not support lock function.");
194 return LOCK_ERROR;
195#else
196 toppersMutex *mutex = (toppersMutex *)handle;
197 ER ret;
198
199 if (mutex == NULL)
200 {
201 LogError("Failed argument; handle is NULL.");
202 return LOCK_ERROR;
203 }
204
205 ret = del_mtx(mutex->mtxid);
206 if (ret < 0)
207 {
208 LogError("Failed del_mtx(%d).", mutex->mtxid);
209 return LOCK_ERROR;
210 }
211
212 mutex->mtxid = 0;
213
214 return LOCK_OK;
215#endif
216}
Note: See TracBrowser for help on using the repository browser.