From: Nasir Khan Date: 2007-06-10T02:54:38+09:00 Subject: Re: Synchronized attr_accessor ------=_Part_91863_6009548.1181411678663 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Prodding it further I could come up with a method synchronizer. For any class where method synchronization is required, mixin the MethodSynchronizer and implement a class level method sync_methods providing an array of methods to be synchronized. #----------------------- module MethodSynchronizer def MethodSynchronizer.included(into) into.sync_methods.each do |m| MethodSynchronizer.wrap_method(into, m) end end def MethodSynchronizer.wrap_method(klass, meth) klass.class_eval do alias_method "__nonsync_#{meth}", "#{meth}" require 'thread' define_method(meth) do |*args| @__ms_lock = Mutex.new unless @__ms_lock @__ms_lock.synchronize do self.send("__nonsync_#{meth}",*args) end end end end end #------------------------- Usage e.g. class D def self.sync_methods [:m1, :m2] end def m1 puts "hello" end def m2 puts "bye" end def m3 puts "not synchronized" end include MethodSynchronizer end Comments solicited. - Nasir On 6/8/07, Nasir Khan wrote: > Actually facets/more/synchash.rb does what I was looking for hash. > > Thanks > > On 6/8/07, Nasir Khan wrote: > > Yeah I see what you guys mean...I was a little delusional. Now I > > realize that I was looking for basically something equivalent to > > Java's - > > Collections.synchronizedMap(new HashMap(...)) > > ... > > Thanks > > > > > > > > > > On 6/8/07, MenTaLguY wrote: > > > On Sat, 9 Jun 2007 06:54:04 +0900, Nasir Khan wrote: > > > > There is no big picture. > > > > > > Since you had asked for feedback on anything you'd missed, I was trying to find out if was some mitigating factor in the specific way your program worked (the one for which you originally wrote this code), before telling you that it won't work. > > > > > > But -- unless the objects the attributes were set to were never modified, even if they didn't have the thread safety problems you already noted, the accessors generated still couldn't ensure thread safety. If thread 1 calls obj.some_accessor.foo, and thread 2 calls obj.some_accessor.bar (where #bar is some mutating method), some_accessor being synchronized simply _will not_ protect you. > > > > > > -mental > > > > > > > > > > > > > ------=_Part_91863_6009548.1181411678663--