OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libc/] [sys/] [linux/] [linuxthreads/] [machine/] [i386/] [pspinlock.c] - Diff between revs 207 and 345

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
/* POSIX spinlock implementation.  x86 version.
/* POSIX spinlock implementation.  x86 version.
   Copyright (C) 2000 Free Software Foundation, Inc.
   Copyright (C) 2000 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   This file is part of the GNU C Library.
 
 
   The GNU C Library is free software; you can redistribute it and/or
   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
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.
   License, or (at your option) any later version.
 
 
   The GNU C Library is distributed in the hope that it will be useful,
   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.
   Library General Public License for more details.
 
 
   You should have received a copy of the GNU Library General Public
   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,
   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,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
#include <errno.h>
#include <errno.h>
#include <pthread.h>
#include <pthread.h>
#include "internals.h"
#include "internals.h"
 
 
/* This implementation is similar to the one used in the Linux kernel.
/* This implementation is similar to the one used in the Linux kernel.
   But the kernel is byte instructions for the memory access.  This is
   But the kernel is byte instructions for the memory access.  This is
   faster but unusable here.  The problem is that only 128
   faster but unusable here.  The problem is that only 128
   threads/processes could use the spinlock at the same time.  If (by
   threads/processes could use the spinlock at the same time.  If (by
   a design error in the program) a thread/process would hold the
   a design error in the program) a thread/process would hold the
   spinlock for a time long enough to accumulate 128 waiting
   spinlock for a time long enough to accumulate 128 waiting
   processes, the next one will find a positive value in the spinlock
   processes, the next one will find a positive value in the spinlock
   and assume it is unlocked.  We cannot accept that.  */
   and assume it is unlocked.  We cannot accept that.  */
 
 
int
int
__pthread_spin_lock (pthread_spinlock_t *lock)
__pthread_spin_lock (pthread_spinlock_t *lock)
{
{
  asm volatile
  asm volatile
    ("\n"
    ("\n"
     "1:\n\t"
     "1:\n\t"
     "lock; decl %0\n\t"
     "lock; decl %0\n\t"
     "js 2f\n\t"
     "js 2f\n\t"
     ".section .text.spinlock,\"ax\"\n"
     ".section .text.spinlock,\"ax\"\n"
     "2:\n\t"
     "2:\n\t"
     "cmpl $0,%0\n\t"
     "cmpl $0,%0\n\t"
     "rep; nop\n\t"
     "rep; nop\n\t"
     "jle 2b\n\t"
     "jle 2b\n\t"
     "jmp 1b\n\t"
     "jmp 1b\n\t"
     ".previous"
     ".previous"
     : "=m" (*lock));
     : "=m" (*lock));
  return 0;
  return 0;
}
}
weak_alias (__pthread_spin_lock, pthread_spin_lock)
weak_alias (__pthread_spin_lock, pthread_spin_lock)
 
 
 
 
int
int
__pthread_spin_trylock (pthread_spinlock_t *lock)
__pthread_spin_trylock (pthread_spinlock_t *lock)
{
{
  int oldval;
  int oldval;
 
 
  asm volatile
  asm volatile
    ("xchgl %0,%1"
    ("xchgl %0,%1"
     : "=r" (oldval), "=m" (*lock)
     : "=r" (oldval), "=m" (*lock)
     : "0" (0));
     : "0" (0));
  return oldval > 0 ? 0 : EBUSY;
  return oldval > 0 ? 0 : EBUSY;
}
}
weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
 
 
 
 
int
int
__pthread_spin_unlock (pthread_spinlock_t *lock)
__pthread_spin_unlock (pthread_spinlock_t *lock)
{
{
  asm volatile
  asm volatile
    ("movl $1,%0"
    ("movl $1,%0"
     : "=m" (*lock));
     : "=m" (*lock));
  return 0;
  return 0;
}
}
weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
 
 
 
 
int
int
__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
{
{
  /* We can ignore the `pshared' parameter.  Since we are busy-waiting
  /* We can ignore the `pshared' parameter.  Since we are busy-waiting
     all processes which can access the memory location `lock' points
     all processes which can access the memory location `lock' points
     to can use the spinlock.  */
     to can use the spinlock.  */
  *lock = 1;
  *lock = 1;
  return 0;
  return 0;
}
}
weak_alias (__pthread_spin_init, pthread_spin_init)
weak_alias (__pthread_spin_init, pthread_spin_init)
 
 
 
 
int
int
__pthread_spin_destroy (pthread_spinlock_t *lock)
__pthread_spin_destroy (pthread_spinlock_t *lock)
{
{
  /* Nothing to do.  */
  /* Nothing to do.  */
  return 0;
  return 0;
}
}
weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.