bd48dc15cc
Re-using the Binding of the XPath::Compiler#compile method would lead to race conditions, and possibly a memory leak due to the Binding sticking around for compiled Proc's lifetime. By using a dedicated class (and its corresponding Binding) we can work around this. Access to this class is not synchronized as compiled Procs don't mutate their enclosing environment. The race condition can be demonstrated using code such as the following: xml = <<-EOF <people> <person> <name>Alice</name> </person> <person> <name>Bob</name> </person> <person> <name>Eve</name> </person> </people> EOF 4.times.map do Thread.new do 10_000.times do document = Oga.parse_xml(xml) document.at_xpath('people/person/name').text end end end.each(&:join) Running this code would result in NoMethodErrors due to "at_xpath" returning a NilClass opposed to an Oga::XML::Element. |
||
---|---|---|
.. | ||
oga | ||
support | ||
spec_helper.rb |