
         TOPPERS/JSPͥ 桼ޥ˥奢 
                    C++Хǥ󥰡

        Release 1.4.1 бǽ: 16-Sep-2004

------------------------------------------------------------------------
 TOPPERS/JSP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile Kernel

 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN
 Copyright (C) 2003-2004 by Takagi Nobuhisa

 嵭Ԥϡʲ (1)(4) ξ狼Free Software Foundation 
 ˤäƸɽƤ GNU General Public License  Version 2 ˵
 ҤƤ˸¤ꡤܥեȥܥեȥ
 ѤΤޤࡥʲƱˤѡʣѡۡʰʲ
 ѤȸƤ֡ˤ뤳Ȥ̵ǵ롥
 (1) ܥեȥ򥽡ɤηѤˤϡ嵭
     ɽѾ浪Ӳ̵ݾڵ꤬Τޤޤηǥ
     ˴ޤޤƤ뤳ȡ
 (2) ܥեȥ򡤥饤֥ʤɡ¾Υեȥȯ˻
     ѤǤǺۤˤϡۤȼɥȡ
     ԥޥ˥奢ʤɡˤˡ嵭ɽѾ浪Ӳ
     ̵ݾڵǺܤ뤳ȡ
 (3) ܥեȥ򡤵Ȥ߹ʤɡ¾Υեȥȯ˻
     ѤǤʤǺۤˤϡΤ줫ξ
     ȡ
   (a) ۤȼɥȡѼԥޥ˥奢ʤɡˤˡ嵭
       ɽѾ浪Ӳ̵ݾڵǺܤ뤳ȡ
   (b) ۤη֤̤ˡˤäơTOPPERSץȤ
       𤹤뤳ȡ
 (4) ܥեȥѤˤľŪޤϴŪ뤤ʤ»
     ⡤嵭ԤTOPPERSץȤդ뤳ȡ

 ܥեȥϡ̵ݾڤ󶡤ƤΤǤ롥嵭Ԥ
 TOPPERSץȤϡܥեȥ˴ؤơŬѲǽ
 ޤơʤݾڤԤʤޤܥեȥѤˤľ
 ŪޤϴŪʤ»˴ؤƤ⡤Ǥʤ
------------------------------------------------------------------------

C++Хǥ󥰤γ

1.1 Ū

TOPPERS/JSPͥϡCAPI󶡤ΤǤꡢΤޤޤǤ
C++ѤץꥱȯԤǻپ㤬롣
C++Хǥ󥰤ϡTOPPERS/JSPͥ뤬󶡤륵ӥC++
ƽФȤǽˤTOPPERS/JSPͥɸC++εǽ
ѤǤ褦ˤΤǤ롣

1.2 ȯĶȼ¹ԴĶ

C++Хǥ󥰤ǤϡGCCGNUȯĶѤ롣ʤWindows
Υߥ졼ĶVisual C++ˤC++ѤݤϡC++Х
󥰤εǽɬפȤʤ

ߡC++Хǥ󥰤ݡȤ¹ԴĶϡMS7727CP01(SH3)
AKI-H8/3069FǤ롣¾μ¹ԴĶǻѤˤϡåȰ¸
Makefile.configӥ󥫥ץȤνɬפȤʤ롣
ޤLinuxΥߥ졼ĶǤϻѤ뤳ȤǤʤ

1.3 C++Хǥ󥰤εǽγ

ɸC++εǽΤ¹ԴĶ˰¸ʬˤĤơTOPPERS/JSP
ͥбƤ롣Ūˤϡ륪֥Ȥν
λХnew黻Ҥdelete黻ҡ㳰ӥե꡼
ǥ󥰴Ķˤɸ饤֥ؿǤ롣

GCCΤ̤ݡȤεǽexport˥Сʸ̾ˤ䴰
ΤǤϤʤ

1.4 C++Хǥ󥰤λˡ

TOPPERS/JSPͥC++Хǥ󥰤Ѥˤϡե
ե.cfgˤ顢jsp/systask/cxxrt.cfg򥤥󥯥롼ɤ
Ǥ褤ŪAPIINCLUDEǤϤʤץץå#include
Ѥ뤳ȡ

TOPPERS/JSPͥconfigureѤ硢C++Ȥˤ"-l c++"
ץղäɬפ롣


C++Хǥ󥰤εǽ

2.1 륪֥Ȥν

ؿγ줿֥ȡ֤̾䥯饹Ūǡ
ФޤˤΥ󥹥ȥ饯򡢵ư˸ƽФǽ󶡤롣

륪֥ȤΥ󥹥ȥ饯ϡkernel_startؿθƽФ
˼¹Ԥ졢syslogεǽѤ뤳ȤϤǤʤ
ޤ󥹥ȥ饯Ǥϡvsns_iniӥƽФ
ȤϤǤʤ

ؿ줿֥ȤϡưǤϤʤ줿ս
˺ǽ˼¹ԥѥݤäȤ˥󥹥ȥ饯ƽФ뤿ᡢ
ưνˤϴޤޤʤ
󥹥ȥ饯θƽФϥޥбʤᡢ桼
ɬפ˱¾ȼ˹Ԥɬפ롣

2.2 λ

Ūʥ֥ȡʴؿ줿ΤޤˤΥǥȥ饯ϡ
std::exitؿ椫ƽФ롣Ūstd::exitؿƽФʤ
ꡢλȤƤǥȥ饯ƽФ뤳ȤϤʤ
ʤkernel_exitؿƽФ⡢std::exitؿƽФ
ƱͤˡŪʥ֥ȤΥǥȥ饯ϸƽФ롣

λưϡŪAPIVATT_TERϿλ롼󤬸ƽ
줿塢std::atexitؿϿλؿƽФ졢Ǹ˥ǥ
饯ƽФ롣
ǥեȤɸॹȥ꡼stdin, stdout, stderrˤ򥵥ݡȤ硢
Υϥǥȥ饯θƽФ˹ԤʤФʤʤ
ʥ桼μǥޥɬפ

2.3 Хnew黻Ҥdelete黻

TOPPERS/JSPͥΥޥĶޥĶʽ
ޤϽλˤưnewdelete黻Ҥ󶡤롣
GCCϥХnewdelete黻Ҥstd::mallocstd:freeؿ
ѤƼƤ뤿ᡢNEWLIBmallocfreeؿ¾
ä뤳ȤǼ¸Ƥ롣

C++Хǥ󥰤ϡC++Υե꡼ǥ󥰴ĶоݤȤƤ뤬
嵭ͳˤꡢե꡼ǥ󥰴ĶǤϥݡȤʤ
std::mallocstd::freeؿŪ˥ݡȤƤ롣
餯std::callocstd::reallocؿưȻפ뤬
ڤϹԤäƤʤ

ɸC++ΥХnewdelete黻Ҥˤϡ㳰򥹥뤳
ʤconst std::nothrow_t&ˤȤֹʸΤΤ⤢뤬
ΤƱͤ˻Ѥ뤳ȤǤ롣

2.4 㳰

C++θ쵡ǽǤ㳰ǽtrycatchthrowˤ󶡤롣
㳰ϥѥμ̩ܤिᡢѥ鼫Τ˥ѥå
ɬפˤʤ롣

㳰ϡtrycatchΰ֤ȡthrowcatchޤǤδ֤¸ߤ
륪֥ȤΥǥȥ饯ɬפ롣äơ
ѥˤȤä̤ΤˡǥƥȤڤؤäˤϡ
Ѥδڤؤɬפ롣
C++Хǥ󥰤ϡޥĶޥĶʽ
ޤϽλˤǡƥȤ˱ƴڤؤ뵡ǽ
Ʊǽ¸Ƥ롣

GCCǤϡѥ-fno-exceptionsץꤹ뤳Ȥǡ
̵ˤ뤳ȤǤ뤬ϥץꤷñ
ФƤΤѤ뤳ȤǤꡢ饤֥ϡ̤̾ꡢ㳰
ȤƱͤ˿񤦤Ȥˤʤ롣äơnewdynamic_cast
뤤typeid黻ҤԤˤϡͽ̸ưˤĤʤ
뤿ᡢɬ侩ʤ

2.5 ɸ饤֥ؿ

ե꡼ǥ󥰴ĶC++Ǥϡλ˴ؤɸ饤֥ؿ
Ȥơstd::abortstd::atexitstd::exitؿݡȤ롣
C++Хǥ󥰤Ǥ⡢3δؿ󶡤Ƥ롣

(1) std::abort

std::abortؿϡŪAPIVATT_TERϿ줿λ롼䡢
std::atexitؿϿ줿λؿ֥ȤΥǥȥ饯
ФȤʤƥ۾ｪλ롣
ƥνλϡޥưϥåȰ¸
kernel_abortؿ˽ޥưʽޤϽλ
NEWLIB_exitؿ˽

C++Хǥ󥰤ǤϡؿؤΥݥvoid (*_atabort)(void)0ʳ
Ƥ硢ºݤνλˤƽФ褦ˤʤä
롣
ۥȴĶstd::abortϡºݤνλstd::raise(SIGABRT);
ƽФ_atabortŬڤꤹ뤳ȤƱͤεǽ򥨥ߥ졼Ȥ
ȤǤ롣

(2) std::atexit

std::atexitؿϡstd::exitޤkernel_exitؿƽФ뽪λ
ؿϿ롣std::atexitؿϿؿϡstd::abortؿǽλ
䡢vsns_iniTRUE֤֤std::exitؿѤˤϡ
ƽФ뤳Ȥʤ

Ūʥ֥ȤΥǥȥ饯ϡºݤˤstd::atexitؿѤ뤳
ȤǼ¸Ƥ롣ǥȥ饯θƽФϡstd::atexitؿ
Ͽ줿¾Τʤ뽪λؿ˸ƽФ롣

std::atexitؿϿǤ뽪λؿϡʥǥȥ饯Ͽơ
32ĤޤǤǤ롣

(3) std::exit

std::exitؿϡC++ɸŪʽλԤܺ٤ưϡ2.2 λ
򻲾ȤΤȡ

std::exitؿѤƽλ硢륪֥ȤΥǥȥ饯
ƽФ뤳ȤϤʤ


C++¹ԴĶȤƤTOPPERS/JSPͥ

3.1 BOOL

ɸC++ˤϡǤboolȡͤǤtruefalse¸
롣TOPPERS/JSPͥ뤬CǼƤ뤿ᡢ
θߴȤ̣ǤBOOLˤintѤɬפ롣
ͥΥѥC99ѤǤ⡢_Boolboolδ֤ˤϡ
̩ʸߴȤϸᡢϤintѤ̵
롣

3.2 㳰꡼

Υȥؿ饭åʤ㳰꡼ư
̤Ǥ롣

3.3 ATT_INIVATT_TER

ŪAPIATT_INIVATT_TERϿ줿ؿ㳰꡼
ư̤Ǥ롣

3.4 󥿥ƥȤȥ㳰롼

󥿥ƥȤȥ㳰롼Ǥϡ㳰new
delete黻ҤѤ뤳ȤǤʤȷФdynamic_cast䡢
۴ؿĥ饹ؤλȤݥ󥿤Фtypeid⡢㳰ȯ
ǽ뤿ᡢѤ뤳ȤǤʤޤɸ饤֥ؿ
ƽФȤǤʤ

ʤ㳰ľ֤ǼФras_texˤäƸƽФ줿
㳰롼˸¤ꡢ嵭ϼʤ㳰
롼󤫤㳰꡼ư̤Ǥ롣

3.5 ӥ㳰

TOPPERS/JSPͥ뤬󶡤ӥ㳰򥹥뤳Ȥ
ʤᡢ㳰throw()ղä롣
ˤꡢ㳰ΤΥơ֥뤬뤳ȤǾ¤ޤ
礬ꡢȤƶָΨθ夬ԤǤ롣


ȯĶι

C++ȯĶιۤϡŪˤϡGNUȯĶۥޥ˥奢פƤ
ۤʤΤǡ濴˲⤹롣
ʤưǧˤϡۥȴĶȤƤCygwin 1.3.22Ѥ

4.1 ɬפʥեȥ

C++ȯĶۤˤϡGCC-COREG++ޤGCCɬפˤʤ롣
ޤNEWLIBɬܤǤ롣

    GNUȯĶ
       BINUTILSʥ֥顤󥫤ʤɡ
       GCCC/C++ѥ
       GDBʥǥХå
    NEWLIBɸC饤֥
    Perlưǧ 5.8.0
    GNU Makeưǧ 3.80
    GNU sedưǧ 4.0.7
    patchưǧ 2.5.8

4.2 BINUTILSΥ󥹥ȡ

BINUTILSϡGCCΥ󥹥ȡɬפʤᡤGCCäƥ󥹥ȡ
롣BINUTILSΥ󥹥ȡϼ̤ꡣ

    % mkdir <BINUTILS-OBJDIR>
    % cd <BINUTILS-OBJDIR>
    % <BINUTILS-SRCDIR>/configure --target=<TARGET> --prefix=<PREFIX>\
      --disable-nls
    % make
    % make install

4.3 GCCؤΥѥå

CygwinGCC 3.2.3make˰㳲ȯ뤿ᡢΥѥå
ɬפȤʤ롣SHǤΤߡGCC 3.3.xʹߤǤס

    % cp gcc-3.2.3_fixinc_gnu-regex.patch <GCC-SRCDIR>
    % cd <GCC-SRCDIR>
    % patch -p1 < gcc-3.2.3_fixinc_gnu-regex.patch

ʲμ˽äơGCCTOPPERS/JSPͥб뤿Υѥå
򤢤Ƥ롣

    % cp gcc-3.2.3_gthr-toppers-1.patch <GCC-SRCDIR>
    % cd <GCC-SRCDIR>
    % patch -p1 < gcc-3.2.3_gthr-toppers-1.patch

4.4 GCCΥ󥹥ȡ(1)

GCCΥ󥹥ȡˤNEWLIBɬפǤ뤬NEWLIB򥤥󥹥ȡ뤹
GCCɬפʤᡢ㴳ιפɬפˤʤ롣

    % mkdir <GCC-OBJDIR>
    % cd <GCC-OBJDIR>
    % <GCC-SRCDIR>/configure --target=<TARGET> --prefix=<PREFIX>\
      --enable-languages=c,c++ --enable-threads=toppers\
      --disable-nls
    % make all-gcc
    % make install-host

4.5 NEWLIBΥ󥹥ȡ

μ˽äơNEWLIB򥤥󥹥ȡ뤹롥

    % mkdir <NEWLIB-OBJDIR>
    % cd <NEWLIB-OBJDIR>
    % <NEWLIB-SRCDIR>/configure --target=<TARGET> --prefix=<PREFIX>
    % make
    % make install

ʤCygwinΥСˤäƤNEWLIBΥ󥹥ȡ˼Ԥ
롣Τ褦ʾϡCygwinΥСѹ뤫NEWLIB
ʥꤹ뤳ȡ

4.6 GCCΥ󥹥ȡ(2)

μ˽äơGCCλĤʬ򥤥󥹥ȡ뤹롥

    % cd <GCC-OBJDIR>
    % make
    % make install


C++Хǥ󥰤μܺ

5.1 ե빽

(1) cxxrt.cfg

cxxrt.cfgC++б󥿥ǻѤ륪֥Ȥ롣
C++εǽѤˤϡɬե졼ե뤫顢
cxxrt.cfg򥤥󥯥롼ɤɬפ롣

(2) cxxrt.c

cxxrt.cC++б󥿥ΤǤꡢ㳰ɬפȤʤؿ
ѿԤ롣

(3) newlibrt.c

newlibrt.cNEWLIBδؿTOPPERS/JSPͥб뤿Υ
ǤꡢC++ѤˤɬܤǤ롣
Υ󥿥ϡC++ѤʤǤ⡢NEWLIBѤݤˤñ
ǻѤ뤳ȤǤ롣

5.2 Ʊǽ

㳰ɸC++饤֥ǻѤƱǽ󶡤ؿ
ɸC++饤֥ϥե꡼ǥ󥰴ĶǤϥݡȤʤ
餯libstdc++ǽѤ뤳ȤǤȻפ롣ʤư
ϳǧƤʤ

(1) int _toppers_cxxrt_lock(_toppers_cxxrt_sync_t *sync);

ޥưǤϡåݤƥ륻򳫻Ϥ
롣ޥưˤϲ⤷ʤ
ˤ0֤Իˤ֤ͤ

δؿϥͥƥ󥰲ǽǤ롣

(2) int _toppers_cxxrt_trylock(_toppers_cxxrt_sync_t *sync);

_toppers_cxxrt_lockؿȤۤƱǤ뤬¾Υˤäƥå
ξǤԵ֤ˤϰܹԤñ˸ƽФ˼Ԥ롣
ߤμǤϡ_toppers_cxxrt_lockؿϥǥѥåػߤѤƼ¸
Ƥ뤿ᡢɤƱǤ롣

(3) int _toppers_cxxrt_unlock(_toppers_cxxrt_sync_t *sync);

ޥưǤϡåƥ륻λ
롣ޥưˤϲ⤷ʤ
ˤ0֤Իˤ֤ͤ

(4) int _toppers_cxxrt_once(_toppers_cxxrt_once_t *once,
                          void (*func)(void));

ꤷؿ򡢥ƥΤǰ٤¹Ԥ롣func¹ˡ
ʤ륿ǤƱؿ¹Ԥ褦Ȥ硢funcμ¹Ԥλ
ޤԵ֤˰ܹԤ롣
ˤ0֤Իˤ֤ͤ

5.3 뵭赡ǽ

ȤѰդ롢Ūʵ󶡤ؿǤꡢ
㳰ǻѤ롣
뵭ȤƳݤǤΤϡǥեȤǤ2ĤޤǤǤ
_CXXRT_KEY_MAXޥ桼뤳Ȥǡ3İʾ˳ĥ뤳
Ǥ롣

(1) int _toppers_cxxrt_key_create(struct _toppers_cxxrt_tls **key,
                                void (*dtor)(void*))

뵭˳ݤѿ򿷵롣
ˤ0֤*keyѿ̤뤿ΥǼ롣
dtorˤϡݤˡȤγѿФƼ¹Ԥ٤
λꤹ롣
Իˤ֤ͤ

(2) int _toppers_cxxrt_key_delete(struct _toppers_cxxrt_tls *key);

_toppers_cxxrt_key_createؿǺ롣
ˤ0֤Իˤ֤ͤ

5.4 NEWLIBΥޥ

(1) void __malloc_lock(struct _reent *ptr);

mallocfree¾Ԥ¾ΥˤäƥåƤ
ǸƽФ줿Ե֤˰ܹԤ롣

(2) void __malloc_unlock(struct _reent *ptr);

__malloc_lockؿˤå롣

(3) void *_sbrk_r(struct _reent *ptr, ptrdiff_t nbytes);

ץΥҡΰnbyte礹롣ˤϡΰ
ƬؤΥݥ󥿤֤Ի֤ͤerrnoptr->_errno
ENOMEMꤹ롣

ҡΰˤϡ̻end.bssνüˤ顢ޥ
ưΥåݥ󥿤ޤǤѤ롣
ޥå׾塢ʣΥꥤ᡼ȯ륿åȤǤϡ.bss
ȥåݥ󥿤νͤƱ쥤᡼֤ɬפ
롣
ҡΰȵưΥåΰ褬Ϣ³Ƥʤ硢sys_config.h
HEAP_TOPޥҡפνüɥ쥹ɬפ롣

ǤС_sbrk_rؿθϴؿˤ_sbrkؿ򥫥ޥ
٤Ǥ뤬åȤˤäƤϡ_writeؿƱñ̤˥
ꥸʥ_sbrkؿƤꡢ󥯻˾㳲ȯ븶Ȥ
뤿ᡢ_sbrk_rؿ򥫥ޥƤ롣

5.5 ¾

(1) int main();

JSPͥưC/C++ץϥե꡼ǥ󥰴ĶǤ
뤿ᡢȥؿmainǤϤʤkernel_startǤ롣NEWLIB
ǤϥȥݥȤȤmainѤ뤳ȤԤƤ뤿ᡢ
mainؿʤХ󥯥顼ˤʤ礬롣
C++б󥿥Ǥϡ󥯤褹뤳ȤΤߤŪȤmainؿ
롣


åȰ¸μ

ߡC++Хǥ󥰤ݡȤ¹ԴĶϡMS7727CP01(SH3)
AKI-H8/3069FǤ롣
ޤGNUȯĶΥåȤȤơSHѤˤsh-hitachi-elfH8Ѥˤ
h8300-hmsѤƤ롣

6.1 GNUȯĶ˴ؤ

GNUȯĶ̤˴ؤǤȤơʲΤΤ롣

(1) 󥫥ץȤб

C++ѤΥ󥫥ץȤˤϡ.ctor.dtorʤ
Хʥ󥹥ȥ饯ǥȥ饯Υݥ󥿥ơ֥뤿
ΥɬפǤ롣
ޤ.eh_frame.gcc_except_tableʤɤ㳰ѤΥ
ɬפˤʤ롣

6.2 ELF˴Ϣ

SH˸¤餺ELF˰¸ǤȤơƤбɬפǤ롣

(1) crti.o, crtbegin.o, crtend.o, crtn.oΥ

Хʥ󥹥ȥ饯ӥǥȥ饯θƽФ䡢㳰Ϣ
ɬפʤᡢΥեǥ󥯤ɬפ롣
󥯤νϡ

start.o crti.o crtbegin.o 桼ץ libkernel.a libstdc++.a
libm.a libc.a libgcc.a crtend.o crtn.o

Ǥ롣
λˤϡåȰ¸config/sh3/Makefile.configˤơ

START_OBJS = \
	start.o \
	$(shell $(CC) $(COPTS) -print-file-name=crti.o | sed -e 's/\\/\//g') \
	$(shell $(CC) $(COPTS) -print-file-name=crtbegin.o | sed -e 's/\\/\//g')
END_OBJS   = \
	$(shell $(CC) $(COPTS) -print-file-name=crtend.o | sed -e 's/\\/\//g') \
	$(shell $(CC) $(COPTS) -print-file-name=crtn.o | sed -e 's/\\/\//g')

Τ褦Ƥ롣
ʤʸ'\''/'ִƤΤϡMinGW + MSysδĶǻѤǤ
褦ˤ뤿Ǥ롣
ޤmake˸äcrti.oʤɤΥѥߤ褦Ȥ뤳Ȥ
ŪǡSTART_OBJSEND_OBJSʤstart.oˤmake롼ò
Ƥ롣

(2) 󥫥ץȤб

.init.finiELFͭΥɬפǤ롣

6.3 SHͭΤ

åȤSHξͭǤȤơʲΤΤ롣

(1) _initؿ_finiؿ

GCC¿ΥåȤǤϡELFξ硢ؿӽλؿ
Ȥơ_initؿ_finiؿѤ롣SHξˤinitؿ
finiؿƬβʤˤѤƤ롣Τᡢtool_defs.h
ˤơinitfiniˤ줾ޥִƤ롣


ץꥱˤҥ

7.1 Ūʥ֥

Ūʥ֥Ȥ̤뤳ȤǤ뤬ʲդ
ɬפ롣

(1) ͥư

Хʥ󥹥ȥ饯ǥȥ饯ϡͥư֤Ǹƽ
롣äơδؿǤϡITRONΥӥƽ
ȤϽʤͣƽФȤ륵ӥϡJSPͥ
ȼĥǤvsns_iniǤ롣

饹򥰥ХǤǤȤ褦ˤˤϡɬפ˱ơ
vsns_iniǥͥư֤Ƚ̤֤˱ƽʬɬפ
롣

(2) ؿŪ֥

ؿ줿Ū֥ȤΥ󥹥ȥ饯ϡɬⵯư
˸ƽФǤϤʤ¹ԥѥǽˤΥ֥Ȥս
ݤäǸƽФ롣
äơ󥹥ȥ饯ͥư֤ǸƽФ뤫ư
֤ǸƽФ뤫ϡΥ֥Ȥ줿ؿǽ˸ƽФ
륿ߥ󥰤˰¸롣

Ūˡ򤹤ˤDouble-Checked LockingȸƤФˡ
Ѥ롣

class foo
{
  // 饹
};

void func()
{
  static foo* ptr = 0;
  if (ptr == 0)
  {
    wai_sem(SEMID);
    if (ptr == 0)
    {
      static foo x;
      ptr = &x;
    }
    sig_sem(SEMID);
  }
  // ؿΤν
}

(3) ƥλ

ǥȥ饯Ǥϡƥ¤ʤѤ뤳ȤǤ뤬
Хʥ󥹥ȥ饯ǤϡǥեȤǤϥƥѤ뤳
Ǥʤ

7.2 new黻Ҥdelete黻

(1) ¾ˤĤ

new黻Ҥdelete黻Ҥϡ®٤夹뤿ᡢե꡼ȥ
դstd::mallocؿѤƼˤϥǥѥåػ߾֤ǹ
äƤ롣
ץꥱ׵ˤäơ¾ˡ¾Ԥɬפ
ˤϡsystask/cxxrt.c__malloc_lockؿ__malloc_unlockؿ
ޥФ褤

(2) Ѥ˴ؤ

󥿥ƥȤ䥿㳰롼ǸƽФȤϤǤʤ
ͥư֡vsns_iniؿTRUE֤֡ˤǤϡ̤̾
뤳ȤǤ롣

(3) СɤˤĤ

Хnew黻Ҥdelete黻Ҥϡ¹ԸΨϤޤޤǤ뤬
ָΨϷ褷ƹ⤤ȤϤʤޤΥ饹κˤĤ
Ƥɾˤᡢ̩ưݾڤɬפȤ륯饹˴ؤƤϡnew
黻Ҥdelete黻Ҥ򥪡Сɤ뤳Ȥ侩롣

Сɤ˺ݤƤϡĹסѤ뤳Ȥ롣
㤨СʲΤ褦˥饹뤳Ȥ롣

#include <t_services.h>
#include <cstddef>
#include "kernel_id.h"

class foo
{
  static ID mpfid_;
public:
  static void* operator new(std::size_t size) throw()
  {
    VP ptr;
    get_mpf(mpfid_, &ptr);
    assert(ptr != 0);
    return ptr;
  }
  static void operator delete(void* ptr) throw()
  {
    rel_mpf(mpfid_, ptr);
  }
};

static ID foo::mpfid_ = FOO_MPF;	// ĹסIDֹ

ޤnew黻ҤֹʸѤ뤳ȤǡॢȻεǽ
ɲä뤳ȤǽǤ롣

static void* operator new(std::size_t size, TMO tmout);
static void operator delete(void* ptr, TMO) throw();

ʤnew黻Ҥ򥪡Сɤ硢ɬбdelete黻Ҥ
碌ƥСɤʤФʤʤ
嵭ξ硢delete黻ҤTMOΰѤ뤳ȤϤʤnew
饹Υ󥹥ȥ饯㳰줿new黻ҤΤ
ǤϤʤˡбdelete黻Ҥɬפˤʤ롣

7.3 㳰

(1) 㳰

GCCǤϡconfigure--enable-sjlj-exceptionsꤷ硢㳰
¸뤿setjmplongjmpؿѤƤ롣åȤ
äƤ¾μ¸ˡ򤹤뤳ȤǤ뤬ưǧϹԤäƤʤ

㳰TΥ֥Ȥthrow硢Ūˤϰʲνǽ
Ԥ롣

	1) std::mallocؿˤꡢTΥ֥ȤǼǽʥ֥
	   åդ롣
	   դ˼Ԥ硢۵ѤŪʥХåեƤ롣

	2) TΥԡ󥹥ȥ饯ƽФ졢throw줿֥Ȥ
	   ԡ1)ǳդ֥åѤ롣
	   ԡ󥹥ȥ饯㳰throw줿std::terminate
	   ؿƽФ줿塢std::abortؿˤ۾ｪλ롣

	3) 㳰ե졼򸡺catchޤǤηϩ¸ߤ
	   ʥ֥ȤΥǥȥ饯ƽФ롣
	   ǡǥȥ饯㳰throw줿std::terminate
	   ؿƽФ줿塢std::abortؿˤ۾ｪλ롣

	4) TʤޤϤδ쥯饹ˤбcatch֥åĤä
	   ϡΥ֥å˹ʬ롣catch֥åΥѥ᡼
	   Ϥξ硢ԡ󥹥ȥ饯ˤäƿʥ
	   ֥Ȥ롣
	   бcatch֥åĤʤäϤκݤ㳰
	   throw줿std::terminateؿƽФ줿塢std::abort
	   ؿˤ۾ｪλ롣

	5) catch֥åν¹Ԥ롣

	6) 嵭2)줿֥ȤΥǥȥ饯ƽФ롣

(2) Ƶưν

JSP 1.4ǤϺƵưνȤ_toppers_cxxrt_reset_specific
ƤӽФɬפäJSP 1.4.1Ǥ_toppers_cxxrt_reset_specific
ؿθƤӽФɬפȤʤ
ꡢΥȥؿ㳰ưư̤
Ǥ롣

(3) Ψθ

configure--enable-sjlj-exceptionsꤷ硢㳰throw
Ǥ⡢㴳μ¹ԸΨ㲼롣ޤָΨ㲼
礬롣
Ψ򾯤ǤˤϡʲˡͭǤ롣

	1) Ǥ饤ؿѤ롣㳰˴ؤ륪С
	   åɤ¿ϡؿθƽФտ路ȯ롣

	2) 褷㳰ȯʤؿˤϡɬ㳰throw()ղä롣
	   äˡCǼ줿ؿϡɬthrow()դ뤳ȡ

	3) 㳰ȯ뤫⤷ʤؿˤ㳰դʤ
	   㳰դȥե륿󥰽ŪŸ롣

	4) ǽʸ¤ǥȥ饯ʤ
	   ؿǥǥȥ饯ĥʥ֥ȤȤʤС
	   㳰throw뤫⤷ʤؿƤǤ⡢Сإåɤˤ
	   ʤ礬롣

	5) ֥Ȥ򤱤
	   ֥Ϥ켫ΤСإåɤǤǤʤ
	   󥹥ȥ饯㳰ȯ뵡ꡢޤǥȥ饯
	   ӽФ뵡䤹

7.4 CȤκ

C++CؿƽФ硢extern "C"ˤ"C"󥱡
Ǥ뤳ȤŪ˻ꤷʤФʤʤ

extern "C" int foo();

extern "C" {
  void hoge();
  void bar();
}

ޤC줫ƽФǽΤؿC++extern "C"
ؿղäɬפ롣

CC++ǤϸߴΤʤ⤢뤿ᡢξѤؿˡ
Ѥ٤ǤϤʤ㤨Сbool䥯饹ʤɤǤ롣
äˡkernel_cfg.cCǤ뤿ᡢγĥ˥饹Υݥ
󥿤ꤹ뤳ȤϤǤʤ

CؿC++ؿθƽФϡ§ȤƹԤ٤ǤϤʤ㳰
ȯ硢ưݾڤǤʤΤͳǤ롣
̾θƽФ¾ХåؿѤ㳰ǤϤʤ

C++ؿCؿƽФ硢Cؿˤ㳰throw()ղä٤
롣뤳Ȥ˸Ψθ夬ԤǤ롣

ʾ

