Branch: Tag:

2001-04-07

2001-04-07 07:38:26 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

added mutex code to each memory object (for --with-unlocked)

Rev: src/array.c:1.103
Rev: src/array.h:1.33
Rev: src/constants.c:1.29
Rev: src/constants.h:1.17
Rev: src/mapping.h:1.36
Rev: src/multiset.c:1.33
Rev: src/multiset.h:1.18
Rev: src/object.c:1.167
Rev: src/object.h:1.61
Rev: src/pike_cpulib.c:1.2
Rev: src/pike_cpulib.h:1.9
Rev: src/pike_threadlib.h:1.1
Rev: src/program.c:1.309
Rev: src/program.h:1.123
Rev: src/svalue.h:1.87
Rev: src/threads.h:1.113

5:   \*/      /* -  * $Id: svalue.h,v 1.86 2001/03/30 02:52:26 hubbe Exp $ +  * $Id: svalue.h,v 1.87 2001/04/07 07:38:25 hubbe Exp $    */   #ifndef SVALUE_H   #define SVALUE_H
53:    void *pointer_a, *pointer_b;   };    - struct ref_dummy - { -  INT32 refs; - }; + struct ref_dummy;      union anything   {
274:   #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 sub_ref(X) (--(X)->refs) -  + #define pike_lock_data(X) (void)(X) + #define pike_unlock_data(X) (void)(X)   #endif      
621:   #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. +  */ + #define PIKE_MEMORY_OBJECT_MEMBERS \ +  INT32 refs \ +  DO_IF_SECURITY(; struct object *prot) \ +  IF_LOCAL_MUTEX(; PIKE_MUTEX_T mutex)    -  + #define INIT_PIKE_MEMOBJ(X) do { \ +  struct ref_dummy *v_=(struct ref_dummy *)(X); \ +  v_->refs=1; \ +  DO_IF_SECURITY( INITIALIZE_PROT(v_) ); \ +  IF_LOCAL_MUTEX(mt_init_recursive(&(v_->mutex))); \ + }while(0) +  + #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) +  +  + struct ref_dummy + { +  PIKE_MEMORY_OBJECT_MEMBERS; + }; +    #endif /* !SVALUE_H */