|
|
1.1 ! root 1: #define _DDI_DKI 1 ! 2: #define _SYSV4 1 ! 3: ! 4: /* ! 5: * Some simple tests to make sure that whatever is defined in the internal ! 6: * <sys/x86lock.h> header at least does vaguely what it should, even if it ! 7: * doesn't do it really atomically. ! 8: */ ! 9: ! 10: #include <kernel/x86lock.h> ! 11: #include <limits.h> ! 12: ! 13: ! 14: #if __BORLANDC__ ! 15: ! 16: /* ! 17: * The following functions cannot safely be used in-line in Borland C++ ! 18: * due to problems with 32-bit code generation and register pseudovariables. ! 19: */ ! 20: ! 21: #if defined (__HUGE__) || defined (__COMPACT__) || defined (__LARGE__) ! 22: ! 23: void * ATOMIC_FETCH_AND_STORE_PTR (__atomic_ptr_t lock, void * value) { ! 24: long temp; ! 25: temp = ATOMIC_FETCH_AND_STORE_LONG (lock, (long) value); ! 26: return (void *) temp; ! 27: } ! 28: ! 29: #if 0 ! 30: void * ATOMIC_FETCH_PTR (__atomic_ptr_t lock) { ! 31: return (void *) ATOMIC_FETCH_LONG (lock); ! 32: } ! 33: #endif ! 34: ! 35: #endif /* large data model */ ! 36: ! 37: #endif /* __BORLANDC__ */ ! 38: ! 39: #ifndef __LOCAL__ ! 40: #error ! 41: #endif ! 42: ! 43: /* ! 44: * Here we exercise the atomic operations. Note that these tests have revealed ! 45: * many important subtleties of the way the operations and the compilers work ! 46: * during the development of the <sys/x86lock.h> header; in particular, the ! 47: * tests below reveal some important things about the use of the "volatile" ! 48: * keyword in highly optimizing compilers like GCC, where the compiler was ! 49: * able to statically (and incorrectly) predict what the result "ought" to ! 50: * have been. ! 51: * ! 52: * Having said that, in systems which are capable of in-line code generation ! 53: * it also pays to ensure that operations are not being *totally* elided due ! 54: * to overzealous optimization. This can really only be done by manual ! 55: * examination of the form of the generated code. ! 56: */ ! 57: ! 58: __LOCAL__ atomic_char_t achar; ! 59: __LOCAL__ atomic_uchar_t auchar; ! 60: __LOCAL__ atomic_short_t ashort; ! 61: __LOCAL__ atomic_ushort_t aushort; ! 62: __LOCAL__ atomic_int_t aint; ! 63: __LOCAL__ atomic_uint_t auint; ! 64: __LOCAL__ atomic_long_t along; ! 65: __LOCAL__ atomic_ulong_t aulong; ! 66: __LOCAL__ atomic_ptr_t aptr; ! 67: ! 68: __EXTERN_C__ ! 69: #if __USE_PROTO__ ! 70: int (testX86) (void) ! 71: #else ! 72: int ! 73: testX86 __ARGS (()) ! 74: #endif ! 75: { ! 76: char achartemp = '1'; ! 77: uchar_t auchartemp = 'y'; ! 78: short ashorttemp = -2438; ! 79: ushort_t aushorttemp = 12034; ! 80: int ainttemp = -12438; ! 81: uint_t auinttemp = 21349; ! 82: long alongtemp = -1385866L; ! 83: ulong_t aulongtemp = 124875656L; ! 84: _VOID * aptrtemp = & achartemp; ! 85: ! 86: /* ! 87: * Set some sensible initial values. ! 88: */ ! 89: ! 90: (void) ATOMIC_FETCH_AND_STORE_CHAR (achar, achartemp); ! 91: (void) ATOMIC_FETCH_AND_STORE_UCHAR (auchar, auchartemp); ! 92: (void) ATOMIC_FETCH_AND_STORE_SHORT (ashort, ashorttemp); ! 93: (void) ATOMIC_FETCH_AND_STORE_USHORT (aushort, aushorttemp); ! 94: (void) ATOMIC_FETCH_AND_STORE_INT (aint, ainttemp); ! 95: (void) ATOMIC_FETCH_AND_STORE_UINT (auint, auinttemp); ! 96: (void) ATOMIC_FETCH_AND_STORE_LONG (along, alongtemp); ! 97: (void) ATOMIC_FETCH_AND_STORE_ULONG (aulong, aulongtemp); ! 98: (void) ATOMIC_FETCH_AND_STORE_PTR (aptr, aptrtemp); ! 99: ! 100: ! 101: if (ATOMIC_FETCH_CHAR (achar) != achartemp || ! 102: ATOMIC_FETCH_UCHAR (auchar) != auchartemp || ! 103: ATOMIC_FETCH_SHORT (ashort) != ashorttemp || ! 104: ATOMIC_FETCH_USHORT (aushort) != aushorttemp || ! 105: ATOMIC_FETCH_INT (aint) != ainttemp || ! 106: ATOMIC_FETCH_UINT (auint) != auinttemp || ! 107: ATOMIC_FETCH_LONG (along) != alongtemp || ! 108: ATOMIC_FETCH_ULONG (aulong) != aulongtemp || ! 109: ATOMIC_FETCH_PTR (aptr) != aptrtemp || ! 110: ! 111: ATOMIC_FETCH_AND_STORE_CHAR (achar, SCHAR_MAX) != achartemp || ! 112: ATOMIC_FETCH_AND_STORE_UCHAR (auchar, UCHAR_MAX) != auchartemp || ! 113: ATOMIC_FETCH_AND_STORE_SHORT (ashort, SHRT_MAX) != ashorttemp || ! 114: ATOMIC_FETCH_AND_STORE_USHORT (aushort, USHRT_MAX) != aushorttemp || ! 115: ATOMIC_FETCH_AND_STORE_INT (aint, INT_MAX) != ainttemp || ! 116: ATOMIC_FETCH_AND_STORE_UINT (auint, UINT_MAX) != auinttemp || ! 117: ATOMIC_FETCH_AND_STORE_LONG (along, LONG_MAX) != alongtemp || ! 118: ATOMIC_FETCH_AND_STORE_ULONG (aulong, ULONG_MAX) != aulongtemp || ! 119: ATOMIC_FETCH_AND_STORE_PTR (aptr, & aulongtemp) != aptrtemp || ! 120: ! 121: ATOMIC_FETCH_CHAR (achar) != SCHAR_MAX || ! 122: ATOMIC_FETCH_UCHAR (auchar) != UCHAR_MAX || ! 123: ATOMIC_FETCH_SHORT (ashort) != SHRT_MAX || ! 124: ATOMIC_FETCH_USHORT (aushort) != USHRT_MAX || ! 125: ATOMIC_FETCH_INT (aint) != INT_MAX || ! 126: ATOMIC_FETCH_UINT (auint) != UINT_MAX || ! 127: ATOMIC_FETCH_LONG (along) != LONG_MAX || ! 128: ATOMIC_FETCH_ULONG (aulong) != ULONG_MAX || ! 129: ATOMIC_FETCH_PTR (aptr) != & aulongtemp || ! 130: ! 131: ATOMIC_FETCH_AND_STORE_CHAR (achar, SCHAR_MIN) != SCHAR_MAX || ! 132: ATOMIC_FETCH_AND_STORE_UCHAR (auchar, 0) != UCHAR_MAX || ! 133: ATOMIC_FETCH_AND_STORE_SHORT (ashort, SHRT_MIN) != SHRT_MAX || ! 134: ATOMIC_FETCH_AND_STORE_USHORT (aushort, 0) != USHRT_MAX || ! 135: ATOMIC_FETCH_AND_STORE_INT (aint, INT_MIN) != INT_MAX || ! 136: ATOMIC_FETCH_AND_STORE_UINT (auint, 0) != UINT_MAX || ! 137: ATOMIC_FETCH_AND_STORE_LONG (along, LONG_MIN) != LONG_MAX || ! 138: ATOMIC_FETCH_AND_STORE_ULONG (aulong, 0) != ULONG_MAX || ! 139: ATOMIC_FETCH_AND_STORE_PTR (aptr, 0) != & aulongtemp || ! 140: ! 141: ATOMIC_FETCH_CHAR (achar) != SCHAR_MIN || ! 142: ATOMIC_FETCH_UCHAR (auchar) != 0 || ! 143: ATOMIC_FETCH_SHORT (ashort) != SHRT_MIN || ! 144: ATOMIC_FETCH_USHORT (aushort) != 0 || ! 145: ATOMIC_FETCH_INT (aint) != INT_MIN || ! 146: ATOMIC_FETCH_UINT (auint) != 0 || ! 147: ATOMIC_FETCH_LONG (along) != LONG_MIN || ! 148: ATOMIC_FETCH_ULONG (aulong) != 0 || ! 149: ATOMIC_FETCH_PTR (aptr) != 0 || ! 150: ! 151: ATOMIC_FETCH_AND_STORE_CHAR (achar, 0) != SCHAR_MIN || ! 152: ATOMIC_FETCH_AND_STORE_UCHAR (auchar, 0) != 0 || ! 153: ATOMIC_FETCH_AND_STORE_SHORT (ashort, 0) != SHRT_MIN || ! 154: ATOMIC_FETCH_AND_STORE_USHORT (aushort, 0) != 0 || ! 155: ATOMIC_FETCH_AND_STORE_INT (aint, 0) != INT_MIN || ! 156: ATOMIC_FETCH_AND_STORE_UINT (auint, 0) != 0 || ! 157: ATOMIC_FETCH_AND_STORE_LONG (along, 0) != LONG_MIN || ! 158: ATOMIC_FETCH_AND_STORE_ULONG (aulong, 0) != 0 || ! 159: ATOMIC_FETCH_AND_STORE_PTR (aptr, 0) != 0 || ! 160: ! 161: ATOMIC_TEST_AND_SET_UCHAR (auchar) != 0 || ! 162: ATOMIC_FETCH_UCHAR (auchar) != (uchar_t) -1 || ! 163: ATOMIC_TEST_AND_SET_UCHAR (auchar) != (uchar_t) -1 || ! 164: (ATOMIC_CLEAR_UCHAR (auchar), ! 165: ATOMIC_FETCH_UCHAR (auchar)) != 0) ! 166: ! 167: return -1; ! 168: ! 169: return 0; ! 170: } ! 171: ! 172: ! 173: #ifdef TEST ! 174: #include <stdio.h> ! 175: ! 176: int main (void) { ! 177: printf (testX86 () ? "failed\n" : "passed\n"); ! 178: return 0; ! 179: } ! 180: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.