|
66 | 66 | * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
|
67 | 67 | * Portions Copyright (c) 1994, Regents of the University of California
|
68 | 68 | *
|
69 |
| - * $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.134 2005/03/10 21:41:01 momjian Exp $ |
| 69 | + * $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.135 2005/08/25 17:17:10 tgl Exp $ |
70 | 70 | *
|
71 | 71 | *-------------------------------------------------------------------------
|
72 | 72 | */
|
@@ -453,20 +453,48 @@ do \
|
453 | 453 | #endif /* __alpha || __alpha__ */
|
454 | 454 |
|
455 | 455 |
|
456 |
| -/* These live in s_lock.c, but only for gcc */ |
| 456 | +#if defined(__mips__) && !defined(__sgi) |
| 457 | +/* Note: on SGI we use the OS' mutex ABI, see below */ |
| 458 | +#define HAS_TEST_AND_SET |
457 | 459 |
|
| 460 | +typedef unsigned int slock_t; |
458 | 461 |
|
459 |
| -#if defined(__m68k__) |
460 |
| -#define HAS_TEST_AND_SET |
| 462 | +#define TAS(lock) tas(lock) |
461 | 463 |
|
462 |
| -typedef unsigned char slock_t; |
463 |
| -#endif |
| 464 | +static __inline__ int |
| 465 | +tas(volatile slock_t *lock) |
| 466 | +{ |
| 467 | + register volatile slock_t *__l = lock; |
| 468 | + register int __r; |
464 | 469 |
|
| 470 | + __asm__ __volatile__( |
| 471 | + " .set push \n" |
| 472 | + " .set mips2 \n" |
| 473 | + " .set noreorder \n" |
| 474 | + " .set nomacro \n" |
| 475 | + "1: ll %0, %1 \n" |
| 476 | + " bne %0, $0, 1f \n" |
| 477 | + " xori %0, 1 \n" |
| 478 | + " sc %0, %1 \n" |
| 479 | + " beq %0, $0, 1b \n" |
| 480 | + " sync \n" |
| 481 | + "1: .set pop " |
| 482 | +: "=&r" (__r), "+R" (*__l) |
| 483 | +: |
| 484 | +: "memory", "cc"); |
| 485 | + return __r; |
| 486 | +} |
465 | 487 |
|
466 |
| -#if defined(__mips__) && !defined(__sgi) |
| 488 | +#endif /* __mips__ && !__sgi */ |
| 489 | + |
| 490 | + |
| 491 | +/* These live in s_lock.c, but only for gcc */ |
| 492 | + |
| 493 | + |
| 494 | +#if defined(__m68k__) |
467 | 495 | #define HAS_TEST_AND_SET
|
468 | 496 |
|
469 |
| -typedef unsigned int slock_t; |
| 497 | +typedef unsigned char slock_t; |
470 | 498 | #endif
|
471 | 499 |
|
472 | 500 |
|
|
0 commit comments