blob: 11efa085f9019e22c9afcb9af7179dcb0652a6c9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 fortiss GmbH
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Jose Cabral - initial API and implementation and/or initial documentation
* Alois Zoitl - adapted architecture class for generic use
*******************************************************************************/
#include "../forte_architecture.h"
#include "forteinit.h"
#include "rcXSocketInterface.h"
//this keeps away a lot of rtti and exception handling stuff
extern "C" void __cxa_pure_virtual(void){
//TODO maybe add some reporting here
//Although we should never get here
//if we are here something very very bad has happened e.g., stack overflow or other memory corruption
}
void *__dso_handle = 0;
extern "C" int _getpid(void) {
return 1;
}
extern "C" void _kill(int ) { while(1) ; }
extern "C" int _exit() { return 0; }
bool CForteArchitecture::mInitialized = false;
typedef void (*func_ptr)(void);
extern func_ptr _init_array_start_forte[0], _init_array_end_forte[0];
extern func_ptr _fini_array_start_forte[0], _fini_array_end_forte[0];
void initialize_constructors(void)
{
func_ptr* func;
for ( func = _init_array_start_forte; func != _init_array_end_forte; func++ )
(*func)();
}
void initialize_destructors(void)
{
func_ptr* func;
for ( func = _fini_array_start_forte; func != _fini_array_end_forte; func++ )
(*func)();
}
/*func_ptr _init_array_start_forte[0] __attribute__ ((used, section(".init_array"), aligned(sizeof(func_ptr)))) = { };
func_ptr _fini_array_star_fortet[0] __attribute__ ((used, section(".fini_array"), aligned(sizeof(func_ptr)))) = { };*/
bool CForteArchitecture::initialize(){
if (!mInitialized){
initialize_constructors();
initForte();
CrcXSocketInterface::getInstance();
mInitialized = true;
}
return true;
}
void CForteArchitecture::deinitialize(){
if(mInitialized){
initialize_destructors(); //TODO: is it really necessary? When called, _fini_array_start_forte == _fini_array_end_forte, so no function is actually called
mInitialized = false;
}
}