[PD-cvs] pd/src m_atomic.h,NONE,1.1.2.1 m_obj.c,1.2.4.1,1.2.4.2

Tim Blechmann timblech at users.sourceforge.net
Sun Jan 2 20:56:05 CET 2005


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

Modified Files:
      Tag: devel_0_38
	m_obj.c 
Added Files:
      Tag: devel_0_38
	m_atomic.h 
Log Message:
thread-safe stack management

Index: m_obj.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_obj.c,v
retrieving revision 1.2.4.1
retrieving revision 1.2.4.2
diff -C2 -d -r1.2.4.1 -r1.2.4.2
*** m_obj.c	5 Nov 2004 14:27:46 -0000	1.2.4.1
--- m_obj.c	2 Jan 2005 19:56:02 -0000	1.2.4.2
***************
*** 12,16 ****
--- 12,26 ----
  /* T.Grill - define for a modified, more portable method to detect stack overflows */
  #define NEWSTACKMETH
+ /* tb: threadsafe stack overflow detection */
  
+ #ifdef ATOMIC
+ #include "m_atomic.h"
+ #define STACK_INC int* scp = &stackcount; ATOMIC_INC(scp)
+ #define STACK_DEC ATOMIC_DEC(scp)
+ #else /* ATOMIC */
+ #define STACK_INC ++stackcount
+ #define STACK_DEC --stackcount
+ #endif /* ATOMIC */
+ /* tb: } */
  
  union inletunion
***************
*** 361,365 ****
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
!     if(++stackcount >= STACKITER)
  #else
      char c;    
--- 371,376 ----
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
! 	STACK_INC;
!     if(stackcount >= STACKITER)
  #else
      char c;    
***************
*** 370,375 ****
      for (oc = x->o_connections; oc; oc = oc->oc_next)
          pd_bang(oc->oc_to);
  #ifdef NEWSTACKMETH
!     --stackcount;
  #endif    
  }
--- 381,387 ----
      for (oc = x->o_connections; oc; oc = oc->oc_next)
          pd_bang(oc->oc_to);
+ 	post("%d", stackcount);
  #ifdef NEWSTACKMETH
!     STACK_DEC;
  #endif    
  }
***************
*** 380,384 ****
      t_gpointer gpointer;
  #ifdef NEWSTACKMETH
!     if(++stackcount >= STACKITER)
  #else
      char c;    
--- 392,397 ----
      t_gpointer gpointer;
  #ifdef NEWSTACKMETH
! 	STACK_INC;
!     if(stackcount >= STACKITER)
  #else
      char c;    
***************
*** 400,404 ****
      }
  #ifdef NEWSTACKMETH
!     --stackcount;
  #endif    
  }
--- 413,417 ----
      }
  #ifdef NEWSTACKMETH
!     STACK_DEC;
  #endif    
  }
***************
*** 408,412 ****
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
!     if(++stackcount >= STACKITER)
  #else
      char c;    
--- 421,426 ----
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
! 	STACK_INC;
!     if(stackcount >= STACKITER)
  #else
      char c;    
***************
*** 418,422 ****
          pd_float(oc->oc_to, f);
  #ifdef NEWSTACKMETH
!     --stackcount;
  #endif    
  }
--- 432,436 ----
          pd_float(oc->oc_to, f);
  #ifdef NEWSTACKMETH
!     STACK_DEC;
  #endif    
  }
***************
*** 426,430 ****
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
!     if(++stackcount >= STACKITER)
  #else
      char c;    
--- 440,445 ----
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
! 	STACK_INC;
!     if(stackcount >= STACKITER)
  #else
      char c;    
***************
*** 436,440 ****
          pd_symbol(oc->oc_to, s);
  #ifdef NEWSTACKMETH
!     --stackcount;
  #endif    
  }
--- 451,455 ----
          pd_symbol(oc->oc_to, s);
  #ifdef NEWSTACKMETH
!     STACK_DEC;
  #endif    
  }
***************
*** 444,448 ****
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
!     if(++stackcount >= STACKITER)
  #else
      char c;    
--- 459,464 ----
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
! 	STACK_INC;
!     if(stackcount >= STACKITER)
  #else
      char c;    
***************
*** 454,458 ****
          pd_list(oc->oc_to, s, argc, argv);
  #ifdef NEWSTACKMETH
!     --stackcount;
  #endif    
  }
--- 470,474 ----
          pd_list(oc->oc_to, s, argc, argv);
  #ifdef NEWSTACKMETH
!     STACK_DEC;
  #endif    
  }
***************
*** 462,466 ****
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
!     if(++stackcount >= STACKITER)
  #else
      char c;    
--- 478,483 ----
      t_outconnect *oc;
  #ifdef NEWSTACKMETH
! 	STACK_INC;
!     if(stackcount >= STACKITER)
  #else
      char c;    
***************
*** 472,476 ****
          typedmess(oc->oc_to, s, argc, argv);
  #ifdef NEWSTACKMETH
!     --stackcount;
  #endif    
  }
--- 489,493 ----
          typedmess(oc->oc_to, s, argc, argv);
  #ifdef NEWSTACKMETH
!     STACK_DEC;
  #endif    
  }

--- NEW FILE: m_atomic.h ---
/* Copyright (c) 2005, Tim Blechmann
 * For information on usage and redistribution, and for a DISCLAIMER OF ALL
 * WARRANTIES, see the file, "LICENSE.txt" in this distribution.  */


#if defined(__GNUC__) && (defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__))

/* gcc, x86 */
#define ATOMIC_INC(X)							\
   asm __volatile__("lock incl (%0) \n"			\
	   : :"r"(X) :"memory")
 

#define ATOMIC_DEC(X)							\
   asm __volatile__("lock decl (%0) \n"			\
	   : :"r"(X) :"memory")



#elif defined(NT) && defined(_MSC_VER)

/* msvc */
#include <windows.h>
#define ATOMIC_INC(X) InterlockedIncrement(X)
#define ATOMIC_DEC(X) InterlockedDecrement(X)


#elif defined(__GNUC__) && defined(__POWERPC__)

/* ppc */
#define ATOMIC_INC(X)							\
int X##_i;										\
asm __volatile__(								\
				 "1: \n"						\
				 "lwarx %0, 0, %2   \n"			\
				 "addic %0, %0, 1   \n"			\
				 "stwcx %0, 0, %2   \n"			\
				 "bne-  1b          \n"			\
				 :"=&r"(X##_i), "=m"(X)			\
				 : "r" (&X), "m"(X)				\
				 : "cc");
    

#define ATOMIC_DEC(X)							\
int X##_i;										\
asm __volatile__(								\
				 "1: \n"						\
				 "lwarx %0, 0, %2   \n"			\
				 "addic %0, %0, -1  \n"			\
				 "stwcx %0, 0, %2   \n"			\
				 "bne-  1b          \n"			\
				 :"=&r"(i), "=m"(X)				\
				 : "r" (X##_&X), "m"(X)			\
				 : "cc");
#endif





More information about the Pd-cvs mailing list