Gleb Natapov wrote: > On Tue, Mar 06, 2007 at 10:10:44AM +0100, Bert Wesarg wrote: >> Fix the double-check locking[1] by defining the cls_initialized member to >> volatile. >> >> Greetings >> >> Bert Wesarg >> >> [1]: http://en.wikipedia.org/wiki/Double-checked_locking > Can you explain how the Java example from this page applies to the code > in Open MPI? cls_initialized is set only after class is fully > initialized and usable. Sure:
in opal_object.c:opal_class_initialize(): if (1 == cls->cls_initialized) { return; } opal_atomic_lock(&class_lock); /* If another thread initializing this same class came in at roughly the same time, it may have gotten the lock and initialized. So check again. */ if (1 == cls->cls_initialized) { opal_atomic_unlock(&class_lock); return; } the compiler can optimize the second if check away, without being declared as volatile. Bert > >> > >> --- >> >> opal/class/opal_object.h | 2 +- >> 1 files changed, 1 insertion(+), 1 deletion(-) >> >> diff --quilt old/opal/class/opal_object.h new/opal/class/opal_object.h >> --- old/opal/class/opal_object.h >> +++ new/opal/class/opal_object.h >> @@ -148,11 +148,11 @@ typedef void (*opal_destruct_t) (opal_ob >> struct opal_class_t { >> const char *cls_name; /**< symbolic name for class */ >> opal_class_t *cls_parent; /**< parent class descriptor */ >> opal_construct_t cls_construct; /**< class constructor */ >> opal_destruct_t cls_destruct; /**< class destructor */ >> - int cls_initialized; /**< is class initialized */ >> + volatile int cls_initialized; /**< is class initialized */ >> int cls_depth; /**< depth of class hierarchy tree */ >> opal_construct_t *cls_construct_array; >> /**< array of parent class constructors >> */ >> opal_destruct_t *cls_destruct_array; >> /**< array of parent class destructors >> */ > >> _______________________________________________ >> devel mailing list >> de...@open-mpi.org >> http://www.open-mpi.org/mailman/listinfo.cgi/devel > > -- > Gleb. > _______________________________________________ > devel mailing list > de...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/devel