diff options
author | "Steven J. Hill" <sjhill@realitydiluted.com> | 2005-08-11 03:25:34 +0000 |
---|---|---|
committer | "Steven J. Hill" <sjhill@realitydiluted.com> | 2005-08-11 03:25:34 +0000 |
commit | 3e618254fd7d842f63b19b89a7b9cee0ec76637b (patch) | |
tree | 6c7f987aac4fdce85255227059fe6b4e498da4c4 /libpthread/nptl/sysdeps/unix/sysv | |
parent | 6581d74f6e6a32a37aec1e895ec050ebc10a6f9b (diff) | |
download | uClibc-alpine-3e618254fd7d842f63b19b89a7b9cee0ec76637b.tar.bz2 uClibc-alpine-3e618254fd7d842f63b19b89a7b9cee0ec76637b.tar.xz |
It occurred to me that for the uClibc way of doing things, we should be using the syscall to fork if pthreads is not being used for NPTL, just like we do with the linuxthreads model. There were some name collisions that had to fixed, but things should be sane now. Also, due to complexities of the new thread model and compilation, the 'fork.c' from NPTL has to be compiled in with the C library, even though the code in it is not called until pthreads is linked in either dynamically by the loader or in a static binary. If that all makes sense to you, give yourself a cookie.
Diffstat (limited to 'libpthread/nptl/sysdeps/unix/sysv')
-rw-r--r-- | libpthread/nptl/sysdeps/unix/sysv/linux/fork.c | 6 | ||||
-rw-r--r-- | libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile | 91 | ||||
-rw-r--r-- | libpthread/nptl/sysdeps/unix/sysv/linux/pt-fork.c | 4 |
3 files changed, 101 insertions, 0 deletions
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/fork.c b/libpthread/nptl/sysdeps/unix/sysv/linux/fork.c index ea22b0df2..0bc2a2410 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/fork.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/fork.c @@ -59,7 +59,11 @@ fresetlockfiles (void) pid_t +#ifdef __UCLIBC__ +__libc_fork_nptl (void) +#else __libc_fork (void) +#endif { pid_t pid; struct used_handler @@ -231,6 +235,8 @@ __libc_fork (void) return pid; } +#ifndef __UCLIBC__ weak_alias (__libc_fork, __fork) libc_hidden_def (__fork) weak_alias (__libc_fork, fork) +#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile new file mode 100644 index 000000000..0e43e56e2 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile @@ -0,0 +1,91 @@ +# Makefile for uClibc NPTL pthread library (Linux/MIPS) +# +# Copyright (C) 2005 Steven J. Hill <sjhill@realitydiluted.com> +# +# 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 +# Makefile for uClibc + +TOPDIR=../../../../../../../ +include $(TOPDIR)Rules.mak +include ../../../../../Rules.mak + +ASRC-LIBP-ST = pt-vfork.S +ASRC-LIBP-SH = $(ASRC-LIBP-ST) + +CSRC-LIBP-ST = pthread_once.c +CSRC-LIBP-SH = $(CSRC-LIBP-ST) + +CSRC-LIBC-ST = fork.c +CSRC-LIBC-SH = $(CSRC-LIBC-ST) + +AOBJ-LIBP-ST = $(patsubst %.S, %.o, $(ASRC-LIBP-ST)) +AOBJ-LIBP-SH = $(patsubst %.S, %.os, $(ASRC-LIBP-SH)) +COBJ-LIBP-ST = $(patsubst %.c, %.o, $(CSRC-LIBP-ST)) +COBJ-LIBP-SH = $(patsubst %.c, %.os, $(CSRC-LIBP-ST)) +COBJ-LIBC-ST = $(patsubst %.c, %.o, $(CSRC-LIBC-ST)) +COBJ-LIBC-SH = $(patsubst %.c, %.os, $(CSRC-LIBC-SH)) + +ifeq ($(UCLIBC_HAS_STDIO_FUTEXES),y) +CFLAGS-fork.c = -D__USE_STDIO_FUTEXES__ +endif + +ar-target all: $(AOBJ-LIBP-ST) $(AOBJ-LIBP-SH) $(COBJ-LIBP-ST) $(COBJ-LIBP-SH) +ifeq ($(strip $(PTHREADS_DEBUG_SUPPORT)),y) + $(STRIPTOOL) -X --strip-debug -R .note -R .comment \ + $(AOBJ-LIBP-ST) $(AOBJ-LIBP-SH) $(COBJ-LIBP-ST) $(COBJ-LIBP-SH) +else + $(STRIPTOOL) -x -R .note -R .comment \ + $(AOBJ-LIBP-ST) $(AOBJ-LIBP-SH) $(COBJ-LIBP-ST) $(COBJ-LIBP-SH) +endif + $(AR) $(ARFLAGS) $(PTDIR)../$(LIBPTHREAD_STATIC_ARCHIVE) \ + $(AOBJ-LIBP-ST) $(COBJ-LIBP-ST) + $(AR) $(ARFLAGS) $(PTDIR)../$(LIBPTHREAD_SHARED_ARCHIVE) \ + $(AOBJ-LIBP-SH) $(COBJ-LIBP-SH) + +$(AOBJ-LIBP-ST): %.o : %.S + $(CC) $(ASFLAGS-LIBP) -c $< -o $@ + +$(AOBJ-LIBP-SH): %.os : %.S + $(CC) $(ASFLAGS-LIBP) -DSHARED -c $< -o $@ + +$(COBJ-LIBP-ST): %.o : %.c + $(CC) $(CFLAGS-$<) $(CFLAGS-LIBP) -c $< -o $@ + +$(COBJ-LIBP-SH): %.os : %.c + $(CC) $(CFLAGS-$<) $(CFLAGS-LIBP) -DSHARED -c $< -o $@ + +$(COBJ-LIBC-ST): %.o : %.c + $(CC) $(CFLAGS-$<) $(CFLAGS-LIBC) -c $< -o $@ + +$(COBJ-LIBC-SH): %.os : %.c + $(CC) $(CFLAGS-$<) $(CFLAGS-LIBC) -DSHARED -c $< -o $@ + +objs-pthread-libc: $(COBJ-LIBC-ST) $(COBJ-LIBC-SH) +ifeq ($(strip $(PTHREADS_DEBUG_SUPPORT)),y) + $(STRIPTOOL) -X --strip-debug -R .note -R .comment \ + $(COBJ-LIBC-ST) $(COBJ-LIBC-SH) +else + $(STRIPTOOL) -x -R .note -R .comment \ + $(COBJ-LIBC-ST) $(COBJ-LIBC-SH) +endif + @for objfile in $(COBJ-LIBC-ST); do \ + echo ../libpthread/nptl/sysdeps/unix/sysv/linux/mips/$$objfile >> $(PTCOBJST); \ + done + @for objfile in $(COBJ-LIBC-SH); do \ + echo ../libpthread/nptl/sysdeps/unix/sysv/linux/mips/$$objfile >> $(PTCOBJSH); \ + done + +clean: + $(RM) *.o *.os *~ core diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/pt-fork.c b/libpthread/nptl/sysdeps/unix/sysv/linux/pt-fork.c index f57f0dfa3..6c39eb772 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/pt-fork.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/pt-fork.c @@ -22,6 +22,10 @@ pid_t __fork (void) { +#ifdef __UCLIBC__ + return __libc_fork_nptl (); +#else return __libc_fork (); +#endif } strong_alias (__fork, fork) |