svn commit: branches/uClibc-nptl/libc: misc/pthread sysdeps/linux/common sysdep etc...

carmelo at uclibc.org carmelo at uclibc.org
Wed Nov 21 17:45:57 UTC 2007


Author: carmelo
Date: 2007-11-21 09:45:53 -0800 (Wed, 21 Nov 2007)
New Revision: 20466

Log:
Added some missing files:
creat.c:   to provide creat function
longjmp.c: to provide longjmp implementation for sh4
tsd.c:      to provide implementation of __libc_dl_error_tsd

Signed-off-by: Carmelo Amoroso <carmelo.amoroso at st.com>


Added:
   branches/uClibc-nptl/libc/misc/pthread/tsd.c
   branches/uClibc-nptl/libc/sysdeps/linux/common/creat.c
   branches/uClibc-nptl/libc/sysdeps/linux/sh/longjmp.c


Changeset:
Added: branches/uClibc-nptl/libc/misc/pthread/tsd.c
===================================================================
--- branches/uClibc-nptl/libc/misc/pthread/tsd.c	                        (rev 0)
+++ branches/uClibc-nptl/libc/misc/pthread/tsd.c	2007-11-21 17:45:53 UTC (rev 20466)
@@ -0,0 +1,11 @@
+/* libpthread sets _dl_error_catch_tsd to point to this function.
+   We define it here instead of in libpthread so t here instead of in libpthread so that it doesn't
+   need to have a TLS segment of its own just for this one pointer.  */
+
+void ** __attribute__ ((const))
+__libc_dl_error_tsd (void)
+{
+  static __thread void *data __attribute__ ((tls_model ("initial-exec")));
+  return &data;
+}
+

Added: branches/uClibc-nptl/libc/sysdeps/linux/common/creat.c
===================================================================
--- branches/uClibc-nptl/libc/sysdeps/linux/common/creat.c	                        (rev 0)
+++ branches/uClibc-nptl/libc/sysdeps/linux/common/creat.c	2007-11-21 17:45:53 UTC (rev 20466)
@@ -0,0 +1,16 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * open() for uClibc
+ *
+ * Copyright (C) 2000-2006 Erik Andersen <andersen at uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+#include <fcntl.h>
+
+extern int __libc_open(const char *file, int flags, ...);
+
+int creat(const char *file, mode_t mode)
+{
+	return __libc_open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);
+}

Added: branches/uClibc-nptl/libc/sysdeps/linux/sh/longjmp.c
===================================================================
--- branches/uClibc-nptl/libc/sysdeps/linux/sh/longjmp.c	                        (rev 0)
+++ branches/uClibc-nptl/libc/sysdeps/linux/sh/longjmp.c	2007-11-21 17:45:53 UTC (rev 20466)
@@ -0,0 +1,56 @@
+/* Copyright (C) 1991, 92, 94, 95, 97, 98, 2000 Free Software Foundation, Inc.
+   Copyright (C) 2001 Hewlett-Packard Australia
+
+ This program 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 program 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 program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Derived in part from the Linux-8086 C library, the GNU C Library, and several
+ other sundry sources.  Files within this library are copyright by their
+ respective copyright holders.
+*/
+
+#include <stddef.h>
+#include <setjmp.h>
+#include <signal.h>
+
+libc_hidden_proto(sigprocmask)
+
+extern int __longjmp(char *env, int val);
+libc_hidden_proto(__longjmp)
+
+extern void _longjmp_unwind (jmp_buf env, int val);
+
+
+/* Set the signal mask to the one specified in ENV, and jump
+   to the position specified in ENV, causing the setjmp
+   call there to return VAL, or 1 if VAL is 0.  */
+void __libc_siglongjmp (sigjmp_buf env, int val)
+{
+  /* Perform any cleanups needed by the frames being unwound.  */
+
+  _longjmp_unwind (env, val);
+
+  if (env[0].__mask_was_saved)
+    /* Restore the saved signal mask.  */
+    (void) sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
+			  (sigset_t *) NULL);
+
+  /* Call the machine-dependent function to restore machine state.  */
+  __longjmp ((char *) env[0].__jmpbuf, val ?: 1);
+}
+
+__asm__(".weak longjmp; longjmp = __libc_siglongjmp");
+__asm__(".weak _longjmp; _longjmp = __libc_siglongjmp");
+__asm__(".weak siglongjmp; siglongjmp = __libc_siglongjmp");
+strong_alias(__libc_siglongjmp, __libc_longjmp)




More information about the uClibc-cvs mailing list