You should find out the "atomic" native assembler instruction
on your system that does a "cas" and try to use this for your purpose.
Otherwise you will always have races in your code.
Best regards,
Michael
Rama Krishna wrote:
Hi,
Below is the atomic function of compare and swap instruction (CAS) written in assembly
code.
The following is general description of the function for
CAS(int *p,int n,int k)
which does if(*p == n)
{
*p = k;
return 1;
}
else
{
return 0;
}
This operation we have to perform atomically, the following is assembly code
for that one
temp is the global variable which preserves atomicity.
My question is that is there any flaw the violates atomicity principle ? Can anyone who
worked before on this please guide us.
retr = cas(p,i,j,&temp);
int cas(int *p,int i,int j,int *t){
// local parameters are accessed in this way
// 8(%ebp) ---------- first parameter
// 12(%ebp)----------- second parameter
// 16(%ebp)----------- third parameter
// 20(%ebp)------------Fourthe parameter
// Fourth parameter is only used for performing the assembly level instructions atomically
asm(" movl 20(%ebp),%edx"); //moving fourth parameter into the edx Remember
// the fourth parameter consists of address
// performing bit test and set atomically using lock
// intially the (edx) contains zero value at bit 0 A process when executes the moves this
// bit 0 to carry flag and set the corresponding bit in (edx) to 1
// The first which entering the code only the value of 0 in the carry flag the remaining process
// will see a value of 1 in the carry flag.so jc implies already some other
process is there in the
// code
asm("lock bts $0,(%edx)");
asm(" jc label2");
//moving of first and second pararmeters into the registers
asm(" movl 8(%ebp),%ebx");
asm(" movl 12(%ebp),%ecx"); //after performing CAS operation
// Comparing if (*p) == i
asm(" cmp %ecx,(%ebx)");
asm(" je label1");
asm(" movl $0,%eax");
asm(" movl $0,(%edx)");
asm(" leave");
asm(" ret ");
// set (*p) = j and set the temp variable to 0 so that another
// may perform the operation
asm("label1: ");
asm(" movl 16(%ebp),%ecx");
asm(" movl %ecx ,(%ebx)");
asm(" movl $0,(%edx)");
// we are setting the return value in the register %eax
asm(" movl $1,%eax");
asm(" leave");
asm(" ret");
asm("label2: ");
asm(" movl $0,%eax");
asm(" leave");
asm(" ret");
}//end of cas
Rama
This message posted from opensolaris.org
_______________________________________________
perf-discuss mailing list
perf-discuss@opensolaris.org
--
Michael Schulte [EMAIL PROTECTED]
OpenSolaris Kernel Development http://opensolaris.org/
_______________________________________________
perf-discuss mailing list
perf-discuss@opensolaris.org