ftp.nice.ch/pub/next/developer/languages/c/egcs.1.1.1.1beta.I.b.tar.gz#/lib/gcc-lib/i386-next-nextstep3/egcs-2.91.60/include/mach/hppa/simple_lock.h

This is simple_lock.h in view mode; [Download] [Up]

/* Copyright (c) 1993 NeXT Computer, Inc.  All rights reserved.
 * 
 *	File:	mach/hppa/simple_lock.h
 *
 *	This file contains machine dependent code for exclusion
 *	lock handling on HPPA-based products.
 *
 * HISTORY
 * 2-July-1993  Mac Gillon at NeXT
 *	Created.
 */

#import <mach/hppa/boolean.h>

#ifndef	_MACH_HPPA_SIMPLE_LOCK_
#define _MACH_HPPA_SIMPLE_LOCK_

#define	_MACHINE_SIMPLE_LOCK_DATA_

struct slock{
	volatile unsigned int lock_data[4];/* in general 1 bit is sufficient */
};

typedef struct slock	simple_lock_data_t;
typedef struct slock	*simple_lock_t;

#if	!defined(DEFINE_SIMPLE_LOCK_PRIMS)
static __inline__
#endif
void
simple_lock_init(
    simple_lock_t	slock
)
{
    *((volatile int *)(((int)(slock) + 0x0c) & ~0x0f))  = 1;
}

#if	!defined(DEFINE_SIMPLE_LOCK_PRIMS)
static __inline__
#endif
void
simple_unlock(
    simple_lock_t	slock
)
{
    *((volatile int *)(((int)(slock) + 0x0c) & ~0x0f))  = 1;
}

#if	!defined(DEFINE_SIMPLE_LOCK_PRIMS)
static __inline__
#endif
boolean_t
simple_lock_try(
    simple_lock_t	slock
)
{
    boolean_t		result;
	volatile int   *lock_word;
    
	lock_word = (volatile int *)(((int)(slock) + 0x0c) & ~0x0f);
	
    asm volatile (
    	"ldcws 0(%1),%0"
	    : "=r" (result): "r" (lock_word));
	
    return (result);
}



#if	!defined(DEFINE_SIMPLE_LOCK_PRIMS)
static __inline__
#endif
void
simple_lock(
    simple_lock_t	slock
)
{    
    do
    	{
	    while (*((volatile int *)(((int)(slock) + 0x0c) & ~0x0f))  == 0)
		continue;
	}
    while (!simple_lock_try(slock));
}

#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.