[comp.sys.transputer] Parallel output on TDS2 for the PC

tempest@csuchico.uucp (Kenneth Lui) (04/28/89)

I'm just getting the feel of Occam 2 on TDS2.  I"ve written some simple
SEQtype programs and some ALTtype programs.  I'm having some problems
with PAR structures.  Specifically, I want to write a section of code that
would allow two or more parallel processes to output to the screen
concurrently.  I wanted to see if the output of one process within of a PAR
structure would be intermixed with another process.

I used the following code fragment:
	...
	PAR
	  SEQ
	    write.full.string(screen,"String from 'a'")
	    newline(screen)
	  SEQ
	    write.full.string(screen,"String from 'b'")
	    newline(screen)
	...

Needless to say, it doesn't work.  All I got was a big blank from the VDT,
except one carriagereturn or linefeed.  I looked through the example
programs in the c:\tdsxampl subdirectory and it uses other predefined
functions in c:\tdsiolib\interf.tsr.  Hunting through the documentation (which
I have limited access to), I read the section that talked about interf.tsr;
but it's all greek to me.  I kludged around with the functions mentioned,
but all my experiments went down the drain...  Can somebody offer some hints
as to how I might accomplish the above using either userio.tsr, or both
userio.tsr and interf.tsr?

Thanks very much,
Ken
tempest@csuchico.EDU

Link_-_APO@cup.portal.com (04/29/89)

One way to solve your problem is to create a multiplexor. As the name implied,
the multiplexor will "ALT"ternate between two or more input screen channels 
and writes the output to the "real" screen channel one at a time. This 
prevents processes from overriding data to the screen channel.

You can write the multiplexor using the ALT construct,such as,

   SEQ
     WHILE continue
       PRI ALT
         quit ? any
           SEQ
             continue :=FALSE
         ALT i=0 FOR n
           ... process input screen channels

Or you could use the scrstream.multiplexor PROC from INMOS-TDS by including:
"#USE interf" statement in your occam program.

Ahn Nuzen
Link Flight Simulation 
link_apo@cup.portal.com

ian@uowcsa.cs.uow.oz (Ian Gorton) (05/01/89)

In article <1989Apr27.120625.5348@csuchico.uucp>, tempest@csuchico.uucp (Kenneth Lui) writes:
> I'm just getting the feel of Occam 2 on TDS2.  I"ve written some simple
> SEQtype programs and some ALTtype programs.  I'm having some problems
> with PAR structures.  Specifically, I want to write a section of code that
          [deleted]
> I used the following code fragment:
> 	...
> 	PAR
> 	  SEQ
> 	    write.full.string(screen,"String from 'a'")
> 	    newline(screen)
> 	  SEQ
> 	    write.full.string(screen,"String from 'b'")
> 	    newline(screen)
> 	...
> 
> Needless to say, it doesn't work.  All I got was a big blank from the VDT,
> except one carriagereturn or linefeed.  I looked through the example

Yeah, the reason is that you're breaking one of the fundamental laws of
occam channels. You are attempting to write to the screen channel 
from TWO processes simultaneously. This is not allowed, as each channel
may only have one process outputting to it, and one inputting from it.

A library routine is your solution, it's documented in the 
PROGRAMMING INTERFACE section of the TDS manuals. The library process you 
need is called 'scrstream.multiplexor': it essentially multiplexes output
from a number of channels onto the 'real' screen channel. This sort of 
process is frequently required in occam programs.

So, to solve your problem you need,
   [2]CHAN OF ANY scr:
   CHAN OF INT stop:   -- to terminate multiplexor
   PAR
     scrstream.multiplexor(scr, screen, stop)
     SEQ
       PAR
         SEQ
           write.full.string(scr[0], " whatever")
           newline(scr[0])
         SEQ
           write.full.string(scr[1], "something else")
           newline(scr[0])
       stop ! 22  -- send any value to terminate multiplexor

The added complications come about because it's necessary to terminate 
the multiplexor process, and the signal to do this ( stop ! 22 ) must
be sent after EVERYTHING has been sent to the screen.

It should work! Don't forget to include the libraries.

Good luck,      Ian Gorton