[uClibc-cvs] uClibc/libpthread/linuxthreads locale.c, NONE, 1.1 Makefile, 1.8, 1.9 internals.h, 1.5, 1.6 manager.c, 1.6, 1.7 pthread.c, 1.10, 1.11
Manuel Novoa III
mjn3 at uclibc.org
Fri Aug 1 20:09:33 UTC 2003
- Previous message: [uClibc-cvs] uClibc/libc/stdlib Makefile, 1.51, 1.52 stdlib.c, 1.10, 1.11 strtod.c, 1.6, 1.7
- Next message: [uClibc-cvs] uClibc/libc/stdio Makefile, 1.38, 1.39 old_vfprintf.c, 1.6, 1.7 printf.c, 1.45, 1.46 scanf.c, 1.27, 1.28 stdio.c, 1.69, 1.70
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /var/cvs/uClibc/libpthread/linuxthreads
In directory winder:/tmp/cvs-serv28208/libpthread/linuxthreads
Modified Files:
Makefile internals.h manager.c pthread.c
Added Files:
locale.c
Log Message:
Add a new *scanf implementation, includeing the *wscanf functions.
Should be standards compliant and with several optional features,
including support for hexadecimal float notation, locale awareness,
glibc-like locale-specific digit grouping with the `'' flag, and
positional arg support. I tested it pretty well (finding several
bugs in glibc's scanf in the process), but it is brand new so be
aware.
The *wprintf functions now support floating point output. Also, a
couple of bugs were squashed. Finally, %a/%A conversions are
now implemented.
Implement the glibc xlocale interface for thread-specific locale
support. Also add the various *_l(args, locale_t loc_arg) funcs.
NOTE!!! setlocale() is NOT threadsafe! NOTE!!!
The strto{floating point} conversion functions are now locale aware.
The also now support hexadecimal floating point notation.
Add the wcsto{floating point} conversion functions.
Fix a bug in mktime() related to dst. Note that unlike glibc's mktime,
uClibc's version always normalizes the struct tm before attempting
to determine the correct dst setting if tm_isdst == -1 on entry.
Add a stub version of the libintl functions. (untested)
Fixed a known memory leak in setlocale() related to the collation data.
Add lots of new config options (which Erik agreed to sort out :-),
including finally exposing some of the stripped down stdio configs.
Be careful with those though, as they haven't been tested in a
long time.
(temporary) GOTCHAs...
The ctype functions are currently incorrect for 8-bit locales. They
will be fixed shortly.
The ctype functions are now table-based, resulting in larger staticly
linked binaries. I'll be adding an option to use the old approach
in the stub locale configuration.
--- NEW FILE: locale.c ---
/* Copyright (C) 2003 Manuel Novoa III
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define _GNU_SOURCE
#include <features.h>
#include "pthread.h"
#include "internals.h"
#include <locale.h>
#include <assert.h>
#include <stdlib.h>
extern struct _pthread_descr_struct __pthread_initial_thread;
__locale_t __curlocale(void)
{
pthread_descr self = thread_self();
#ifdef NDEBUG
return THREAD_GETMEM (self, locale);
#else
{
__locale_t r = THREAD_GETMEM (self, locale);
assert(r);
return r;
}
#endif
}
__locale_t __curlocale_set(__locale_t newloc)
{
__locale_t oldloc;
pthread_descr self = thread_self();
oldloc = THREAD_GETMEM (self, locale);
assert(newloc != LC_GLOBAL_LOCALE);
assert(oldloc);
THREAD_SETMEM (self, locale, newloc);
return oldloc;
}
Index: Makefile
===================================================================
RCS file: /var/cvs/uClibc/libpthread/linuxthreads/Makefile,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- Makefile 21 Jul 2003 20:28:58 -0000 1.8
+++ Makefile 1 Aug 2003 20:08:59 -0000 1.9
@@ -45,6 +45,11 @@
mutex.c oldsemaphore.c pt-machine.c ptfork.c pthread.c \
ptlongjmp.c rwlock.c semaphore.c signals.c specific.c spinlock.c \
wrapsyscall.c #weaks.c
+
+ifeq ($(UCLIBC_HAS_XLOCALE),y)
+ CSRC += locale.c
+endif
+
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(COBJS)
Index: internals.h
===================================================================
RCS file: /var/cvs/uClibc/libpthread/linuxthreads/internals.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- internals.h 12 Jun 2003 21:44:56 -0000 1.5
+++ internals.h 1 Aug 2003 20:08:59 -0000 1.6
@@ -28,6 +28,9 @@
#include "pt-machine.h"
#include "semaphore.h"
#include "../linuxthreads_db/thread_dbP.h"
+#ifdef __UCLIBC_HAS_XLOCALE__
+#include <bits/uClibc_locale.h>
+#endif /* __UCLIBC_HAS_XLOCALE__ */
/* Use a funky version in a probably vein attempt at preventing gdb
* from dlopen()'ing glibc's libthread_db library... */
@@ -172,6 +175,9 @@
pthread_readlock_info *p_readlock_free; /* Free list of structs */
int p_untracked_readlock_count; /* Readlocks not tracked by list */
/* New elements must be added at the end. */
+#ifdef __UCLIBC_HAS_XLOCALE__
+ __locale_t locale; /* thread-specific locale from uselocale() only! */
+#endif /* __UCLIBC_HAS_XLOCALE__ */
} __attribute__ ((aligned(32))); /* We need to align the structure so that
doubles are aligned properly. This is 8
bytes on MIPS and 16 bytes on MIPS64.
Index: manager.c
===================================================================
RCS file: /var/cvs/uClibc/libpthread/linuxthreads/manager.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- manager.c 27 Feb 2003 18:12:43 -0000 1.6
+++ manager.c 1 Aug 2003 20:08:59 -0000 1.7
@@ -134,6 +134,11 @@
__pthread_manager_thread.p_errnop = &__pthread_manager_thread.p_errno;
__pthread_manager_thread.p_h_errnop = &__pthread_manager_thread.p_h_errno;
+#ifdef __UCLIBC_HAS_XLOCALE__
+ /* Initialize thread's locale to the global locale. */
+ __pthread_manager_thread.locale = __global_locale;
+#endif /* __UCLIBC_HAS_XLOCALE__ */
+
/* Block all signals except __pthread_sig_cancel and SIGTRAP */
sigfillset(&manager_mask);
sigdelset(&manager_mask, __pthread_sig_cancel); /* for thread termination */
@@ -506,6 +511,10 @@
new_thread->p_canceltype = PTHREAD_CANCEL_DEFERRED;
new_thread->p_errnop = &new_thread->p_errno;
new_thread->p_h_errnop = &new_thread->p_h_errno;
+#ifdef __UCLIBC_HAS_XLOCALE__
+ /* Initialize thread's locale to the global locale. */
+ new_thread->locale = __global_locale;
+#endif /* __UCLIBC_HAS_XLOCALE__ */
new_thread->p_guardaddr = guardaddr;
new_thread->p_guardsize = guardsize;
new_thread->p_self = new_thread;
Index: pthread.c
===================================================================
RCS file: /var/cvs/uClibc/libpthread/linuxthreads/pthread.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- pthread.c 30 May 2003 04:47:47 -0000 1.10
+++ pthread.c 1 Aug 2003 20:08:59 -0000 1.11
@@ -99,6 +99,10 @@
NULL, /* pthread_readlock_info *p_readlock_list; */
NULL, /* pthread_readlock_info *p_readlock_free; */
0 /* int p_untracked_readlock_count; */
+#ifdef __UCLIBC_HAS_XLOCALE__
+ ,
+ NULL, /* __locale_t locale; */
+#endif /* __UCLIBC_HAS_XLOCALE__ */
};
/* Descriptor of the manager thread; none of this is used but the error
@@ -151,6 +155,10 @@
NULL, /* pthread_readlock_info *p_readlock_list; */
NULL, /* pthread_readlock_info *p_readlock_free; */
0 /* int p_untracked_readlock_count; */
+#ifdef __UCLIBC_HAS_XLOCALE__
+ ,
+ NULL, /* __locale_t locale; */
+#endif /* __UCLIBC_HAS_XLOCALE__ */
};
/* Pointer to the main thread (the father of the thread manager thread) */
@@ -318,6 +326,12 @@
/* The errno/h_errno variable of the main thread are the global ones. */
__pthread_initial_thread.p_errnop = &_errno;
__pthread_initial_thread.p_h_errnop = &_h_errno;
+
+#ifdef __UCLIBC_HAS_XLOCALE__
+ /* The locale of the main thread is the current locale in use. */
+ __pthread_initial_thread.locale = __curlocale_var;
+#endif /* __UCLIBC_HAS_XLOCALE__ */
+
/* Play with the stack size limit to make sure that no stack ever grows
beyond STACK_SIZE minus two pages (one page for the thread descriptor
immediately beyond, and one page to act as a guard page). */
- Previous message: [uClibc-cvs] uClibc/libc/stdlib Makefile, 1.51, 1.52 stdlib.c, 1.10, 1.11 strtod.c, 1.6, 1.7
- Next message: [uClibc-cvs] uClibc/libc/stdio Makefile, 1.38, 1.39 old_vfprintf.c, 1.6, 1.7 printf.c, 1.45, 1.46 scanf.c, 1.27, 1.28 stdio.c, 1.69, 1.70
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the uClibc-cvs
mailing list