Author: nhosoi
Update of /cvs/dirsec/ldapserver/ldap/servers/slapd In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv8616/ldap/servers/slapd
Modified Files: slapi_counter.c Added Files: slapi_counter_sunos_sparcv9.S Removed Files: slapi_counter_sunos_sparcv9.il Log Message: Resolves: 207457 Summary: (64bitcounters) rhds 7.1 - server stats use 32-bit integers - entrycachehitratio 1503% Change description: 1) Makefile.am: instead of the inline assembly langauge file .il, include an independent .S file to the libslapd_la_SOURCES list. 2) add AM_PROG_AS to configure.ac to accept CCAS and CCASFLAGS. 3) slapi_counter.c: adjusted to slapi_counter_sunos_sparcv9.S. 4) add slapi_counter_sunos_sparcv9.S 5) remove slapi_counter_sunos_sparcv9.il
--- NEW FILE slapi_counter_sunos_sparcv9.S --- ! BEGIN COPYRIGHT BLOCK ! This Program is free software; you can redistribute it and/or modify it under ! the terms of the GNU General Public License as published by the Free Software ! Foundation; version 2 of the License. ! ! 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 General Public License for more details. ! ! You should have received a copy of the GNU 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. ! ! In addition, as a special exception, Red Hat, Inc. gives You the additional ! right to link the code of this Program with code not covered under the GNU ! General Public License ("Non-GPL Code") and to distribute linked combinations ! including the two, subject to the limitations in this paragraph. Non-GPL Code ! permitted under this exception must only link to the code of this Program ! through those well defined interfaces identified in the file named EXCEPTION ! found in the source code files (the "Approved Interfaces"). The files of ! Non-GPL Code may instantiate templates or use macros or inline functions from ! the Approved Interfaces without causing the resulting work to be covered by ! the GNU General Public License. Only Red Hat, Inc. may make changes or ! additions to the list of Approved Interfaces. You must obey the GNU General ! Public License in all respects for all of the Program code and other code used ! in conjunction with the Program except the Non-GPL Code covered by this ! exception. If you modify this file, you may extend this exception to your ! version of the file, but you are not obligated to do so. If you do not wish to ! provide this exception without modification, you must delete this exception ! statement from your version and license this file solely under the GPL without ! exception. ! ! ! The Original Code is the Netscape Portable Runtime (NSPR). ! ! The Initial Developer of the Original Code is ! Netscape Communications Corporation. ! Portions created by the Initial Developer are Copyright (C) 1998-2000 ! the Initial Developer. All Rights Reserved. ! ! The original code has been modified to support 64-bit atomic increments by ! Red Hat, Inc. These portions are Copyright (C) 2008 Red Hat, Inc. All Rights ! reserved. ! ! END COPYRIGHT BLOCK !
#include <sys/asm_linkage.h>
! ====================================================================== ! ! Perform the sequence a = b atomically with respect to other ! fetch-and-stores to location a in a wait-free fashion. ! ! usage : old_val = PR_AtomicSet(address, newval) ! ! ----------------------- ! Note on REGISTER USAGE: ! as this is a LEAF procedure, a new stack frame is not created; ! we use the caller's stack frame so what would normally be %i (input) ! registers are actually %o (output registers). Also, we must not ! overwrite the contents of %l (local) registers as they are not ! assumed to be volatile during calls. ! -----------------------
ENTRY(_sparcv9_AtomicSet) ! standard assembler/ELF prologue
retryAS: ldx [%o0], %o2 ! set o2 to the current value mov %o1, %o3 ! set up the new value casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed cmp %o2, %o3 ! see if we set the value bne retryAS ! if not, try again nop ! empty out the branch pipeline retl ! return back to the caller mov %o3, %o0 ! set the return code to the prev value
SET_SIZE(_sparcv9_AtomicSet) ! standard assembler/ELF epilogue
! ! end ! ! ====================================================================== ! ! Perform the sequence a = a + b atomically with respect to other ! fetch-and-adds to location a in a wait-free fashion. ! ! usage : newval = PR_AtomicAdd(address, val) ! return: the value after addition ! ENTRY(_sparcv9_AtomicAdd) ! standard assembler/ELF prologue
retryAA: ldx [%o0], %o2 ! set o2 to the current value addx %o2, %o1, %o3 ! calc the new value mov %o3, %o4 ! save the return value casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed cmp %o2, %o3 ! see if we set the value bne retryAA ! if not, try again nop ! empty out the branch pipeline retl ! return back to the caller mov %o4, %o0 ! set the return code to the new value
SET_SIZE(_sparcv9_AtomicAdd) ! standard assembler/ELF epilogue
! ! end ! ! ====================================================================== ! ! Perform the sequence a = a - b atomically with respect to other ! fetch-and-subs to location a in a wait-free fashion. ! ! usage : newval = PR_AtomicSub(address, val) ! return: the value after addition ! ENTRY(_sparcv9_AtomicSub) ! standard assembler/ELF prologue
retryAU: ldx [%o0], %o2 ! set o2 to the current value subx %o2, %o1, %o3 ! calc the new value mov %o3, %o4 ! save the return value casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed cmp %o2, %o3 ! see if we set the value bne retryAU ! if not, try again nop ! empty out the branch pipeline retl ! return back to the caller mov %o4, %o0 ! set the return code to the new value
SET_SIZE(_sparcv9_AtomicSub) ! standard assembler/ELF epilogue
! ! end !
Index: slapi_counter.c =================================================================== RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/slapi_counter.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- slapi_counter.c 17 Oct 2008 22:15:26 -0000 1.1 +++ slapi_counter.c 22 Oct 2008 20:24:37 -0000 1.2 @@ -41,6 +41,12 @@
#include "slap.h"
+#ifdef SOLARIS +PRUint64 _sparcv9_AtomicSet_il(PRUint64 *address, PRUint64 newval); +PRUint64 _sparcv9_AtomicAdd_il(PRUint64 *address, PRUint64 val); +PRUint64 _sparcv9_AtomicSub_il(PRUint64 *address, PRUint64 val); +#endif + #ifdef HPUX #ifdef ATOMIC_64BIT_OPERATIONS #include <machine/sys/inline.h> @@ -157,7 +163,7 @@ #ifdef LINUX newvalue = __sync_add_and_fetch(&(counter->value), addvalue); #elif defined(SOLARIS) - newvalue = _sparcv9_AtomicAdd_il(&(counter->value), addvalue); + newvalue = _sparcv9_AtomicAdd(&(counter->value), addvalue); #elif defined(HPUX) /* fetchadd only works with values of 1, 4, 8, and 16. In addition, it requires * it's argument to be an integer constant. */ @@ -214,7 +220,7 @@ #ifdef LINUX newvalue = __sync_sub_and_fetch(&(counter->value), subvalue); #elif defined(SOLARIS) - newvalue = _sparcv9_AtomicSub_il(&(counter->value), subvalue); + newvalue = _sparcv9_AtomicSub(&(counter->value), subvalue); #elif defined(HPUX) /* fetchadd only works with values of -1, -4, -8, and -16. In addition, it requires * it's argument to be an integer constant. */ @@ -272,7 +278,7 @@ } } #elif defined(SOLARIS) - _sparcv9_AtomicSet_il(&(counter->value), newvalue); + _sparcv9_AtomicSet(&(counter->value), newvalue); return newvalue; #elif defined(HPUX) do { @@ -313,7 +319,7 @@ #elif defined(SOLARIS) while (1) { value = counter->value; - if (value == _sparcv9_AtomicSet_il(&(counter->value), value)) { + if (value == _sparcv9_AtomicSet(&(counter->value), value)) { break; } }
--- slapi_counter_sunos_sparcv9.il DELETED ---
389-commits@lists.fedoraproject.org