3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2003-2004 by Takagi Nobuhisa
10 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によって公表されている GNU General Public License の Version 2 に記
12 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
13 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
34 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
35 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
37 * @(#) $Id: cxxrt.c,v 1.2 2010/05/02 04:43:52 suikan Exp $
39 #include "../kernel/jsp_kernel.h"
40 #include "../kernel/task.h"
41 #include "kernel_id.h"
42 extern void * malloc ( size_t size );
44 typedef int _toppers_cxxrt_sync_t;
45 typedef volatile char _toppers_cxxrt_once_t;
47 static inline int _get_tid()
49 return runtsk - tcb_table + TMIN_TSKID;
55 int _toppers_cxxrt_lock(_toppers_cxxrt_sync_t *sync)
62 int _toppers_cxxrt_trylock(_toppers_cxxrt_sync_t *sync)
64 return _toppers_cxxrt_lock(sync);
67 int _toppers_cxxrt_unlock(_toppers_cxxrt_sync_t *sync)
74 int _toppers_cxxrt_get_tskid(void)
76 return iniflg ? _get_tid() : 0;
80 * For recursive semaphore lock
82 static ID cxxrt_holder;
83 static UINT cxxrt_counter;
85 static inline void _toppers_cxxrt_recursive_semaphore_lock(ID semid)
87 if (iniflg && !sns_dsp())
92 if (cxxrt_holder != tskid)
101 static inline void _toppers_cxxrt_recursive_semaphore_unlock(ID semid)
103 if (iniflg && !sns_dsp())
105 if (--cxxrt_counter == 0)
115 * For function call once
117 int _toppers_cxxrt_once(_toppers_cxxrt_once_t *once, void (*func)(void))
121 static _toppers_cxxrt_sync_t sync;
123 _toppers_cxxrt_recursive_semaphore_lock(_CXXRT_SEM);
129 _toppers_cxxrt_recursive_semaphore_unlock(_CXXRT_SEM);
136 * For task-local storage
138 #ifndef CXXRT_KEY_MAX
139 #define CXXRT_KEY_MAX 2
142 struct _toppers_cxxrt_tls
148 extern const ID tmax_tskid;
150 static void **tls_data[CXXRT_KEY_MAX];
151 static struct _toppers_cxxrt_tls tls[CXXRT_KEY_MAX];
153 int _toppers_cxxrt_key_create(struct _toppers_cxxrt_tls **key, void (*dtor)(void*))
155 struct _toppers_cxxrt_tls *p;
157 for (p = &tls[0]; p < &tls[CXXRT_KEY_MAX]; p++)
161 p->data = tls_data[p - &tls[0]];
170 int _toppers_cxxrt_key_delete(struct _toppers_cxxrt_tls *key)
174 for (i = 0; i <= tmax_tskid; i++)
177 (*key->dtor)(key->data[i]);
184 /* JSP 1.4との互換性のために_toppers_cxxrt_reset_specificを残しておく */
185 void _toppers_cxxrt_reset_specific(void)
189 void _toppers_cxxrt_init(void)
191 int i, tmax = tmax_tskid + 1;
192 void **p = (void**)malloc(sizeof(void*) * CXXRT_KEY_MAX * tmax);
194 for (i = 0; i < CXXRT_KEY_MAX * tmax; i++)
196 for (i = 0; i < CXXRT_KEY_MAX; i++)
197 tls_data[i] = p + i * tmax;