tas.c.template
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:1k
- /*
- * To generate tas.s using this template:
- * 1. cc +O2 -S -c tas.c
- * 2. edit tas.s:
- * - replace the LDW with LDCWX
- * For details about the LDCWX instruction, see the "Precision
- * Architecture and Instruction Reference Manual" (09740-90014 of June
- * 1987), p. 5-38.
- */
- int
- tas(lock)
- int *lock; /* LDCWX is a word instruction */
- {
- /*
- * LDCWX requires that we align the "semaphore" to a 16-byte
- * boundary. The actual datum is a single word (4 bytes).
- */
- lock = ((long) lock + 15) & ~15;
- /*
- * The LDCWX instruction atomically clears the target word and
- * returns the previous value. Hence, if the instruction returns
- * 0, someone else has already acquired the lock before we tested
- * it (i.e., we have failed).
- *
- * Notice that this means that we actually clear the word to set
- * the lock and set the word to clear the lock. This is the
- * opposite behavior from the SPARC LDSTUB instruction. For some
- * reason everything that H-P does is rather baroque...
- */
- if (*lock) { /* this generates the LDW */
- return(0); /* success */
- }
- return(1); /* failure */
- }