Index: i386/include/atomic.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/atomic.h,v retrieving revision 1.12 diff -u -u -r1.12 atomic.h --- i386/include/atomic.h 2000/09/06 11:21:14 1.12 +++ i386/include/atomic.h 2000/10/03 17:56:31 @@ -218,6 +218,31 @@ return ( atomic_cmpset_int((volatile u_int *)dst, (u_int)exp, (u_int)src)); } -#endif + +typedef struct { volatile int a; } atomic_t; + +#define atomic_init(p, v) ((p)->a = (v)); +#define atomic_destroy(p) ((void)0) +#define atomic_add(p, v) atomic_add_int(&(p->a), v) +#define atomic_sub(p, v) atomic_subtract_int(&(p->a), v) +#define atomic_or(p, v) atomic_set_int(&(p->a), v) +#define atomic_and(p, v) atomic_clear_int(&(p->a), v) +#define atomic_read(p) ((p)->a) +#define atomic_set(p, v) ((p)->a = (v)) +/* XXX: maybe use decl/incl ? */ +#define atomic_dec(p) atomic_sub(&(p->a), 1) +#define atomic_inc(p) atomic_add(&(p->a), 1) + +static __inline int +atomic_dec_and_test(volatile atomic_t *v) +{ + unsigned char c; + + __asm __volatile("lock ; decl %0; sete %1" + : "=m" (v->a), "=qm" (c) + : "m" (v->a)); + return (c != 0); +} +#endif /* !WANT_FUNCTIONS */ #endif /* ! _MACHINE_ATOMIC_H_ */