require 'xml/libxml'

(1..10000).each{|time|
XML::Document.file('test.xml')
p time if time % 100 == 0
}
It won't segfault anymore, but now I get the following error:
Too many open filesI/O warning : failed to load external entity "test.xml"
libxml-test.rb:7:in `file': test.xml (IOError)
        from libxml-test.rb:7
        from libxml-test.rb:6:in `each'
        from libxml-test.rb:6
However, the error disappears if "GC.start" is inserted just above
XML::Document.file(...).

Right. This is another Ruby GC issue. If you don't call GC.start, then all the documents that you have created remain open. I assume this causes the OS to eventually run out of file handles, thus resulting in the error (which is being raised by libxml not Ruby).

By calling GC.start, the documents are freed and the file handles are released.

So I don't see this as a bug in the libxml bindings.


Hrm.... while it's not technically a libxml error, one could easily argue that libxml should call rb_gc_start() if the open fails and retry. I just committed a fix to trunk that fixes this scenario. It will still spew errors whenever the GC is called due to the lack of wrapping around libxml's error handling, but it's appropriate to leave that there for the time being. -sc

% ruby /tmp/test.rb
100
200
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
300
400
500
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
600
700
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
800
900
1000
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
1100
1200
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
1300
1400
1500
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
1600
1700
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
1800
1900
2000
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
2100
2200
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
2300
2400
2500
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
2600
2700
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
2800
2900
3000
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
3100
3200
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
3300
3400
3500
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
3600
3700
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
3800
3900
4000
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
4100
4200
4300
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
4400
4500
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
4600
4700
4800
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
4900
5000
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
5100
5200
5300
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
5400
5500
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
5600
5700
5800
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
5900
6000
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
6100
6200
6300
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
6400
6500
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
6600
6700
6800
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
6900
7000
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
7100
7200
7300
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
7400
7500
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
7600
7700
7800
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
7900
8000
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
8100
8200
8300
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
8400
8500
8600
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
8700
8800
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
8900
9000
9100
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
9200
9300
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
9400
9500
9600
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
9700
9800
Too many open filesToo many open filesI/O warning : failed to load external entity "test.xml"
logic 0
9900
10000

--
Sean Chittenden
[EMAIL PROTECTED]



_______________________________________________
libxml-devel mailing list
libxml-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/libxml-devel

Reply via email to