diff options
| author | Ulrich Drepper <drepper@redhat.com> | 2000-04-15 16:51:16 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 2000-04-15 16:51:16 +0000 |
| commit | a5a6f9262eeffab9f78622258fae306d1bf99d04 (patch) | |
| tree | 91ca75fd25219ba6b05beb0baf96b01ee60949fc | |
| parent | b2d4446fd6d0d51f2c7f3c33805f658f9c7bb6c9 (diff) | |
| download | glibc-a5a6f9262eeffab9f78622258fae306d1bf99d04.tar.xz glibc-a5a6f9262eeffab9f78622258fae306d1bf99d04.zip | |
Update.
2000-04-15 Ulrich Drepper <drepper@redhat.com>
* posix/Makefile (headers): Add spawn.h.
(distribute): Add spawn_int.h.
(routines): Add spawn_faction_init, spawn_faction_destroy,
spawn_faction_addclose, spawn_faction_addopen, spawn_faction_adddup2,
spawnattr_init, spawnattr_destroy, spawnattr_getdefault,
spawnattr_setdefault, spawnattr_getflags, spawnattr_setflags,
spawnattr_getpgroup, spawnattr_setpgroup, spawn, spawnp, and spawni.
* posix/Versions [libc] (GLIBC_2.2): Add posix_spawn_file_actions_init,
posix_spawn_file_actions_destroy, posix_spawn_file_actions_addclose,
posix_spawn_file_actions_addopen, posix_spawn_file_actions_adddup2,
posix_spawnattr_init, posix_spawnattr_destroy,
posix_spawnattr_getdefault, posix_spawnattr_setdefault,
posix_spawnattr_getflags, posix_spawnattr_setflags,
posix_spawnattr_getpgroup, posix_spawnattr_setpgroup, posix_spawn,
and posix_spawnp.
* posix/spawn.c: New file.
* posix/spawn.h: New file.
* posix/spawn_faction_addclose.c: New file.
* posix/spawn_faction_adddup2.c: New file.
* posix/spawn_faction_addopen.c: New file.
* posix/spawn_faction_destroy.c: New file.
* posix/spawn_faction_init.c: New file.
* posix/spawn_int.h: New file.
* posix/spawnattr_destroy.c: New file.
* posix/spawnattr_getdefault.c: New file.
* posix/spawnattr_getflags.c: New file.
* posix/spawnattr_getpgroup.c: New file.
* posix/spawnattr_getschedparam.c: New file.
* posix/spawnattr_getschedpolicy.c: New file.
* posix/spawnattr_getsigmask.c: New file.
* posix/spawnattr_init.c: New file.
* posix/spawnattr_setdefault.c: New file.
* posix/spawnattr_setflags.c: New file.
* posix/spawnattr_setpgroup.c: New file.
* posix/spawnattr_setschedparam.c: New file.
* posix/spawnattr_setschedpolicy.c: New file.
* posix/spawnattr_setsigmask.c: New file.
* posix/spawni.c: New file.
* posix/spawnp.c: New file.
* sysdeps/mach/hurd/bits/posix_opt.h: Add _POSIX_SPAWN.
* sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise.
32 files changed, 1286 insertions, 8 deletions
@@ -1,3 +1,48 @@ +2000-04-15 Ulrich Drepper <drepper@redhat.com> + + * posix/Makefile (headers): Add spawn.h. + (distribute): Add spawn_int.h. + (routines): Add spawn_faction_init, spawn_faction_destroy, + spawn_faction_addclose, spawn_faction_addopen, spawn_faction_adddup2, + spawnattr_init, spawnattr_destroy, spawnattr_getdefault, + spawnattr_setdefault, spawnattr_getflags, spawnattr_setflags, + spawnattr_getpgroup, spawnattr_setpgroup, spawn, spawnp, and spawni. + * posix/Versions [libc] (GLIBC_2.2): Add posix_spawn_file_actions_init, + posix_spawn_file_actions_destroy, posix_spawn_file_actions_addclose, + posix_spawn_file_actions_addopen, posix_spawn_file_actions_adddup2, + posix_spawnattr_init, posix_spawnattr_destroy, + posix_spawnattr_getdefault, posix_spawnattr_setdefault, + posix_spawnattr_getflags, posix_spawnattr_setflags, + posix_spawnattr_getpgroup, posix_spawnattr_setpgroup, posix_spawn, + and posix_spawnp. + * posix/spawn.c: New file. + * posix/spawn.h: New file. + * posix/spawn_faction_addclose.c: New file. + * posix/spawn_faction_adddup2.c: New file. + * posix/spawn_faction_addopen.c: New file. + * posix/spawn_faction_destroy.c: New file. + * posix/spawn_faction_init.c: New file. + * posix/spawn_int.h: New file. + * posix/spawnattr_destroy.c: New file. + * posix/spawnattr_getdefault.c: New file. + * posix/spawnattr_getflags.c: New file. + * posix/spawnattr_getpgroup.c: New file. + * posix/spawnattr_getschedparam.c: New file. + * posix/spawnattr_getschedpolicy.c: New file. + * posix/spawnattr_getsigmask.c: New file. + * posix/spawnattr_init.c: New file. + * posix/spawnattr_setdefault.c: New file. + * posix/spawnattr_setflags.c: New file. + * posix/spawnattr_setpgroup.c: New file. + * posix/spawnattr_setschedparam.c: New file. + * posix/spawnattr_setschedpolicy.c: New file. + * posix/spawnattr_setsigmask.c: New file. + * posix/spawni.c: New file. + * posix/spawnp.c: New file. + + * sysdeps/mach/hurd/bits/posix_opt.h: Add _POSIX_SPAWN. + * sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise. + 2000-04-14 Ulrich Drepper <drepper@redhat.com> * malloc/Versions [libc] (GLIBC_2.2): Add posix_memalign. diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 8bdc6094a0..50fa766fc6 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,5 +1,12 @@ 2000-04-15 Ulrich Drepper <drepper@redhat.com> + * internals.h (WRITE_MEMORY_BARRIER): Define as MEMORY_BARRIER if + undefined. + * spinlock.c: Use WRITE_MEMORY_BARRIER instead of MEMORY_BARRIER + where possible. + * sysdeps/alpha/pt-machine.h: Define WRITE_MEMORY_BARRIER. + * sysdeps/sparc/sparc64/pt-machine.h: Likewise. + * sysdeps/unix/sysv/linux/bits/posix_opt.h: Add _POSIX_SPAWN. * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise. diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h index 6b115beaa2..17c8e4d4d6 100644 --- a/linuxthreads/internals.h +++ b/linuxthreads/internals.h @@ -358,11 +358,15 @@ static inline pthread_descr thread_self (void) } /* If MEMORY_BARRIER isn't defined in pt-machine.h, assume the architecture - doesn't need a memory barrier instruction (e.g. Intel x86) */ + doesn't need a memory barrier instruction (e.g. Intel x86). Some + architectures distinguish between normal/read and write barriers. */ #ifndef MEMORY_BARRIER #define MEMORY_BARRIER() #endif +#ifndef WRITE_MEMORY_BARRIER +#define WRITE_MEMORY_BARRIER() MEMORY_BARRIER() +#endif /* Max number of times we must spin on a spinlock calling sched_yield(). After MAX_SPIN_COUNT iterations, we put the calling thread to sleep. */ diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index 6e7eb12e57..ac94001bda 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -56,7 +56,7 @@ void internal_function __pthread_lock(pthread_spinlock_t * lock, THREAD_SETMEM(self, p_nextlock, (pthread_descr) oldstatus); /* Make sure the store in p_nextlock completes before performing the compare-and-swap */ - MEMORY_BARRIER(); + WRITE_MEMORY_BARRIER(); } } while(! compare_and_swap(&lock->__status, oldstatus, newstatus, &lock->__spinlock)); @@ -198,7 +198,7 @@ int __pthread_compare_and_swap(long * ptr, long oldval, long newval, res = 0; } /* Prevent reordering of store to *ptr above and store to *spinlock below */ - MEMORY_BARRIER(); + WRITE_MEMORY_BARRIER(); *spinlock = 0; return res; } diff --git a/linuxthreads/sysdeps/alpha/pt-machine.h b/linuxthreads/sysdeps/alpha/pt-machine.h index 25ba634528..99c9bb6b28 100644 --- a/linuxthreads/sysdeps/alpha/pt-machine.h +++ b/linuxthreads/sysdeps/alpha/pt-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent pthreads configuration and inline functions. Alpha version. - Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>. @@ -34,6 +34,8 @@ register char *stack_pointer __asm__("$30"); /* Memory barrier; default is to do nothing */ #define MEMORY_BARRIER() __asm__ __volatile__("mb" : : : "memory") +/* Write barrier. */ +#define WRITE_MEMORY_BARRIER() __asm__ __volatile__("wmb" : : : "memory") /* Spinlock implementation; required. */ diff --git a/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h b/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h index 02167bd601..e22f4fed3c 100644 --- a/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h +++ b/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent pthreads configuration and inline functions. Sparc v9 version. - Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>. @@ -41,6 +41,9 @@ testandset (int *spinlock) /* FIXME: is stbar OK, or should we use the more general membar instruction? If so, which mode to pass to membar? */ #define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory") +/* Write barrier. */ +#define WRITE_MEMORY_BARRIER() \ + __asm__ __volatile__("membar #StoreLoad | #StoreStore" : : : "memory") /* Get some notion of the current stack. Need not be exactly the top diff --git a/posix/Makefile b/posix/Makefile index 566c558af3..c988027e1f 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -27,11 +27,12 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \ bits/local_lim.h tar.h bits/utsname.h bits/confname.h \ bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h \ bits/sched.h re_comp.h wait.h bits/environments.h cpio.h \ - sys/sysmacros.h + sys/sysmacros.h spawn.h distribute := confstr.h TESTS TESTS2C.sed testcases.h \ PTESTS PTESTS2C.sed ptestcases.h \ - globtest.c globtest.sh wordexp-tst.sh annexc.c fnmatch_loop.c + globtest.c globtest.sh wordexp-tst.sh annexc.c fnmatch_loop.c \ + spawn_int.h routines := \ uname \ @@ -51,7 +52,13 @@ routines := \ sched_setp sched_getp sched_sets sched_gets sched_yield sched_primax \ sched_primin sched_rr_gi \ getaddrinfo gai_strerror wordexp \ - pread pwrite pread64 pwrite64 + pread pwrite pread64 pwrite64 \ + spawn_faction_init spawn_faction_destroy spawn_faction_addclose \ + spawn_faction_addopen spawn_faction_adddup2 \ + spawnattr_init spawnattr_destroy \ + spawnattr_getdefault spawnattr_setdefault \ + spawnattr_getflags spawnattr_setflags \ + spawnattr_getpgroup spawnattr_setpgroup spawn spawnp spawni include ../Makeconfig diff --git a/posix/Versions b/posix/Versions index da7c479ffb..92c51b5e33 100644 --- a/posix/Versions +++ b/posix/Versions @@ -92,4 +92,16 @@ libc { # For the cancelation wrappers. __libc_pread; __libc_pread64; __libc_pwrite; __libc_pwrite64; } + GLIBC_2.2 { + # p* + posix_spawn_file_actions_init; posix_spawn_file_actions_destroy; + posix_spawn_file_actions_addclose; posix_spawn_file_actions_addopen; + posix_spawn_file_actions_adddup2; + posix_spawnattr_init; posix_spawnattr_destroy; + posix_spawnattr_getdefault; posix_spawnattr_setdefault; + posix_spawnattr_getflags; posix_spawnattr_setflags; + posix_spawnattr_getpgroup; posix_spawnattr_setpgroup; + posix_spawnattr_setsigmask; posix_spawnattr_getsigmask; + posix_spawn; posix_spawnp; + } } diff --git a/posix/spawn.c b/posix/spawn.c new file mode 100644 index 0000000000..93258c5624 --- /dev/null +++ b/posix/spawn.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2000 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <spawn.h> +#include "spawn_int.h" + +/* Spawn a new process executing PATH with the attributes describes in *ATTRP. + Before running the process perform the actions described in FILE-ACTIONS. */ +int +posix_spawn (pid_t *pid, const char *path, + const posix_spawn_file_actions_t *file_actions, + const posix_spawnattr_t *attrp, char *const argv[], + char *const envp[]) +{ + return __spawni (pid, path, file_actions, attrp, argv, envp, 0); +} diff --git a/posix/spawn.h b/posix/spawn.h new file mode 100644 index 0000000000..ea6dbf2772 --- /dev/null +++ b/posix/spawn.h @@ -0,0 +1,156 @@ +/* Definitions for POSIX spawn interface. + Copyright (C) 2000 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SPAWN_H +#define _SPAWN_H 1 + +#include <features.h> +#include <sched.h> +#include <signal.h> +#include <sys/types.h> + + +/* Data structure to contain attributes for thread creation. */ +typedef struct +{ + short int __flags; + pid_t __pgrp; + sigset_t __sd; + sigset_t __ss; + struct sched_param __sp; + int __policy; + int __pad[16]; +} posix_spawnattr_t; + + +/* Data structure to contain information about the actions to be + performed in the new process with respect to file descriptors. */ +typedef struct +{ + int __allocated; + int __used; + struct __spawn_action *__actions; + int __pad[16]; +} posix_spawn_file_actions_t; + + +/* Flags to be set in the `posix_spawnattr_t'. */ +#define POSIX_SPAWN_RESETIDS 0x01 +#define POSIX_SPAWN_SETPGROUP 0x02 +#define POSIX_SPAWN_SETSIGDEF 0x04 +#define POSIX_SPAWN_SETSIGMASK 0x08 +#define POSIX_SPAWN_SETSCHEDPARAM 0x10 +#define POSIX_SPAWN_SETSCHEDULER 0x20 + + +__BEGIN_DECLS + +/* Spawn a new process executing PATH with the attributes describes in *ATTRP. + Before running the process perform the actions described in FILE-ACTIONS. */ +extern int posix_spawn (pid_t *__pid, __const char *__path, + __const posix_spawn_file_actions_t *__file_actions, + __const posix_spawnattr_t *__attrp, + char *__const argv[], char *__const envp[]) __THROW; + +/* Similar to `posix_spawn' but search for FILE in the PATH. */ +extern int posix_spawnp (pid_t *__pid, __const char *__file, + __const posix_spawn_file_actions_t *__file_actions, + __const posix_spawnattr_t *__attrp, + char *__const argv[], char *__const envp[]) __THROW; + + +/* Initialize data structure with attributes for `spawn' to default values. */ +extern int posix_spawnattr_init (posix_spawnattr_t *__attr) __THROW; + +/* Free resources associated with ATTR. */ +extern int posix_spawnattr_destroy (posix_spawnattr_t *__attr) __THROW; + +/* Store signal mask for signals with default handling from ATTR in + SIGDEFAULT. */ +extern int posix_spawnattr_getdefault (__const posix_spawnattr_t *__attr, + sigset_t *__sigdefault) __THROW; + +/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT. */ +extern int posix_spawnattr_setdefault (posix_spawnattr_t *__attr, + __const sigset_t *__sigdefault) __THROW; + +/* Store signal mask for the new process from ATTR in SIGMASK. */ +extern int posix_spawnattr_getsigmask (__const posix_spawnattr_t *__attr, + sigset_t *__sigmask) __THROW; + +/* Set signal mask for the new process in ATTR to SIGMASK. */ +extern int posix_spawnattr_setsigmask (posix_spawnattr_t *__attr, + __const sigset_t *__sigmask) __THROW; + +/* Get flag word from the attribute structure. */ +extern int posix_spawnattr_getflags (__const posix_spawnattr_t *__attr, + short int *__flags) __THROW; + +/* Store flags in the attribute structure. */ +extern int posix_spawnattr_setflags (posix_spawnattr_t *_attr, + short int __flags) __THROW; + +/* Get process group ID from the attribute structure. */ +extern int posix_spawnattr_getpgroup (__const posix_spawnattr_t *__attr, + pid_t *__pgroup) __THROW; + +/* Store process group ID in the attribute structure. */ +extern int posix_spawnattr_setpgroup (posix_spawnattr_t *__attr, + pid_t __pgroup) __THROW; + +/* Get scheduling policy from the attribute structure. */ +extern int posix_spawnattr_getschedpolicy (__const posix_spawnattr_t *__attr, + int *__schedpolicy) __THROW; + +/* Store scheduling policy in the attribute structure. */ +extern int posix_spawnattr_setschedpolicy (posix_spawnattr_t *__attr, + int __schedpolicy) __THROW; + + +/* Initialize data structure for file attribute for `spawn' call. */ +extern int posix_spawn_file_actions_init (po |
