def ignore_concurrent_calls *methods
methods.each do |meth|
mutex = "@__concurrent_protector_#{meth}"
flag = "@__concurrent_flag_#{meth}"
oldmeth = "__unprotected_#{meth}"
class_eval "alias \#{oldmeth} \#{meth}\ndef \#{meth}(*a, &b)\n\#{mutex} = Mutex.new unless defined? \#{mutex}\n\#{flag} = true unless defined? \#{flag}\nrun = \#{mutex}.synchronize do\nif \#{flag}\n\#{flag} = false\ntrue\nend\nend\nif run\nret = \#{oldmeth}(*a, &b)\n\#{mutex}.synchronize { \#{flag} = true }\nret\nend\nend\n"
end
end