/*####################################################################### # RDOS operating system # Copyright (C) 1988-2006, Leif Ekblad # # This library is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # The author of this program may be contacted at leif@rdos.net # # rdoshelp.c # implementation of various structures and helpers # ##########################################################################*/ #include #include #include char *__env[1] = { 0 }; char **environ = __env; static int once_section; static int key_section; /*########################################################################## # # Name : _get_impure_data_size # # Purpose....: Get size of _reent structure # # In params..: * # Out params.: * # Returns....: size # ##########################################################################*/ int get_impure_data_size() { return sizeof(struct _reent); } /*########################################################################## # # Name : __rdos_thread_once # # Purpose....: Emulate GCC pthread_once # # In params..: Handle initially 0 # : function to initially call # Out params.: * # Returns....: result # ##########################################################################*/ int __rdos_thread_once (int *handle, void (*func) (void)) { if (handle == 0 || func == 0) return 0; RdosEnterSection(once_section); if (*handle == 0) (*func)(); else *handle = 1; RdosLeaveSection(once_section); return 0; } /*########################################################################## # # Name : __rdos_thread_mutex_init # # Purpose....: Emulate GCC pthread_thread_mutex_init # # In params..: * # Out params.: * # Returns....: handle # ##########################################################################*/ int __rdos_thread_mutex_init (void) { return RdosCreateSection(); } /*########################################################################## # # Name : __rdos_thread_mutex_lock # # Purpose....: Emulate GCC pthread_thread_mutex_lock # # In params..: handle # Out params.: * # Returns....: * # ##########################################################################*/ int __rdos_thread_mutex_lock (int handle) { RdosEnterSection(handle); return 0; } /*########################################################################## # # Name : __rdos_thread_mutex_trylock # # Purpose....: Emulate GCC pthread_thread_mutex_trylock # Try is not yet implemented, and lock is used. # # In params..: handle # Out params.: * # Returns....: * # ##########################################################################*/ int __rdos_thread_mutex_trylock (int handle) { RdosEnterSection(handle); return 0; } /*########################################################################## # # Name : __rdos_thread_mutex_unlock # # Purpose....: Emulate GCC pthread_thread_mutex_unlock # # In params..: handle # Out params.: * # Returns....: * # ##########################################################################*/ int __rdos_thread_mutex_unlock (int handle) { RdosLeaveSection(handle); return 0; } /*########################################################################## # # Name : __init_rdos # # Purpose....: Init RDOS specific data # # In params..: reent structure # Out params.: * # Returns....: * # ##########################################################################*/ void __init_rdos(struct _reent *reent) { once_section = RdosCreateSection(); _REENT_INIT_PTR(reent); __sinit(reent); }