diff --git a/src/block_alloc.h b/src/block_alloc.h
index 8aa01452efd483e7f19c78a91289db0f7f61d178..ca4bba18c027d711994076a73db555c7a7518ea1 100644
--- a/src/block_alloc.h
+++ b/src/block_alloc.h
@@ -15,43 +15,15 @@
 #undef PTR_HASH_ALLOC_FILL_PAGES
 #undef PTR_HASH_ALLOC_FIXED_FILL_PAGES
 
-/* Define this to keep freed blocks around in a backlog, which can
- * help locating leftover pointers to other blocks. It can also hide
- * bugs since the blocks remain intact a while after they are freed.
- * Valgrind will immediately detect attempts to use blocks on the
- * backlog list, though. Only available with dmalloc debug. */
-/* #define DMALLOC_BLOCK_BACKLOG */
-
 #define INIT_BLOCK(X)
 #define EXIT_BLOCK(X)
 #define BLOCK_ALLOC_HSIZE_SHIFT 2
-
-#if defined (DMALLOC_BLOCK_BACKLOG) && defined (DEBUG_MALLOC)
-#define DO_IF_BLOCK_BACKLOG(X) X
-#define DO_IF_NOT_BLOCK_BACKLOG(X)
-#define BLOCK_ALLOC_USED real_used
-#else
-#define DO_IF_BLOCK_BACKLOG(X)
-#define DO_IF_NOT_BLOCK_BACKLOG(X) X
-#define BLOCK_ALLOC_USED used
-#endif
-
 #ifndef PIKE_HASH_T
 #define PIKE_HASH_T	size_t
 #endif /* !PIKE_HASH_T */
 
-#ifdef PIKE_RUN_UNLOCKED
-#include "threads.h"
-
-/* Block Alloc UnLocked */
-#define BA_UL(X) PIKE_CONCAT(X,_unlocked)
-#define BA_STATIC static
-#define BA_INLINE INLINE
-#else
-#define BA_UL(X) X
 #define BA_STATIC
 #define BA_INLINE
-#endif
 
 
 #define PTR_HASH_ALLOC_FILL_PAGES(DATA, PAGES)				\
@@ -123,7 +95,7 @@ struct DATA **PIKE_CONCAT(DATA,_hash_table)=0;				     \
 size_t PIKE_CONCAT(DATA,_hash_table_size)=0;				     \
 static size_t PIKE_CONCAT(num_,DATA)=0;					     \
 									     \
-static INLINE struct DATA *						     \
+static struct DATA *						     \
  PIKE_CONCAT3(really_low_find_,DATA,_unlocked)(void *ptr,		     \
 					       PIKE_HASH_T hval)	     \
 {									     \
@@ -147,14 +119,11 @@ struct DATA *PIKE_CONCAT(find_,DATA)(void *ptr)				     \
 {									     \
   struct DATA *p;                                                            \
   PIKE_HASH_T hval = ptr_hashfun(ptr);			                     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));                    \
   if(!PIKE_CONCAT(DATA,_hash_table)) {                                       \
-    DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                \
     return 0;                                                                \
   }                                                                          \
   hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1;		     \
   p=PIKE_CONCAT3(really_low_find_,DATA,_unlocked)(ptr, hval);		     \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                  \
   return p;								     \
 }									     \
 									     \
@@ -179,14 +148,11 @@ static struct DATA *PIKE_CONCAT(just_find_,DATA)(void *ptr)		     \
 {									     \
   struct DATA *p;                                                            \
   PIKE_HASH_T hval = ptr_hashfun(ptr);			                     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));                    \
   if(!PIKE_CONCAT(DATA,_hash_table)) {                                       \
-    DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                \
     return 0;                                                                \
   }                                                                          \
   hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1;		     \
   p=PIKE_CONCAT3(just_find_,DATA,_unlocked)(ptr, hval);			     \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                  \
   return p;								     \
 }									     \
 									     \
@@ -196,10 +162,8 @@ struct DATA *PIKE_CONCAT(make_,DATA)(void *ptr)				     \
 {									     \
   struct DATA *p;							     \
   PIKE_HASH_T hval = ptr_hashfun(ptr);			                     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));                    \
   hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1;		     \
   p=PIKE_CONCAT3(make_,DATA,_unlocked)(ptr,hval);                            \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                  \
   return p;								     \
 }									     \
 									     \
@@ -207,27 +171,22 @@ struct DATA *PIKE_CONCAT(get_,DATA)(void *ptr)			 	     \
 {									     \
   struct DATA *p;							     \
   PIKE_HASH_T hval = ptr_hashfun(ptr);			                     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));                    \
   hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1;		     \
   if(!(p=PIKE_CONCAT3(really_low_find_,DATA,_unlocked)(ptr, hval)))          \
     p=PIKE_CONCAT3(make_,DATA,_unlocked)(ptr, hval);		             \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                  \
   return p;                                                                  \
 }									     \
 									     \
 int PIKE_CONCAT3(check_,DATA,_semaphore)(void *ptr)			     \
 {									     \
   PIKE_HASH_T hval = ptr_hashfun(ptr);			                     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));                    \
   hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1;		     \
   if(PIKE_CONCAT3(really_low_find_,DATA,_unlocked)(ptr, hval))		     \
   {                                                                          \
-    DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                \
     return 0;								     \
   }                                                                          \
 									     \
   PIKE_CONCAT3(make_,DATA,_unlocked)(ptr, hval);			     \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                  \
   return 1;								     \
 }									     \
 									     \
@@ -235,7 +194,6 @@ void PIKE_CONCAT(move_,DATA)(struct DATA *block, void *new_ptr)		     \
 {									     \
   struct DATA **pp, *p;							     \
   PIKE_HASH_T hval = ptr_hashfun(block->PTR_HASH_ALLOC_DATA);		     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));		     \
   hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1;		     \
   pp=PIKE_CONCAT(DATA,_hash_table) + hval;                                   \
   while((p = *pp))							     \
@@ -253,17 +211,14 @@ void PIKE_CONCAT(move_,DATA)(struct DATA *block, void *new_ptr)		     \
     ((PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1);		     \
   block->BLOCK_ALLOC_NEXT = PIKE_CONCAT(DATA,_hash_table)[hval];	     \
   PIKE_CONCAT(DATA,_hash_table)[hval] = block;				     \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));		     \
 }									     \
 									     \
 int PIKE_CONCAT(remove_,DATA)(void *ptr)				     \
 {									     \
   struct DATA **pp, *p;							     \
   PIKE_HASH_T hval = ptr_hashfun(ptr);			                     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));                    \
   if(!PIKE_CONCAT(DATA,_hash_table))                                         \
   {                                                                          \
-    DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                \
     return 0;				                                     \
   }                                                                          \
   hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1;		     \
@@ -274,19 +229,16 @@ int PIKE_CONCAT(remove_,DATA)(void *ptr)				     \
     {									     \
       *pp = p->BLOCK_ALLOC_NEXT;					     \
       PIKE_CONCAT(num_,DATA)--;						     \
-      BA_UL(PIKE_CONCAT(really_free_,DATA))(p);				     \
-      DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));              \
+      PIKE_CONCAT(really_free_,DATA)(p);				     \
       return 1;								     \
     }									     \
     pp = &p->BLOCK_ALLOC_NEXT;						     \
   }									     \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                  \
   return 0;								     \
 }									     \
 									     \
-void PIKE_CONCAT3(low_init_,DATA,_hash)(size_t size)			     \
+static void PIKE_CONCAT3(low_init_,DATA,_hash)(size_t size)			     \
 {									     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));                    \
   PIKE_CONCAT(DATA,_hash_table_size)=					     \
      ptr_hash_find_hashsize(size);                                           \
 									     \
@@ -299,30 +251,27 @@ void PIKE_CONCAT3(low_init_,DATA,_hash)(size_t size)			     \
   }									     \
   MEMSET(PIKE_CONCAT(DATA,_hash_table),0,				     \
 	 sizeof(struct DATA *)*PIKE_CONCAT(DATA,_hash_table_size));	     \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                  \
 }									     \
 									     \
 									     \
-void PIKE_CONCAT3(init_,DATA,_hash)(void)				     \
+static void PIKE_CONCAT3(init_,DATA,_hash)(void)				     \
 {									     \
   PIKE_CONCAT3(low_init_,DATA,_hash)(BSIZE);		                     \
 }									     \
 									     \
-void PIKE_CONCAT3(exit_,DATA,_hash)(void)				     \
+static void PIKE_CONCAT3(exit_,DATA,_hash)(void)				     \
 {									     \
-  DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex)));                    \
   ba_free_all(& PIKE_CONCAT(DATA,_allocator));                               \
   free(PIKE_CONCAT(DATA,_hash_table));					     \
   PIKE_CONCAT(DATA,_hash_table)=0;					     \
   PIKE_CONCAT(num_,DATA)=0;						     \
-  DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));                  \
 }
 
 #define PTR_HASH_ALLOC_FIXED(DATA,BSIZE)				     \
-struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, PIKE_HASH_T hval);\
+static struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, PIKE_HASH_T hval);\
 LOW_PTR_HASH_ALLOC(DATA,BSIZE)                                               \
 									     \
-struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, PIKE_HASH_T hval) \
+static struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, PIKE_HASH_T hval) \
 {									     \
   struct DATA *p;							     \
 									     \
@@ -330,7 +279,7 @@ struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, PIKE_HASH_T hval) \
     Pike_fatal("Hash table error!\n"); )				     \
   PIKE_CONCAT(num_,DATA)++;						     \
 									     \
-  p=BA_UL(PIKE_CONCAT(alloc_,DATA))();					     \
+  p=PIKE_CONCAT(alloc_,DATA)();                                              \
   p->PTR_HASH_ALLOC_DATA=ptr;						     \
   p->BLOCK_ALLOC_NEXT=PIKE_CONCAT(DATA,_hash_table)[hval];		     \
   PIKE_CONCAT(DATA,_hash_table)[hval]=p;				     \
@@ -339,7 +288,7 @@ struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, PIKE_HASH_T hval) \
 
 
 #define PTR_HASH_ALLOC(DATA,BSIZE)					     \
-struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr,		     \
+static struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr,		     \
 						PIKE_HASH_T hval);	     \
 LOW_PTR_HASH_ALLOC(DATA,BSIZE)                                               \
                                                                              \
@@ -379,7 +328,7 @@ static void PIKE_CONCAT(DATA,_rehash)(void)				     \
   }									     \
 }									     \
 									     \
-struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr,		     \
+static struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr,		     \
 						PIKE_HASH_T hval)	     \
 {									     \
   struct DATA *p;							     \
@@ -396,7 +345,7 @@ struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr,		     \
     hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1;	     \
   }									     \
 									     \
-  p=BA_UL(PIKE_CONCAT(alloc_,DATA))();					     \
+  p=PIKE_CONCAT(alloc_,DATA)();                                              \
   p->PTR_HASH_ALLOC_DATA=ptr;						     \
   p->BLOCK_ALLOC_NEXT=PIKE_CONCAT(DATA,_hash_table)[hval];		     \
   PIKE_CONCAT(DATA,_hash_table)[hval]=p;				     \
diff --git a/src/block_alloc_h.h b/src/block_alloc_h.h
index 24fa542279bcbb28d6dd1a0c1bc21c49932491dc..37cd38c82dfea8d7bd5bc4ee9e37d706181219f5 100644
--- a/src/block_alloc_h.h
+++ b/src/block_alloc_h.h
@@ -30,16 +30,11 @@ BLOCK_ALLOC(DATA,BSIZE);					\
 extern struct DATA **PIKE_CONCAT(DATA,_hash_table);		\
 extern size_t PIKE_CONCAT(DATA,_hash_table_size);		\
 struct DATA *PIKE_CONCAT(find_,DATA)(void *ptr);		\
-struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)			\
-		(void *ptr, PIKE_HASH_T hval);			\
 struct DATA *PIKE_CONCAT(make_,DATA)(void *ptr);		\
 struct DATA *PIKE_CONCAT(get_,DATA)(void *ptr);			\
 int PIKE_CONCAT3(check_,DATA,_semaphore)(void *ptr);		\
 void PIKE_CONCAT(move_,DATA)(struct DATA *block, void *new_ptr); \
-int PIKE_CONCAT(remove_,DATA)(void *ptr);			\
-void PIKE_CONCAT3(low_init_,DATA,_hash)(size_t);		\
-void PIKE_CONCAT3(init_,DATA,_hash)(void);			\
-void PIKE_CONCAT3(exit_,DATA,_hash)(void);
+int PIKE_CONCAT(remove_,DATA)(void *ptr);
 
 #define PTR_HASH_ALLOC_FIXED(DATA,BSIZE)			\
 PTR_HASH_ALLOC(DATA,BSIZE)
diff --git a/src/global.h b/src/global.h
index d882f2f8dc301f84d11026965bb1cbc8cb0e7bdf..7522a868f42b21229a3006ddeb3324122562d9de 100644
--- a/src/global.h
+++ b/src/global.h
@@ -695,14 +695,7 @@ char *crypt(const char *, const char *);
 /* Compatibility... */
 #define USE_PIKE_TYPE	2
 
-#ifdef PIKE_RUN_UNLOCKED
-#define DO_IF_RUN_UNLOCKED(X) X
-#else
-#define DO_IF_RUN_UNLOCKED(X)
-#endif
-
 /* Used in more than one place, better put it here */
-
 #if defined(PROFILING)
 #define DO_IF_PROFILING(X) X
 #else
diff --git a/src/module.c b/src/module.c
index 1f6f02293e5593621bc16ab05b4cc136ff51e1bc..25bfdf5340b97ed1be7cc843c5cc909a742eea9f 100644
--- a/src/module.c
+++ b/src/module.c
@@ -350,7 +350,6 @@ static void exit_builtin_modules(void)
 
   cleanup_callbacks();
   free_all_callable_blocks();
-  exit_destroy_called_mark_hash();
 
   cleanup_pike_type_table();
   cleanup_shared_string_table();
diff --git a/src/multiset.h b/src/multiset.h
index 591764fcae3789a5d23c552c4b28528d9eaa456c..10a73018e1ced66f892d3a491fc1429dcf2bc62a 100644
--- a/src/multiset.h
+++ b/src/multiset.h
@@ -52,9 +52,6 @@ union msnode
 struct multiset_data
 {
   INT32 refs, noval_refs;
-#ifdef PIKE_RUN_UNLOCKED
-#error multiset_data has not been adapted for running unlocked.
-#endif
   union msnode *root, *free_list;
   struct svalue cmp_less;
   INT32 size, allocsize;
diff --git a/src/object.c b/src/object.c
index 96a45095683c48e08c0636d2109db9be7080ee29..7afbc3aaed56af15f4a3317fe282558898b593df 100644
--- a/src/object.c
+++ b/src/object.c
@@ -3279,6 +3279,8 @@ void exit_object(void)
     free_program(magic_types_program);
     magic_types_program=0;
   }
+
+  exit_destroy_called_mark_hash();
 }
 
 #ifdef PIKE_DEBUG
diff --git a/src/pike_cpulib.h b/src/pike_cpulib.h
index 318d88539d9fd00a8670adbf16bdd5beae7749c3..a7575f421ec7cc893cd2f46e86fcaaa94a043d54 100644
--- a/src/pike_cpulib.h
+++ b/src/pike_cpulib.h
@@ -56,427 +56,6 @@ PMOD_EXPORT void x86_get_cpuid(int oper, INT32 *cpuid_ptr);
 #endif
 #endif
 
-/* FIXME: Should we have an #ifdef PIKE_RUN_UNLOCKED here? -Hubbe
- * Good side: No problems compiling unless --run-unlocked is used
- * Bad side: Can't use these things for other purposes..
- */
-/* Since the memlock stuff doesn't work yet, I disable the code for now.
- *	/grubba
- */
-#ifdef PIKE_RUN_UNLOCKED
-
-#define pike_atomic_fool_gcc(x) (*(volatile struct { int a[100]; } *)x)
-
-
-/* These will work on any cpu, but should only be used as a
- * last resort. We must also define PIKE_NEED_MEMLOCK if we
- * use these. /Hubbe
- */
-#define BEGIN_MEMORY_LOCK(ADDR) do { \
-    PIKE_MUTEX_T *pike_mem_mutex=pike_memory_locks+ \
-        ((unsigned long)(ADDR))%PIKE_MEM_HASH; \
-    mt_lock(pike_mem_mutex)
-
-#define END_MEMORY_LOCK()  \
-    mt_unlock(pike_mem_mutex);  \
-  }while(0)
-
-#define pike_memlock(ADDR) do{				\
-    PIKE_MUTEX_T *pike_mem_mutex=pike_memory_locks+	\
-        ((unsigned long)(ADDR))%PIKE_MEM_HASH;		\
-    mt_lock(pike_mem_mutex)				\
-}while(0)
-
-#define pike_unmemlock(ADDR) do{			\
-    PIKE_MUTEX_T *pike_mem_mutex=pike_memory_locks+	\
-        ((unsigned long)(ADDR))%PIKE_MEM_HASH;		\
-    mt_unlock(pike_mem_mutex)				\
-}while(0)
-
-#define PIKE_NEED_MEMLOCK
-
-/* Autoconf this? */
-#if defined(__i386__) && defined(__GNUC__)
-
-/*
- * ia32 general purpose registers
- * "a" = %eax, "b" = %edx, "c" = %ecx, "d" = %edx
- * "S" = %esi, "D" = %edi, "B" = %ebp
- */
-
-
-#define PIKE_HAS_INC32
-static INLINE void pike_atomic_inc32(volatile INT32 *v)
-{
-  __asm__ __volatile__("lock ; incl %0"
-		       :"=m" (pike_atomic_fool_gcc(v))
-		       :"m" (pike_atomic_fool_gcc(v))
-                       :"cc");
-}
-
-
-#define PIKE_HAS_DEC_AND_TEST32
-static INLINE int pike_atomic_dec_and_test32(INT32 *v)
-{
-  unsigned char c;
-
-  __asm__ __volatile__("lock ; decl %0; setne %1"
-		       :"=m" (pike_atomic_fool_gcc(v)), "=qm" (c)
-		       :"m" (pike_atomic_fool_gcc(v))
-                       :"cc");
-  return c;
-}
-
-#define PIKE_HAS_COMPARE_AND_SWAP32
-static INLINE int
-pike_atomic_compare_and_swap32 (INT32 *p, INT32 oldval, INT32 newval)
-{
-  char ret;
-  INT32 readval;
-
-  __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
-			: "=q" (ret), "=m" (*p), "=a" (readval)
-			: "r" (newval), "m" (*p), "a" (oldval)
-			: "cc", "memory");
-  return ret;
-}
-
-
-/* NOT USED */
-#define PIKE_HAS_COMPARE_AND_SWAP64
-static INLINE int
-pike_atomic_compare_and_swap64 (INT64 *p, INT64 oldval, INT64 newval)
-{
-  char ret;
-#define HIGH(X) ((INT32 *)&(X))[1]
-#define LOW(X) ((INT32 *)&(X))[0]
-
-#if 1
-  INT32 t1, t2, t3;
-/*fprintf(stderr,"cas64(%p(%llx),%llx,%llx) << %d\n",p,*p,oldval,newval,ret);*/
-#if 0
-  __asm__ __volatile__ (
-    "xchgl %%ebx, %%edi ;"
-    "lock; cmpxchg8b (%%esi); sete %%al;"
-    "movl  %%edi, %%ebx; "
-    "movb  %%al, %0 "
-    :"=q" (ret),
-     "=a" (t1),"=d" (t2),"=D" (t3)
-    :"S" (p),
-     "1" (LOW(oldval)), "2" (HIGH(oldval)),
-     "3" (LOW(newval)), "c" (HIGH(newval))
-    :"cc", "memory");
-#else
-  __asm__ __volatile__ (
-    "xchgl %%ebx, %%edi ;"
-    "lock; cmpxchg8b (%%esi); sete %%al;"
-    "movl  %%edi, %%ebx; "
-    "movb  %%al, %0 "
-    :"=q" (ret),
-     "=a" (t1),"=d" (t2),"=D" (t3)
-    :"S" (p),
-     "a" (LOW(oldval)), "d" (HIGH(oldval)),
-     "D" (LOW(newval)), "c" (HIGH(newval))
-    :"cc", "memory");
-#endif
-/*fprintf(stderr,"cas64(%p(%llx),%llx,%llx) => %d\n",p,*p,oldval,newval,ret);*/
-#else
-  INT32 readval;
-  /* this doesn't work because GCC use %ebp for PIC code */
-  __asm__ __volatile__ ("lock; cmpxchg8b (%1); sete %0"
-			:"=q" (ret), "=m" (*p)
-			:"r" (newval), "m" (*p),
-			 "a" (LOW(oldval)),"d" (HIGH(oldval)),
-			 "b" (LOW(newval)),"c" (HIGH(newval))
-			: "cc", "memory");
-#endif
-  return ret;
-}
-
-#endif /* __i386__ && __GNUC__ */
-
-#if defined(__ia64__) && defined(__GNUC__)
-
-#define PIKE_HAS_COMPARE_AND_SWAP32
-
-static INLINE int
-pike_atomic_compare_and_swap32 (INT32 *p, INT32 oldval, INT32 newval)
-{
-  INT32 ret;
-
-  __asm__ __volatile__ ("mov ar.ccv = %1;\n"
-			"\t;;\n"
-			"\tcmpxchg4.rel.nta %0 = [%2], %3, ar.ccv"
-			: "=r" (ret)
-			: "r" (oldval), "r" (p), "r" (newval)
-			: "memory", "ar.ccv");
-  return ret == oldval;
-}
-
-#endif /* __ia64__ && __GNUC__ */
-
-#if defined(_M_IA64)
-
-#define PIKE_HAS_COMPARE_AND_SWAP32
-
-static INLINE int
-pike_atomic_compare_and_swap32 (INT32 *p, INT32 oldval, INT32 newval)
-{
-  return _InterlockedCompareExchange(p, newval, oldval) == oldval;
-}
-
-#endif /* _M_IA64 */
-
-#if defined(__sparc_v9__) && defined(__GNUC__)
-
-#define PIKE_HAS_COMPARE_AND_SWAP32
-
-static INLINE int
-pike_atomic_compare_and_swap32 (INT32 *p, INT32 oldval, INT32 newval)
-{
-  __asm__ __volatile__ ("membar #LoadStore\n"
-			"cas [%2], %3, %0"
-			: "=r" (newval)
-			: "0" (newval), "r" (p), "r" (oldval)
-			: "memory");
-  return newval == oldval;
-}
-
-#endif /* __sparc_v9__ && __GNUC__ */
-
-#if defined(__m68k__) && defined(__GNUC__)
-
-
-#define PIKE_HAS_COMPARE_AND_SWAP32
-
-static INLINE int
-pike_atomic_compare_and_swap32 (INT32 *p, INT32 oldval, INT32 newval)
-{
-  INT32 cmpval = oldval;
-
-  /* if (oldval == *p) {
-   *   *p = newval;
-   * } else {
-   *   oldval = *p;
-   * }
-   */
-  __asm__ __volatile__ ("casl %0, %3, %1;"
-			: "=d" (oldval), "=m", (*p)
-			: "0" (oldval), "d" (newval), "0" (p)
-			: "memory");
-  return oldval == cmpval;
-}
-
-#endif /* __m68k__ && __GNUC__ */
-
-
-
-/*
- * These functions are used if we don't have
- * compare-and-swap instructions available
- */
-#ifndef PIKE_HAS_COMPARE_AND_SWAP32
-
-#define PIKE_HAS_COMPARE_AND_SWAP32
-#undef PIKE_NEED_MEMLOCK
-#define PIKE_NEED_MEMLOCK
-
-#include "threads.h"
-
-static INLINE int
-pike_atomic_compare_and_swap32 (INT32 *p, INT32 oldval, INT32 newval)
-{
-  int ret;
-  BEGIN_MEMORY_LOCK(p);
-  if(ret == (*p == oldval)) *p=newval;
-  END_MEMORY_LOCK();
-  return ret;
-}
-
-
-#ifndef PIKE_HAS_INC32
-#define PIKE_HAS_INC32
-static INLINE void pike_atomic_inc32(INT32 *ref)
-{
-  BEGIN_MEMORY_LOCK(p);
-  ref++;
-  END_MEMORY_LOCK();
-}
-#endif /* PIKE_HAS_INC32 */
-
-#ifndef PIKE_HAS_DEC_AND_TEST32
-#define PIKE_HAS_DEC_AND_TEST32
-static INLINE int pike_atomic_dec_and_test32(INT32 *ref)
-{
-  INT32 ret;
-  BEGIN_MEMORY_LOCK(p);
-  ret=--ref;
-  END_MEMORY_LOCK();
-  return ret;
-}
-#endif /*  PIKE_HAS_DEC_AND_TEST32 */
-
-
-
-#ifndef PIKE_HAS_SWAP32
-#define PIKE_HAS_SWAP32
-static INLINE INT32 pike_atomic_swap32(INT32 *addr, INT32 newval)
-{
-  INT32 ret;
-  BEGIN_MEMORY_LOCK(p);
-  ret=*addr;
-  *addr=newval;
-  END_MEMORY_LOCK();
-  return ret;
-}
-#endif
-
-#endif /* PIKE_HAS_COMPARE_AND_SWAP32 */
-
-#if !defined(PIKE_HAS_COMPARE_AND_SWAP64) && defined(INT64)
-
-#define PIKE_HAS_COMPARE_AND_SWAP64
-#undef PIKE_NEED_MEMLOCK
-#define PIKE_NEED_MEMLOCK
-
-#include "threads.h"
-
-static INLINE int
-pike_atomic_compare_and_swap64 (INT64 *p, INT64 oldval, INT64 newval)
-{
-  int ret;
-  BEGIN_MEMORY_LOCK(p);
-  if(ret == (*p == oldval)) *p=newval;
-  END_MEMORY_LOCK();
-  return ret;
-}
-
-
-#ifndef PIKE_HAS_SWAP64
-#define PIKE_HAS_SWAP64
-static INLINE INT64 pike_atomic_swap64(INT64 *addr, INT64 newval)
-{
-  INT64 ret;
-  BEGIN_MEMORY_LOCK(p);
-  ret=*addr;
-  *addr=newval;
-  END_MEMORY_LOCK();
-  return ret;
-}
-#endif
-
-
-#ifndef PIKE_HAS_SET64
-#define PIKE_HAS_SET64
-static INLINE void pike_atomic_set64(INT64 *addr, INT64 newval)
-{
-  BEGIN_MEMORY_LOCK(p);
-  *addr=newval;
-  END_MEMORY_LOCK();
-}
-#endif
-
-#ifndef PIKE_HAS_GET64
-#define PIKE_HAS_GET64
-static INLINE INT64 pike_atomic_get64(INT64 *addr)
-{
-  INT64 ret;
-  BEGIN_MEMORY_LOCK(p);
-  ret=*addr;
-  END_MEMORY_LOCK();
-  return ret;
-}
-#endif
-
-
-#endif /* PIKE_HAS_COMPARE_AND_SWAP64 */
-
-
-
-/* These functions are used if we have
- * compare-and-swap, but not the rest of
- * the atomic functions
- */
-
-#if defined(PIKE_HAS_COMPARE_AND_SWAP32) && !defined(PIKE_HAS_INC32)
-#define PIKE_HAS_INC32
-static INLINE void pike_atomic_inc32(INT32 *ref)
-{
-  INT32 oldrefs;
-  do 
-    oldrefs=*ref;
-  while(! pike_atomic_compare_and_swap32(ref, oldrefs, oldrefs+1));
-}
-#endif
-
-
-#if defined(PIKE_HAS_COMPARE_AND_SWAP32) && !defined(PIKE_HAS_DEC_AND_TEST32)
-#define PIKE_HAS_DEC_AND_TEST32
-static INLINE int pike_atomic_dec_and_test32(INT32 *ref)
-{
-  INT32 oldrefs;
-  do 
-    oldrefs=*ref;
-  while(! pike_atomic_compare_and_swap32(ref, oldrefs, oldrefs-1));
-  return oldrefs-1;
-}
-#endif
-
-
-#if defined(PIKE_HAS_COMPARE_AND_SWAP32) && !defined(PIKE_HAS_SWAP32)
-#define PIKE_HAS_SWAP32
-static INLINE INT32 pike_atomic_swap32(INT32 *addr, INT32 newval)
-{
-  INT32 ret;
-  do
-  {
-    ret=*addr;
-  }while(!pike_atomic_compare_and_swap32(addr, ret, newval));
-  return ret;
-}
-#endif
-
-
-#if defined(PIKE_HAS_COMPARE_AND_SWAP64) && !defined(PIKE_HAS_SWAP64)
-#define PIKE_HAS_SWAP64
-static INLINE INT64 pike_atomic_swap64(INT64 *addr, INT64 newval)
-{
-  INT64 ret;
-  do
-  {
-    ret=*addr;
-  }while(!pike_atomic_compare_and_swap64(addr, ret, newval));
-  return ret;
-}
-#endif
-
-
-
-#if defined(PIKE_HAS_SWAP64) && !defined(PIKE_HAS_SET64)
-#define PIKE_HAS_SET64
-static INLINE void pike_atomic_set64(INT64 *addr, INT64 newval)
-{
-  pike_atomic_swap64(addr, newval);
-}
-#endif
-
-#if defined(PIKE_HAS_COMPARE_AND_SWAP64) && !defined(PIKE_HAS_GET64)
-#define PIKE_HAS_GET64
-static INLINE INT64 pike_atomic_get64(INT64 *addr)
-{
-  INT64 ret;
-  do
-  {
-    ret=*addr;
-  }while(!pike_atomic_compare_and_swap64(addr, ret, ret));
-  return ret;
-}
-#endif
-
-/* End emulating functions */
-
-#endif /* PIKE_RUN_UNLOCKED */
-
 #ifdef PIKE_NEED_MEMLOCK
 extern void init_pike_cpulib(void);
 #else
diff --git a/src/stralloc.c b/src/stralloc.c
index 54c483957a3024ccd127370c8818b17d17a02507..e9aca391aee6bc384c5229196e52c696c4651b89 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -40,37 +40,6 @@ static unsigned INT32 htable_mask;
 #define ULONG_MAX	UINT_MAX
 #endif
 
-#if PIKE_RUN_UNLOCKED
-/* Make this bigger when we get lightweight threads */
-#define BUCKET_LOCKS 2048
-static PIKE_MUTEX_T *bucket_locks;
-
-#define BUCKETLOCK(HVAL) \
- (bucket_locks + (HMODULO(hval__) & (BUCKET_LOCKS-1)))
-
-#define LOCK_BUCKET(HVAL) do {						    \
-  size_t hval__=(HVAL);							    \
-  PIKE_MUTEX_T *bucket_lock;						    \
-  while(1)								    \
-  {									    \
-    bucket_lock=BUCKETLOCK(hval__);                                         \
-    mt_lock(bucket_lock);						    \
-    if(bucket_lock == BUCKETLOCK(hval__))                                   \
-      break;								    \
-    mt_unlock(bucket_lock);						    \
-  }									    \
-}while(0)
-
-#define UNLOCK_BUCKET(HVAL) do {			\
-  size_t hval__=(HVAL);					\
-  mt_unlock(BUCKETLOCK(hval__));                        \
-}while(0)
-
-#else
-#define LOCK_BUCKET(HVAL)
-#define UNLOCK_BUCKET(HVAL)
-#endif /* PIKE_RUN_UNLOCKED */
-
 #define BEGIN_HASH_SIZE 1024
 
 static unsigned int hash_prefix_len=64;
@@ -414,7 +383,6 @@ static void locate_problem(int (*isproblem)(const struct pike_string *))
 
   for(e=0;e<htable_size;e++)
   {
-    LOCK_BUCKET(e);
     for(s=base_table[e];s;s=s->next)
     {
       if(isproblem(s))
@@ -426,7 +394,6 @@ static void locate_problem(int (*isproblem)(const struct pike_string *))
 	DM(add_marks_to_memhdr(no,s));
       }
     }
-    UNLOCK_BUCKET(e);
   }
 
   DM(fprintf(stderr,"Plausible problem location(s):\n"));
@@ -471,7 +438,6 @@ static struct pike_string *internal_findstring(const char *s,
   unsigned int prefix_depth=0;
 
   size_t h;
-  LOCK_BUCKET(hval);
   h=HMODULO(hval);
   for(curr = base_table[h]; curr; curr = curr->next)
   {
@@ -494,7 +460,6 @@ static struct pike_string *internal_findstring(const char *s,
       /* *prev = curr->next; */
       /* curr->next = *base; */
       /* *base = curr; */
-      UNLOCK_BUCKET(hval);
       return curr;		/* pointer to string */
     }
     depth++;
@@ -517,7 +482,6 @@ static struct pike_string *internal_findstring(const char *s,
 #endif /* 0 */
     need_more_hash_prefix_depth = prefix_depth;
   }
-  UNLOCK_BUCKET(hval);
   return 0; /* not found */
 }
 
@@ -633,22 +597,6 @@ static void stralloc_rehash(void)
   old=htable_size;
   old_base=base_table;
 
-#ifdef PIKE_RUN_UNLOCKED
-  mt_lock(bucket_locks);
-  if(old != htable_size)
-  {
-    /* Someone got here before us */
-    mt_lock(bucket_locks);
-    return;
-  }
-
-  /* Now that we have bucket zero, the hash table
-   * cannot change, go ahead and lock ALL buckets.
-   * NOTE: bucket zero is already locked
-   */
-  for(h=1;h<BUCKET_LOCKS;h++) mt_lock(bucket_locks+h);
-#endif
-
   SET_HSIZE( ++hashprimes_entry );
 
   base_table=xcalloc(sizeof(struct pike_string *), htable_size);
@@ -660,10 +608,6 @@ static void stralloc_rehash(void)
 
   if(old_base)
     free(old_base);
-
-#ifdef PIKE_RUN_UNLOCKED
-  for(h=0;h<BUCKET_LOCKS;h++) mt_unlock(bucket_locks + h);
-#endif
 }
 
 /* Allocation of strings */
@@ -741,14 +685,12 @@ static void link_pike_string(struct pike_string *s, size_t hval)
     Pike_fatal ("Got undefined contents in pike string %p.\n", s);
 #endif
 
-  LOCK_BUCKET(hval);
   h=HMODULO(hval);
   s->next = base_table[h];
   base_table[h] = s;
   s->hval=hval;
   s->flags &= ~(STRING_NOT_HASHED|STRING_NOT_SHARED);
   num_strings++;
-  UNLOCK_BUCKET(hval);
 
   if(num_strings > htable_size) {
     stralloc_rehash();
@@ -784,25 +726,9 @@ static void link_pike_string(struct pike_string *s, size_t hval)
       need_new_hashkey_depth = 0;
     }
 
-#ifdef PIKE_RUN_UNLOCKED
-    mt_lock(bucket_locks);
-    if(need_more_hash_prefix_depth <= 4)
-    {
-      /* Someone got here before us */
-      mt_lock(bucket_locks);
-      return;
-    }
-    for(h=1;h<BUCKET_LOCKS;h++) mt_lock(bucket_locks+h);
-#endif
-
-    if (need_more_hash_prefix_depth > 4) 
-    {
+    if (need_more_hash_prefix_depth > 4)
       hash_prefix_len=hash_prefix_len*2;
-#if 0
-      fprintf(stderr, "Doubling hash_prefix_len to %d and rehashing\n",
-	      hash_prefix_len);
-#endif /* 0 */
-    }
+
     /* NOTE: No need to update to the correct values, since that will
      *       be done on demand.
      */
@@ -825,9 +751,6 @@ static void link_pike_string(struct pike_string *s, size_t hval)
 	base_table[h2]=tmp2;
       }
     }
-#ifdef PIKE_RUN_UNLOCKED
-    for(h=0;h<BUCKET_LOCKS;h++) mt_unlock(bucket_locks + h);
-#endif
   }
 }
 
@@ -1136,7 +1059,6 @@ PMOD_EXPORT struct pike_string *debug_make_shared_string2(const p_wchar2 *str)
 static void unlink_pike_string(struct pike_string *s)
 {
   size_t h;
-  LOCK_BUCKET(s->hval);
   h= HMODULO(s->hval);
   propagate_shared_string(s,h);
 #ifdef PIKE_DEBUG
@@ -1149,7 +1071,6 @@ static void unlink_pike_string(struct pike_string *s)
   s->next=(struct pike_string *)(ptrdiff_t)-1;
 #endif
   num_strings--;
-  UNLOCK_BUCKET(s->hval);
   s->flags |= STRING_NOT_SHARED;
 }
 
@@ -1228,7 +1149,6 @@ struct pike_string *add_string_status(int verbose)
     struct pike_string *p;
     for(e=0;e<htable_size;e++)
     {
-      LOCK_BUCKET(e);
       for(p=base_table[e];p;p=p->next)
       {
 	int is_short = (p->len <= SHORT_STRING_THRESHOLD);
@@ -1245,7 +1165,6 @@ struct pike_string *add_string_status(int verbose)
 	alloced_bytes[key] +=
 	  p->refs*DO_ALIGN((p->len+3) << p->size_shift,sizeof(void *));
       }
-      UNLOCK_BUCKET(e);
     }
     string_builder_sprintf(&s,
 			   "\nShared string hash table:\n"
@@ -1387,7 +1306,6 @@ PMOD_EXPORT void verify_shared_strings_tables(void)
   for(e=0;e<htable_size;e++)
   {
     h=0;
-    LOCK_BUCKET(e);
     for(s=base_table[e];s;s=s->next)
     {
       num++;
@@ -1433,7 +1351,6 @@ PMOD_EXPORT void verify_shared_strings_tables(void)
 	h=0;
       }
     }
-    UNLOCK_BUCKET(e);
   }
   if(num != num_strings)
     Pike_fatal("Num strings is wrong %d!=%d\n",num,num_strings);
@@ -1446,16 +1363,13 @@ int safe_debug_findstring(struct pike_string *foo)
   for(e=0;e<htable_size;e++)
   {
     struct pike_string *p;
-    LOCK_BUCKET(e);
     for(p=base_table[e];p;p=p->next)
     {
       if(p==foo)
       {
-	UNLOCK_BUCKET(e);
 	return 1;
       }
     }
-    UNLOCK_BUCKET(e);
   }
   return 0;
 }
@@ -1476,7 +1390,6 @@ struct pike_string *debug_findstring(const struct pike_string *foo)
 	    (long)foo->len,
 	    foo->str);
 
-    LOCK_BUCKET(foo->hval);
     fprintf(stderr,"------ %p %ld\n",
 	    base_table[HMODULO(foo->hval)],
 	    foo->hval);
@@ -1488,11 +1401,9 @@ struct pike_string *debug_findstring(const struct pike_string *foo)
 	fprintf(stderr,"%p->",tmp2);
     }
     fprintf(stderr,"0\n");
-    UNLOCK_BUCKET(foo->hval);
 
     for(e=0;e<htable_size;e++)
     {
-      LOCK_BUCKET(e);
       for(tmp2=base_table[e];tmp2;tmp2=tmp2->next)
       {
 	if(tmp2 == tmp)
@@ -1500,7 +1411,6 @@ struct pike_string *debug_findstring(const struct pike_string *foo)
 		  (long)e,
 		  (long)HMODULO(foo->hval));
       }
-      UNLOCK_BUCKET(e);
     }
   }
 #endif /* 0 */
@@ -1551,14 +1461,12 @@ void dump_stralloc_strings(void)
   struct pike_string *p;
   for(e=0;e<htable_size;e++)
   {
-    LOCK_BUCKET(e);
     for(p=base_table[e];p;p=p->next) {
       debug_dump_pike_string(p, 70);
 #ifdef DEBUG_MALLOC
       debug_malloc_dump_references (p, 2, 1, 0);
 #endif
     }
-    UNLOCK_BUCKET(e);
   }
 }
 
@@ -2261,13 +2169,6 @@ void init_shared_string_table(void)
   SET_HSIZE(hashprimes_entry);
   base_table=xcalloc(sizeof(struct pike_string *), htable_size);
 
-#ifdef PIKE_RUN_UNLOCKED
-  {
-    int h;
-    bucket_locks=xalloc(sizeof(PIKE_MUTEX_T)*BUCKET_LOCKS);
-    for(h=0;h<BUCKET_LOCKS;h++) mt_init(bucket_locks + h);
-  }
-#endif
   empty_pike_string = make_shared_string("");
   empty_pike_string->flags |= STRING_CONTENT_CHECKED | STRING_IS_LOWERCASE | STRING_IS_UPPERCASE;
   empty_pike_string->min = empty_pike_string->max = 0;
@@ -2314,18 +2215,12 @@ void cleanup_shared_string_table(void)
 
   for(e=0;e<htable_size;e++)
   {
-    LOCK_BUCKET(e);
     for(s=base_table[e];s;s=next)
     {
       next=s->next;
-#ifdef REALLY_FREE
-      free_unlinked_pike_string(s);
-#else
       s->next=0;
-#endif
     }
     base_table[e]=0;
-    UNLOCK_BUCKET(e);
   }
   free(base_table);
   base_table=0;
@@ -2362,13 +2257,11 @@ void count_memory_in_strings(size_t *num, size_t *size)
   for(e=0;e<htable_size;e++)
   {
     struct pike_string *p;
-    LOCK_BUCKET(e);
     for(p=base_table[e];p;p=p->next)
     {
       num_++;
       size_ += memory_in_string (p);
     }
-    UNLOCK_BUCKET(e);
   }
 #ifdef PIKE_DEBUG
   if(num_strings != num_)
@@ -2427,10 +2320,8 @@ struct pike_string *next_pike_string (struct pike_string *s)
     size_t h = s->hval;
     do {
       h++;
-      LOCK_BUCKET(h);
       h = HMODULO(h);
       next = base_table[h];
-      UNLOCK_BUCKET(h);
     } while (!next);
   }
   return next;
@@ -3785,10 +3676,6 @@ PMOD_EXPORT double STRTOD_PCHARP(PCHARP nptr, PCHARP *endptr)
 
  underflow:
   /* Return an underflow error.  */
-#if 0
-  if (endptr != NULL)
-    *endptr = nptr;
-#endif
   errno = ERANGE;
   return 0.0;
   
diff --git a/src/svalue.h b/src/svalue.h
index 6a183a4c315fdffea6654692e55dd92f9af810a8..ba129c341bf7289103edb6ae9627f2c54ad00224 100644
--- a/src/svalue.h
+++ b/src/svalue.h
@@ -417,29 +417,8 @@ do{ \
 }while(0)
 
 
-#ifdef PIKE_RUN_UNLOCKED
-#define add_ref(X) pike_atomic_inc32(&(X)->refs)
-#define sub_ref(X) pike_atomic_dec_and_test32(&(X)->refs)
-
-#if 0
-#define IF_LOCAL_MUTEX(X) X
-#define USE_LOCAL_MUTEX
-#define pike_lock_data(X) mt_lock(&(X)->mutex)
-#define pike_unlock_data(X) mt_unlock(&(X)->mutex)
-#else
-#define IF_LOCAL_MUTEX(X)
-#define pike_lock_data(X) pike_lockmem((X))
-#define pike_unlock_data(X) pike_unlockmem((X))
-#endif
-
-#else
-#define IF_LOCAL_MUTEX(X)
-#define add_ref(X) (void)((X)->refs++)
+#define add_ref(X) ((void)((X)->refs++))
 #define sub_ref(X) (--(X)->refs > 0)
-#define pike_lock_data(X) (void)(X)
-#define pike_unlock_data(X) (void)(X)
-#endif
-
 
 #ifdef PIKE_DEBUG
 PMOD_EXPORT extern void describe(void *); /* defined in gc.c */
@@ -508,15 +487,8 @@ if(REFCOUNTED_TYPE(T) && (S)->refs && (S)->refs[0] <= 0) {\
 #ifdef DEBUG_MALLOC
 static INLINE struct svalue *dmalloc_check_svalue(struct svalue *s, char *l)
 {
-#if 0
-  /* What's this supposed to accomplish? Dmalloc tracks memory blocks,
-   * not single svalues that point to them. /mast */
-  debug_malloc_update_location(s,l);
-#endif
-#if 1
   if(s && REFCOUNTED_TYPE(TYPEOF(*s)))
     debug_malloc_update_location(s->u.refs,l);
-#endif
   return s;
 }
 
@@ -528,32 +500,20 @@ static INLINE struct svalue *dmalloc_check_svalues(struct svalue *s, size_t num,
 
 static INLINE union anything *dmalloc_check_union(union anything *u,int type, char * l)
 {
-#if 0
-  debug_malloc_update_location(u,l);
-#endif
-#if 1
   if(u && REFCOUNTED_TYPE(type))
     debug_malloc_update_location(u->refs,l);
-#endif
   return u;
 }
 
 #undef add_ref
-#undef sub_ref
-
-#ifdef PIKE_RUN_UNLOCKED
-#define add_ref(X) pike_atomic_inc32((INT32 *)debug_malloc_update_location( &((X)->refs), DMALLOC_NAMED_LOCATION(" add_ref")))
-#define sub_ref(X) pike_atomic_dec_and_test32((INT32 *)debug_malloc_update_location( &((X)->refs), DMALLOC_NAMED_LOCATION(" sub_ref")))
-#else
 #define add_ref(X) (((INT32 *)debug_malloc_update_location( &((X)->refs), DMALLOC_NAMED_LOCATION(" add_ref")))[0]++)
+#undef sub_ref
 #define sub_ref(X) (--((INT32 *)debug_malloc_update_location( &((X)->refs), DMALLOC_NAMED_LOCATION(" sub_ref")))[0] > 0)
-#endif
 
 #else  /* !DEBUG_MALLOC */
 #define dmalloc_check_svalue(S,L) (S)
 #define dmalloc_check_svalues(S,L,N) (S)
 #define dmalloc_check_union(U,T,L) (U)
-
 #endif	/* !DEBUG_MALLOC */
 
 /* To be used for type checking in macros. */
@@ -620,30 +580,18 @@ static INLINE struct callable *pass_callable (struct callable *c) {return c;}
     );									\
   } while (0)
 
-/* This define
- * should check that the svalue address (X) is on the local stack,
- * the processor stack or in a locked memory object
- *
- * Or, it could just try to make sure it's not in an unlocked memory
- * object...
- */
-#define assert_svalue_locked(X)
-
-
-#define swap_svalues_unlocked(X,Y)  do {		\
+#define swap_svalues(X,Y)  do {		\
   struct svalue *_a=(X);				\
   struct svalue *_b=(Y);				\
   struct svalue _tmp;					\
-  assert_svalue_locked(_a); assert_svalue_locked(_b);	\
   dmalloc_touch_svalue(_a);				\
   dmalloc_touch_svalue(_b);				\
   _tmp=*_a; *_a=*_b; *_b=_tmp;				\
 }while(0)
 
 /* Handles PIKE_T_FREE. */
-#define free_svalue_unlocked(X) do {				\
+#define free_svalue(X) do {				\
   struct svalue *_s=(X);					\
-  assert_svalue_locked(_s);					\
   DO_IF_DEBUG (							\
     if (TYPEOF(*_s) != PIKE_T_FREE) {				\
       check_svalue_type(_s);					\
@@ -664,10 +612,9 @@ static INLINE struct callable *pass_callable (struct callable *c) {return c;}
   }								\
 }while(0)
 
-#define free_short_svalue_unlocked(X,T) do {				\
+#define free_short_svalue(X,T) do {				\
   union anything *_s=(X); TYPE_T _t=(T);				\
   check_type(_t); check_refs2(_s,_t);					\
-  assert_svalue_locked(_s);						\
   if(REFCOUNTED_TYPE(_t) && _s->refs) {					\
     DO_IF_DEBUG (							\
       DO_IF_PIKE_CLEANUP (						\
@@ -680,7 +627,7 @@ static INLINE struct callable *pass_callable (struct callable *c) {return c;}
 }while(0)
 
 /* Handles PIKE_T_FREE. */
-#define add_ref_svalue_unlocked(X) do {				\
+#define add_ref_svalue(X) do {				\
   struct svalue *_tmp=(X);					\
   DO_IF_DEBUG (							\
     if (TYPEOF(*_tmp) != PIKE_T_FREE) {				\
@@ -692,7 +639,7 @@ static INLINE struct callable *pass_callable (struct callable *c) {return c;}
 }while(0)
 
 /* Handles PIKE_T_FREE. */
-#define assign_svalue_no_free_unlocked(X,Y) do {	\
+#define assign_svalue_no_free(X,Y) do {	\
   struct svalue *_to=(X);				\
   const struct svalue *_from=(Y);			\
   DO_IF_DEBUG (						\
@@ -708,7 +655,7 @@ static INLINE struct callable *pass_callable (struct callable *c) {return c;}
 }while(0)
 
 /* Handles PIKE_T_FREE. */
-#define assign_svalue_unlocked(X,Y) do {	\
+#define assign_svalue(X,Y) do {	\
   struct svalue *_to2=(X);			\
   const struct svalue *_from2=(Y);		\
   if (_to2 != _from2) {				\
@@ -908,124 +855,6 @@ static INLINE TYPE_FIELD dmalloc_gc_cycle_check_svalues (struct svalue *s, size_
 
 #endif /* !NO_PIKE_SHORTHAND */
 
-#if 0 /* PIKE_RUN_UNLOCKED */
-
-#include "pike_error.h"
-
-/*#define swap_svalues swap_svalues*/
-/*#define free_svalue free_svalue_unlocked*/
-/*#define free_short_svalue free_short_svalue_unlocked */
-/*#define add_ref_svalue add_ref_svalue_unlocked*/
-
-/*
- * These don't work right now - Hubbe
- */
-#define assign_svalue_no_free assign_svalue_no_free_unlocked
-#define assign_svalue assign_svalue_unlocked
-
-/* FIXME:
- * These routines assumes that pointers are 32 bit
- * and svalues 64 bit!!!!! - Hubbe
- */
-
-#ifndef swap_svalues 
-#define swap_svalues swap_svalues_unlocked
-#endif
-
-#ifndef free_svalue
-static INLINE void free_svalue(struct svalue *s)
-{
-  INT64 tmp;
-  struct svalue zero;
-  SET_SVAL(zero, PIKE_T_INT, NUMBER_NUMBER, integer, 0);
-  tmp=pike_atomic_swap64((INT64 *)s, *(INT64 *)&zero);
-  free_svalue_unlocked((struct svalue *)&tmp);
-}
-#endif
-
-#ifndef free_short_svalue
-static INLINE void free_short_svalue(union anything *s, int t)
-{
-  if(REFCOUNTED_TYPE(t))
-  {
-    INT32 tmp;
-    tmp=pike_atomic_swap32((INT32 *)s, 0);
-    free_short_svalue_unlocked((union anything *)&tmp, t);
-  }
-}
-#endif
-
-#ifndef add_ref_svalue
-static INLINE void add_ref_svalue(struct svalue *s)
-{
-  INT64 sv;
-  sv=pike_atomic_get64((INT64 *)s);
-  add_ref_svalue_unlocked((struct svalue *)&sv);
-}
-#endif
-
-#ifndef assign_svalue_no_free
-void assign_svalue_no_free(struct svalue *to, const struct svalue *from)
-{
-  INT64 tmp, sv;
-  sv=pike_atomic_get64((INT64 *)from);
-#ifdef PIKE_DEBUG
-  if(sv != *(INT64*)from)
-  {
-    fprintf(stderr,"pike_atomic_get64() is broken %llx != %llx (%08x%08x)!\n",
-	    sv,
-	    *(INT64*)from,
-	    ((INT32*)from)[1], ((INT32*)from)[0]);
-    abort();
-  }
-#endif
-  add_ref_svalue_unlocked((struct svalue *)&sv);
-  pike_atomic_set64((INT64 *)to, sv);
-#ifdef PIKE_DEBUG
-  if(*(INT64*)to != *(INT64*)from)
-  {
-    fprintf(stderr,"pike_atomic_set64() is broken!\n");
-    abort();
-  }
-#endif
-}
-#endif
-
-#ifndef assign_svalue
-static INLINE void assign_svalue(struct svalue *to, const struct svalue *from)
-{
-  INT64 tmp, sv;
-  if(to != from)
-  {
-    sv=pike_atomic_get64((INT64 *)from);
-    add_ref_svalue_unlocked((struct svalue *)&sv);
-    tmp=pike_atomic_swap64((INT64 *)to, sv);
-    free_svalue_unlocked((struct svalue *)&tmp);
-  }
-}
-#endif
-
-#else /* FOO_PIKE_RUN_UNLOCKED */
-#define swap_svalues swap_svalues_unlocked
-#define free_svalue free_svalue_unlocked
-#define free_short_svalue free_short_svalue_unlocked 
-#define add_ref_svalue add_ref_svalue_unlocked
-#define assign_svalue_no_free assign_svalue_no_free_unlocked
-#define assign_svalue assign_svalue_unlocked
-#endif /* FOO_PIKE_RUN_UNLOCKED */
-
-#ifdef PIKE_RUN_UNLOCKED
-#include "pike_threadlib.h"
-#endif
-
-/* 
- * Note to self:
- * It might be better to use a static array of mutexes instead
- * and just lock mutex ptr % array_size instead.
- * That way I wouldn't need a mutex in each memory object,
- * but it would cost a couple of cycles in every lock/unlock
- * operation instead.
- */
 #ifdef ATOMIC_SVALUE
 /* Atomic svalues: Store the type in the reference types,
  * instead of on the stack. This allows for changing an
@@ -1035,7 +864,6 @@ static INLINE void assign_svalue(struct svalue *to, const struct svalue *from)
   INT32 refs;				\
   INT32 ref_type			\
   DO_IF_SECURITY(; struct object *prot) \
-  IF_LOCAL_MUTEX(; PIKE_MUTEX_T mutex)
 
 #ifdef PIKE_SECURITY
 #ifdef USE_LOCAL_MUTEX
@@ -1057,13 +885,11 @@ static INLINE void assign_svalue(struct svalue *to, const struct svalue *from)
   v_->refs=0;						\
   add_ref(v_); /* For DMALLOC... */			\
   DO_IF_SECURITY( INITIALIZE_PROT(v_) );		\
-  IF_LOCAL_MUTEX(mt_init_recursive(&(v_->mutex)));	\
 }while(0)
 #else /* !ATOMIC_SVALUE */
 #define PIKE_MEMORY_OBJECT_MEMBERS	\
   INT32 refs				\
   DO_IF_SECURITY(; struct object *prot) \
-  IF_LOCAL_MUTEX(; PIKE_MUTEX_T mutex)
 
 #ifdef PIKE_SECURITY
 #ifdef USE_LOCAL_MUTEX
@@ -1084,14 +910,12 @@ static INLINE void assign_svalue(struct svalue *to, const struct svalue *from)
   v_->refs=0;						\
   add_ref(v_); /* For DMALLOC... */			\
   DO_IF_SECURITY( INITIALIZE_PROT(v_) );		\
-  IF_LOCAL_MUTEX(mt_init_recursive(&(v_->mutex)));	\
 }while(0)
 #endif /* ATOMIC_SVALUE */
 
 #define EXIT_PIKE_MEMOBJ(X) do {		\
   struct ref_dummy *v_=(struct ref_dummy *)(X);		\
   DO_IF_SECURITY( FREE_PROT(v_) );		\
-  IF_LOCAL_MUTEX(mt_destroy(&(v_->mutex)));	\
 }while(0)