I'm no expert but if you don't have a memory operation somewhere I doubt you will succeed.
I see "The first which entering the code only the value of 0 in the carry flag" are you trying to have a CAS that works only on single-cpu systems ? Have you identified a problem with the CAS implementation used in Solaris ? -r ____________________________________________________________________________________ Roch Bourbonnais Sun Microsystems, Icnc-Grenoble Senior Performance Analyst 180, Avenue De L'Europe, 38330, Montbonnot Saint Martin, France Performance & Availability Engineering http://icncweb.france/~rbourbon http://blogs.sun.com/roller/page/roch [EMAIL PROTECTED] (+33).4.76.18.83.20 Rama Krishna writes: > 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 _______________________________________________ perf-discuss mailing list perf-discuss@opensolaris.org