libc/newlib/libc/sys/rdos/rdoshelp.c

163 lines
4.3 KiB
C

/*#######################################################################
# 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 <reent.h>
#include <rdos.h>
#include <stdio.h>
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);
}