[PD-cvs] pd/src m_fifo.c,1.1.2.1,1.1.2.2

Tim Blechmann timblech at users.sourceforge.net
Thu Dec 2 20:19:55 CET 2004


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7621

Modified Files:
      Tag: devel_0_38
	m_fifo.c 
Log Message:
cas/cas2 for msvc

Index: m_fifo.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_fifo.c,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** m_fifo.c	2 Dec 2004 15:17:51 -0000	1.1.2.1
--- m_fifo.c	2 Dec 2004 19:19:53 -0000	1.1.2.2
***************
*** 16,20 ****
  
  
! 
  
  
--- 16,20 ----
  
  
! #define LOCKFREE
  
  
***************
*** 26,49 ****
   */
  
- /* for gcc on i386 */
  #if defined(__GNUC__) && (defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__))
  
! #define CAS(mem, old, new)                                 \
! ({ __asm__ __volatile__(                                   \
!        "lock cmpxchg %2,%0  \n"                            \
! 	   : :                                                 \
! 	   "m" (mem), "a" (old), "r" (new) );                  \
!    old != (__typeof__(old))(mem);                          \
  })
  
! #define CAS2(mem, old1, old2, new1, new2)                  \
! ({ __asm__ __volatile__(                                   \
!        "lock cmpxchg8b %0  \n"                             \
!        : :                                                 \
! 	   "m" (mem), "a" (old1), "d" (old2),                  \
!        "b" (new1), "c"(new2));                             \
!    old1 != (__typeof__(old1)) (mem);                       \
  })
  
  #else
  
--- 26,78 ----
   */
  
  #if defined(__GNUC__) && (defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__))
  
! /* gcc on i386 */
! 
! #define CAS(mem, old, new)						\
! ({ __asm__ __volatile__(						\
!        "lock cmpxchg %2,%0  \n"					\
! 	   : :										\
! 	   "m" (*mem), "a" (old), "r" (new) );		\
!    (void*)old != (void*)(*mem);			    	\
  })
  
! #define CAS2(mem, old1, old2, new1, new2)		\
! ({ __asm__ __volatile__(						\
!        "lock cmpxchg8b %0  \n"					\
!        : :										\
! 	   "m" (*mem), "a" (old1), "d" (old2),		\
!        "b" (new1), "c"(new2));					\
!    (void*) old1 != (void*) (*mem);				\
  })
  
+ #elif defined(NT) && defined(_MSC_VER)
+ 
+ /* msvc on i386 */
+ 
+ __inline int CAS(void** mem, void* old, void* new1)
+ {
+ 	__asm {
+ 		mov           eax, old
+ 		mov           ebx, new1
+ 		mov           esi, mem
+ 		lock cmpxchg  dword ptr [esi], ebx
+ 			}
+ 	return ((void*) old != (void*)(*mem));
+ }
+ 
+ __inline int CAS2(void** mem, void* old1, void* old2, void* new1, void* new2)
+ {
+ 	__asm {
+ 		mov             eax, old1
+ 		mov             edx, old2
+ 		mov             ebx, new1
+ 		mov             ecx, new2
+ 		mov             esi, mem
+ 		lock cmpxchg8b  qword ptr [esi]
+ 			}
+ 	return ((void*) old1 != (void*)(*mem));
+ }
+ 
  #else
  
***************
*** 52,56 ****
  #endif
  
- 
  struct _fifo
  {
--- 81,84 ----
***************
*** 108,118 ****
  			tail = fifo->tail;
  
! 			if (CAS(tail->next, NULL, cell))
  				break;
  			else
! 				CAS2(fifo->tail, tail, icount, tail->next, icount + 1);
  		}
  		
! 		CAS2(fifo->tail, tail, icount, cell, icount +1);
  		return;
  	}
--- 136,146 ----
  			tail = fifo->tail;
  
! 			if (CAS(&tail->next, NULL, cell))
  				break;
  			else
! 				CAS2(&fifo->tail, tail, icount, tail->next, icount + 1);
  		}
  		
! 		CAS2(&fifo->tail, tail, icount, cell, icount +1);
  		return;
  	}
***************
*** 142,151 ****
  				if (next == NULL)
  					return NULL;
! 				CAS2(fifo->tail, head, icount, next, icount + 1);
  			}
  			else
  			{
  				data = next->data;
! 				if (CAS2(fifo->head, head, ocount, next, ocount+1))
  					break;
  			}
--- 170,179 ----
  				if (next == NULL)
  					return NULL;
! 				CAS2(&fifo->tail, head, icount, next, icount + 1);
  			}
  			else
  			{
  				data = next->data;
! 				if (CAS2(&fifo->head, head, ocount, next, ocount+1))
  					break;
  			}





More information about the Pd-cvs mailing list