/******************************************************************************* | |
* 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; | |
} | |
} |