mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-30 22:43:12 +03:00
* semaphoreP.h: Declare __old_sem_init and __old_sem_wait.
* sem_init.c (__new_sem_init): Rewrite to initialize all three fields in the structure. (__old_sem_init): New function. * sem_open.c: Initialize all fields of the structure. * sem_getvalue.c: Adjust for renamed element. * sysdeps/unix/sysv/linux/Makefile [subdir=nptl] (gen-as-const-headers): Add structsem.sym. * sysdeps/unix/sysv/linux/structsem.sym: New file. * sysdeps/unix/sysv/linux/internaltypes.h: Rename struct sem to struct new_sem. Add struct old_sem. * sysdeps/unix/sysv/linux/sem_post.c: Wake only when there are waiters. * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. * sysdeps/unix/sysv/linux/sem_wait.c: Indicate that there are waiters. * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. * sysdeps/unix/sysv/linux/sem_timedwait.c: Likewise. * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. * Makefile (tests): Add tst-sem10, tst-sem11, tst-sem12. * tst-sem10.c: New file. * tst-sem11.c: New file. * tst-sem12.c: New file. * tst-typesizes.c: Test struct new_sem and struct old_sem instead of struct sem. 2007-05-25 Ulrich Drepper <drepper@redhat.com>
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2002, 2007 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@ -22,6 +22,7 @@
|
||||
#include <lowlevellock.h>
|
||||
#include <shlib-compat.h>
|
||||
#include "semaphoreP.h"
|
||||
#include <kernel-features.h>
|
||||
|
||||
|
||||
int
|
||||
@ -38,18 +39,50 @@ __new_sem_init (sem, pshared, value)
|
||||
}
|
||||
|
||||
/* Map to the internal type. */
|
||||
struct sem *isem = (struct sem *) sem;
|
||||
struct new_sem *isem = (struct new_sem *) sem;
|
||||
|
||||
/* Use the value the user provided. */
|
||||
isem->count = value;
|
||||
/* Use the values the user provided. */
|
||||
isem->value = value;
|
||||
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||
isem->private = pshared ? 0 : FUTEX_PRIVATE_FLAG;
|
||||
#else
|
||||
isem->private = pshared ? 0 : THREAD_GETMEM (THREAD_SELF,
|
||||
header.private_futex);
|
||||
#endif
|
||||
|
||||
/* We can completely ignore the PSHARED parameter since inter-process
|
||||
use needs no special preparation. */
|
||||
isem->nwaiters = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
versioned_symbol (libpthread, __new_sem_init, sem_init, GLIBC_2_1);
|
||||
|
||||
|
||||
|
||||
#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
|
||||
strong_alias (__new_sem_init, __old_sem_init)
|
||||
int
|
||||
attribute_compat_text_section
|
||||
__old_sem_init (sem, pshared, value)
|
||||
sem_t *sem;
|
||||
int pshared;
|
||||
unsigned int value;
|
||||
{
|
||||
/* Parameter sanity check. */
|
||||
if (__builtin_expect (value > SEM_VALUE_MAX, 0))
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Map to the internal type. */
|
||||
struct old_sem *isem = (struct old_sem *) sem;
|
||||
|
||||
/* Use the value the user provided. */
|
||||
isem->value = value;
|
||||
|
||||
/* We cannot store the PSHARED attribute. So we always use the
|
||||
operations needed for shared semaphores. */
|
||||
|
||||
return 0;
|
||||
}
|
||||
compat_symbol (libpthread, __old_sem_init, sem_init, GLIBC_2_0);
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user