1
0
Fork 0
forked from len0rd/rockbox

Make errno a thread-local variable.

errno is supposed to be thread local and we do that here in a rather
makeshift way by implementing a function that returns a pointer to
the __errno variable in the thread block.

If more serious TLS is required, perhaps it would be worthwhile
implementing it using the linker and the "__thread" storage attribute.
That's a bit overkill just for this. I'm also not liking what I saw
the compiler producing.

Change-Id: I03bc0bd6a89f6e3d6bae7653284ee01054614f9a
Reviewed-on: http://gerrit.rockbox.org/803
Reviewed-by: Michael Sevakis <jethead71@rockbox.org>
Tested: Michael Sevakis <jethead71@rockbox.org>
This commit is contained in:
Michael Sevakis 2014-04-28 09:15:06 -04:00
parent f444ae70eb
commit 355b5406fa
5 changed files with 14 additions and 7 deletions

View file

@ -684,7 +684,7 @@ static const struct plugin_api rockbox_api = {
/* misc */ /* misc */
#if (CONFIG_PLATFORM & PLATFORM_NATIVE) #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
&errno, __errno,
#endif #endif
srand, srand,
rand, rand,

View file

@ -160,12 +160,12 @@ void* plugin_get_buffer(size_t *buffer_size);
#define PLUGIN_MAGIC 0x526F634B /* RocK */ #define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */ /* increase this every time the api struct changes */
#define PLUGIN_API_VERSION 229 #define PLUGIN_API_VERSION 230
/* update this to latest version if a change to the api struct breaks /* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */ new function which are "waiting" at the end of the function table) */
#define PLUGIN_MIN_API_VERSION 228 #define PLUGIN_MIN_API_VERSION 230
/* plugin return codes */ /* plugin return codes */
/* internal returns start at 0x100 to make exit(1..255) work */ /* internal returns start at 0x100 to make exit(1..255) work */
@ -829,7 +829,7 @@ struct plugin_api {
/* misc */ /* misc */
#if (CONFIG_PLATFORM & PLATFORM_NATIVE) #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
int* __errno; int * (*__errno)(void);
#endif #endif
void (*srand)(unsigned int seed); void (*srand)(unsigned int seed);
int (*rand)(void); int (*rand)(void);

View file

@ -210,6 +210,7 @@ struct thread_entry
volatile intptr_t retval; /* Return value from a blocked operation/ volatile intptr_t retval; /* Return value from a blocked operation/
misc. use */ misc. use */
#endif #endif
int __errno; /* Thread error number (errno tls) */
#ifdef HAVE_PRIORITY_SCHEDULING #ifdef HAVE_PRIORITY_SCHEDULING
/* Priority summary of owned objects that support inheritance */ /* Priority summary of owned objects that support inheritance */
struct blocker *blocker; /* Pointer to blocker when this thread is blocked struct blocker *blocker; /* Pointer to blocker when this thread is blocked

View file

@ -1 +1,5 @@
int errno; #include "thread.h"
int * __errno(void)
{
return &thread_self_entry()->__errno;
}

View file

@ -10,10 +10,12 @@
#ifndef _SYS_ERRNO_H_ #ifndef _SYS_ERRNO_H_
extern int * __errno(void);
#ifdef PLUGIN #ifdef PLUGIN
#define errno (*rb->__errno) #define errno (*rb->__errno())
#else #else
extern int errno; #define errno (*__errno())
#endif #endif
#define EPERM 1 /* Not super-user */ #define EPERM 1 /* Not super-user */