I can now get a variation to compile; but it doesn't actually work -- it
crashes at runtime:
Traceback (most recent call last)
searchpdfscmd.nim(86) searchpdfscmd
searchpdfscmd.nim(82) main
searchpdfscmd.nim(50) doJobs
osproc.nim(240) inputHandle
SIGSEGV: Illegal storage access. (Attempt to read from nil?)
Error: execution of an external program failed:
'R:\searchpdfscmd\searchpdfscmd.exe v:\pdfs'
Here's the "improved" code (although it is much less nice than the original):
proc doJobs(config: Config) =
var processes = newSeq[Process](countProcessors())
# Initialize all the processes
for i in 0..processes.high:
var process = startProcess(config.subcommand,
options={poStdErrToStdOut, poDemon})
var fh = process.inputHandle()
var file: File
if open(file, fh, mode=fmWrite):
file.writeLine("*regex=", config.regex)
file.writeLine("*configured")
# Dish out the work to all the processes: TODO do it "fairly"
var i = 0
for filename in getFilenames(config):
var process = processes[i mod processes.len()]
var fh = process.inputHandle()
var file: File
if open(file, fh, mode=fmWrite):
file.writeLine(filename)
# Tell them there's no more work to do
for i in 0..processes.high:
var fh = processes[i].inputHandle()
var file: File
if open(file, fh, mode=fmWrite):
file.writeLine("*finished")
# Handle any results they produce
while processes.len() > 0:
var i = random(processes.len())
var process = processes[i]
if not process.running():
process.close()
processes.delete(i)
else:
var fh = processes[i].outputHandle()
var file: File
if open(file, fh):
for line in lines(file):
echo line