John R. Jackson on Mon 27/01 21:37 -0500: > Correct. To do parallelism at user level would require something like > a shared memory buffer and forked processes (ala the two halves of > taper), or asynchronous I/O calls or threads, all of which use various > levels of OS specific capabilities (and stability).
What about just using the POSIX.1b AIO interface? Is looks reasonably portable. Failing that, using a shared mmap segment between one fork per tape might work. It could just be surrounded by the appropriate ifdefs for the OS facility. Which interface is preferred? I think just construction a single lio_listio() with an IO for each tape device participating in the stripe, then utilizing a MODE of LIO_WAIT to block until done, all in a single execution thread, could be simple to implement, no need for semaphores, locking etc, and if each drive is the same speed it would operate reasonably parallel. What do you think? I was thinking of putting this case if the special characters `[' and `]' are found in the RAIT string, so we could have devices like this: tapedev = "rait:/dev/rmt/{0,1,2,3[5]}n" would mean to set a RAIT5 volume up on the named devices, and it would just execute the old code if the brackets weren't present within the braces.