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
    

Reply via email to