Implement sem_open, sem_close, and sem_unlink
authorDavid Bartley <dtbartle@glibc.(none)>
Mon, 2 Feb 2009 01:05:19 +0000 (01:05 +0000)
committerDavid Bartley <dtbartle@glibc.(none)>
Mon, 2 Feb 2009 01:05:19 +0000 (01:05 +0000)
nptl/sem_open.c
nptl/semaphoreP.h
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/linux_fsinfo.h [new file with mode: 0644]
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthreadP.h
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthreaddef.h
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_close.c [deleted file]
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_open.c [deleted file]
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_unlink.c [deleted file]

index e58dde9..910b6a0 100644 (file)
@@ -54,6 +54,7 @@ void
 attribute_hidden
 __where_is_shmfs (void)
 {
+#ifndef STATIC_DEV_SHM
   char buf[512];
   struct statfs f;
   struct mntent resmem;
@@ -120,6 +121,16 @@ __where_is_shmfs (void)
 
   /* Close the stream.  */
   __endmntent (fp);
+#else
+  int mode = S_IRWXU | S_IRWXG | S_IRWXO;
+  int res = mkdir (STATIC_DEV_SHM, mode);
+  if (res != 0 && errno != EEXIST)
+    return;
+  if (res == 0 && chmod (STATIC_DEV_SHM, mode) != 0)
+    return;
+  mountpoint.dir = (char *)STATIC_DEV_SHM_PREFIX;
+  mountpoint.dirlen = sizeof (STATIC_DEV_SHM_PREFIX) - 1;
+#endif
 }
 
 
@@ -147,7 +158,11 @@ __sem_search (const void *a, const void *b)
 void *__sem_mappings attribute_hidden;
 
 /* Lock to protect the search tree.  */
+#ifndef lll_define_initialized
 int __sem_mappings_lock attribute_hidden = LLL_LOCK_INITIALIZER;
+#else
+lll_define_initialized (, __sem_mappings_lock);
+#endif
 
 
 /* Search for existing mapping and if possible add the one provided.  */
@@ -304,6 +319,7 @@ sem_open (const char *name, int oflag, ...)
       /* Create the initial file content.  */
       sem_t initsem;
 
+#ifndef SEM_T_IS_OPAQUE
       struct new_sem *iinitsem = (struct new_sem *) &initsem;
       iinitsem->value = value;
       iinitsem->private = 0;
@@ -312,6 +328,10 @@ sem_open (const char *name, int oflag, ...)
       /* Initialize the remaining bytes as well.  */
       memset ((char *) &initsem + sizeof (struct new_sem), '\0',
              sizeof (sem_t) - sizeof (struct new_sem));
+#else
+      if (sem_init (&initsem, 1, value) != 0)
+        return SEM_FAILED;
+#endif
 
       tmpfname = (char *) alloca (mountpoint.dirlen + 6 + 1);
       char *xxxxxx = __mempcpy (tmpfname, mountpoint.dir, mountpoint.dirlen);
index 7d6fd25..c358944 100644 (file)
@@ -18,7 +18,7 @@
    02111-1307 USA.  */
 
 #include <semaphore.h>
-#include "pthreadP.h"
+#include <pthreadP.h>
 
 
 /* Mount point of the shared memory filesystem.  */
@@ -48,7 +48,11 @@ extern pthread_once_t __namedsem_once attribute_hidden;
 extern void *__sem_mappings attribute_hidden;
 
 /* Lock to protect the search tree.  */
+#ifndef lll_define
 extern int __sem_mappings_lock attribute_hidden;
+#else
+lll_define (extern, __sem_mappings_lock);
+#endif
 
 
 /* Initializer for mountpoint.  */
diff --git a/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/linux_fsinfo.h b/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/linux_fsinfo.h
new file mode 100644 (file)
index 0000000..6bd482b
--- /dev/null
@@ -0,0 +1 @@
+/* This exists to make nptl/sem_open.c happy.  */
index dacfff9..4c1c474 100644 (file)
@@ -164,6 +164,20 @@ static inline int __internal_sched_get_priority_max_1 (int *errval, int policy)
   return result;
 }
 
+static inline int __internal_munmap_2 (int *errval, void *start, size_t length)
+{
+  sysret_t ret;
+  *errval = __systemcall (&ret, SYS_munmap, start, length);
+  return ret.sys_rval1;
+}
+
+static inline int __internal_close_1 (int *errval, int fd)
+{
+  sysret_t ret;
+  *errval = __systemcall (&ret, SYS_close, fd);
+  return ret.sys_rval1;
+}
+
 /* These are used by the "real" associated functions.  */
 
 static inline int __pthread_setschedparam_internal (pthread_t threadid,
index bedd148..69bd2a4 100644 (file)
@@ -81,3 +81,10 @@ DECLARE_INLINE_SYSCALL (void, lwp_exit, void);
 #undef __exit_thread_inline
 #define __exit_thread_inline(val) \
     INLINE_SYSCALL (lwp_exit, 0);
+
+/* We don't have /dev/shm on solaris, so we use /tmp/.dev_shm.  */
+#define STATIC_DEV_SHM         "/tmp/.glibc_dev_shm"
+#define STATIC_DEV_SHM_PREFIX  STATIC_DEV_SHM "/sem."
+
+/* Force using sem_* instead of assuming sem_t internals.  */
+#define SEM_T_IS_OPAQUE
diff --git a/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_close.c b/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_close.c
deleted file mode 100644 (file)
index 4fb620c..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2002, 2003, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-   OpenSolaris bits 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 <errno.h>
-#include "semaphoreP.h"
-
-
-int
-sem_close (sem)
-     sem_t *sem;
-{
-  // TODO
-  __set_errno(ENOSYS);
-  return -1;
-}
diff --git a/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_open.c b/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_open.c
deleted file mode 100644 (file)
index 56e1973..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 2002, 2003, 2006, 2007, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-   OpenSolaris bits 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 <errno.h>
-#include <semaphore.h>
-#include "semaphoreP.h"
-
-
-
-sem_t *
-sem_open (const char *name, int oflag, ...)
-{
-  // TODO
-  __set_errno(ENOSYS);
-  return SEM_FAILED;
-}
diff --git a/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_unlink.c b/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sem_unlink.c
deleted file mode 100644 (file)
index 4ee76e9..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 2002, 2004, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-   OpenSolaris bits 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 <errno.h>
-#include <semaphore.h>
-#include "semaphoreP.h"
-
-
-int
-sem_unlink (name)
-     const char *name;
-{
-  // TODO
-  __set_errno(ENOSYS);
-  return -1;
-}