163 lines
4.3 KiB
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);
|
||
|
}
|