Merge branch 'master' of csclub.uwaterloo.ca:/users/kopensolaris-gnu/git/glibc
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Wed, 21 Jan 2009 09:09:40 +0000 (09:09 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Wed, 21 Jan 2009 09:09:40 +0000 (09:09 +0000)
TODO.opensolaris
nptl/pthread_create.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/createthread.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/internaltypes.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/klogctl.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/klog.h [new file with mode: 0644]

index e84f427..ce571c2 100644 (file)
@@ -1,3 +1,10 @@
+ABI changes:
+  Add d_type to struct dirent
+  Fix f_files/f_ffree bug in struct statfs (they are always ino64_t)
+  Adjust struct statfs or remove statfs/fstatfs outright
+    Implement statfs[64] in terms of statvfs[64]
+      Use sysfs to translate fsname into fstype
+
 /usr/include/gnu/stubs-32.h
 
 ptrace details:
index 7368df8..9844624 100644 (file)
@@ -245,6 +245,14 @@ start_thread (void *arg)
 {
   struct pthread *pd = (struct pthread *) arg;
 
+#ifdef ATTR_FLAG_CREATE_FAILED
+  if ((pd->flags & ATTR_FLAG_CREATE_FAILED) && IS_DETACHED (pd))
+    {
+      __free_tcb (pd);
+      __exit_thread_inline (0);
+    }
+#endif
+
 #if HP_TIMING_AVAIL
   /* Remember the time when the thread was started.  */
   hp_timing_t now;
index 1f28c6e..0bb1b81 100644 (file)
@@ -98,16 +98,27 @@ create_thread (struct pthread *pd, const struct pthread_attr *attr,
             errval = EPERM;
         }
 
-      /* Resume thread if requested.  */
-      if (errval == 0)
+      /* TODO: remove this hack once scheduling works.  */
+      errval = 0;
+
+      if (errval == 0 && !(attr->flags & ATTR_FLAG_SUSPENDED))
         {
-          if (!(attr->flags & ATTR_FLAG_SUSPENDED))
-            errval = INLINE_SYSCALL (lwp_continue, 1, pd->tid);
+          errval = INLINE_SYSCALL (lwp_continue, 1, pd->tid);
         }
+      else if (errval != 0)
+        {
+          pd->flags |= ATTR_FLAG_CREATE_FAILED;
+          INLINE_SYSCALL (lwp_continue, 1, pd->tid);
 
-      /* Kill the thread if we didn't succeed above.  */
-      if (errval != 0)
-        INLINE_SYSCALL (lwp_kill, 2, pd->tid, SIGKILL);
+          if (!IS_DETACHED (pd))
+            {
+              int result;
+              lll_wait_tid (pd->tid);
+            }
+
+          /* Note: if the thread is detached, start_thread will free pd;
+             otherwise the caller of create_thread will free pd.  */
+        }
     }
 
   if (errval == 0)
@@ -120,13 +131,6 @@ create_thread (struct pthread *pd, const struct pthread_attr *attr,
   else
     {
       atomic_decrement (&__nptl_nthreads); /* Oops, we lied for a second.  */
-
-      /* Failed.  If the thread is detached, remove the TCB here since
-         the caller cannot do this.  The caller remembered the thread
-         as detached and cannot reverify that it is not since it must
-         not access the thread descriptor again.  */
-      if (IS_DETACHED (pd))
-        __deallocate_stack (pd);
     }
 
   return errval;
index 8c291d9..c6ab6ec 100644 (file)
@@ -54,6 +54,7 @@ struct pthread_attr
 #define ATTR_FLAG_DAEMON               0x0080
 #define ATTR_FLAG_SUSPENDED            0x0100
 #define ATTR_FLAG_THR_CREATE   0x0200
+#define ATTR_FLAG_CREATE_FAILED                0x0400
 
 
 /* Mutex attribute data structure.  */
index 01f061d..9f31319 100644 (file)
@@ -43,13 +43,14 @@ sysdep_routines += sys_fdsync sys_brk sys_fcntl sys_utssys sys_lwp_private \
     sys_uname sys_getloadavg sys_utimes sys_getpeerucred sys_ucred_get \
     sys_privsys sys_putmsg sys_putpmsg sys_meminfo sys_pset_getloadavg \
     sys_zone_create sys_allocids sys_settaskid sys_zone_lookup sys_port \
-    sys_door
+    sys_door klogctl
 sysdep_headers += sys/feature_tests.h sys/dirent.h sys/utime.h sys/machelf.h \
     sys/systeminfo.h sys/link.h sys/procfs_isa.h sys/ttold.h sys/procset.h \
     sys/ptyvar.h sys/synch.h sys/fork.h sys/sockio.h sys/ioccom.h sys/tty.h \
     sys/trap.h sys/sysconfig.h sys/ptms.h sys/stack.h sys/regset.h sys/fault.h \
     sys/reg.h sys/siginfo.h sys/types32.h sys/isa_defs.h sys/int_types.h \
-    sys/inttypes.h sys/atomic.h sys/machtypes.h sys/elf.h sys/mkdev.h
+    sys/inttypes.h sys/atomic.h sys/machtypes.h sys/elf.h sys/mkdev.h \
+    sys/klog.h
 sysdep_headers += rtld_db.h pcsample.h atomic.h bits/machtypes.h
 headers := $(filter-out sys/sysinfo.h sys/swap.h, $(headers))
 endif
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/klogctl.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/klogctl.c
new file mode 100644 (file)
index 0000000..c8ce0eb
--- /dev/null
@@ -0,0 +1,31 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C 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.
+
+   The GNU C 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 the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <sys/klog.h>
+
+int klogctl (type, bufp, len)
+      int type;
+      char *bufp;
+      int len;
+{
+  switch (type)
+    {
+    }
+  return 0;
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/klog.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/klog.h
new file mode 100644 (file)
index 0000000..35f5fe4
--- /dev/null
@@ -0,0 +1,34 @@
+/* Copyright (C) 1996, 1999 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C 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.
+
+   The GNU C 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 the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef        _SYS_KLOG_H
+
+#define        _SYS_KLOG_H     1
+#include <features.h>
+
+__BEGIN_DECLS
+
+/* Control the kernel's logging facility.  This corresponds exactly to
+   the kernel's syslog system call, but that name is easily confused
+   with the user-level syslog facility, which is something completely
+   different.  */
+extern int klogctl (int __type, char *__bufp, int __len) __THROW;
+
+__END_DECLS
+
+#endif /* _SYS_KLOG_H */