|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8448 (0x2100) Types: TextFileVerbose Names: »tiostream«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system └─⟦6b41451d2⟧ └─⟦this⟧ »tiostream«
job jaba 9 600 time 5 0 prio 100 perm disc 50 1 ; file tiostream mini project ( mode list.yes biostream = set 0 biostream = pascal80 codelist.no distrenvir ioenvir scope user biostream finis ) process iostreamtest( var sv : system_vector ); (* test of one or more streams of input with dummy output action *) const max_no_of_children = 25; child_appetite = 300; max_no_of_buffers = 50; number_of_io_buffers = 1; timer_constant = 16000; (* time out constant *) type (* the type long is defined in distrenvir as: long = record high, low : integer; end; *) str_type = array ( 1 .. 80 ) of char; var sh : array ( 1 .. max_no_of_children ) of shadow; children,turns, step, step1, step2, prio, start_level, number_of_buffers : integer; buffers : pool max_no_of_buffers of opbuffer; z_in, z_out : zone; pool_in, pool_out : pool number_of_io_buffers of opbuffer; finis_sem, mainsem : semaphore; return_sem : array ( 1 .. max_no_of_children ) of semaphore; dummy_counter : long; (* number of dummy interrupts, level *) bref : reference; channel_repeat : boolean; (* channel .. repeat or repeat .. channel *) procedure write( str : str_type ); var str_index : integer; begin str_index := 1; while str( str_index ) <> '#' do begin outchar( z_out, str(str_index) ); str_index := str_index + 1; end; outend( z_out ); end; (* write *) procedure writeln( str : str_type ; number : integer ); begin write( str ); if number <> -10 then outnumber( z_out, number, 1 ); outchar( z_out, nl ); outend( z_out ); end; (* writeln *) procedure error(number : integer); (*output error text and index of child not created succesfully *) begin write("error in createcall, child index = "); outnumber(z_out,number,10); outchar(z_out,nl); end; (* error *) process switch(var switchsem , finissem : semaphore; turns , startlevel , bufno , priority : integer; chrep : boolean); type long = record high , low : integer end; const childappetite = 200; dummycountindex = 1021; lastdummyindex = 1020; var childname : alfa := 'child_'; isem , osem : semaphore; sref : reference; ishadow,oshadow : shadow; i , j : integer; procedure getregister(var v : integer; index : integer); external; process idriver(var isem : semaphore; chnumber : integer; chrep : boolean); const dummycountindex = 1021; var i : integer; waitsem : semaphore; iref , ch : reference; procedure clearlevel; external; procedure setregister(v , index : integer); external; begin if reservech(ch,chnumber,-1) <> 0 then i := i div (1-1) else begin setregister(0,dummycountindex); if chrep then channel ch do repeat wait(iref,isem); clearlevel; return(iref) until false else repeat wait(iref,isem); channel ch do clearlevel; return(iref); until false end end; (* idriver *) process odriver(var osem : semaphore; chnumber : integer); var i : integer; oref , ch : reference; begin if reservech(ch,chnumber,-1) <> 0 then i := i div(1-1) else channel ch do repeat wait(oref,osem); return(oref) until false end; (* odriver *) (****************************************) (* *) (* switch mainprogram *) (* *) (****************************************) begin childname(7) := 'i'; childname(8) := chr(startlevel div 10 + ord('0')); if create(childname,idriver(isem,startlevel+1,chrep), ishadow,childappetite) <> 0 then i := i div (1-1); start(ishadow,priority); childname(7) := 'o'; if create(childname,odriver(osem,startlevel), oshadow,childappetite) <> 0 then i := i div (1-1); start(oshadow,priority); for i := 1 to turns do for j := 1 to 20000 do begin wait(sref,switchsem); with sref^ do begin u1 := (1 + u1) mod 2; if u1 = 1 then signal(sref,isem) else signal(sref,osem) end end; i := 0; repeat wait(sref,switchsem); with sref^ do begin u1 := (1 + u1) mod 2; if u1 = 1 then begin i := i + 1; if i = bufno then begin lock sref as pip : long do begin getregister(pip.high,dummycountindex); getregister(pip.low,lastdummyindex) end; signal(sref,finissem) end else release(sref) end else signal(sref,osem) end until i = bufno end (* switch process *) ; procedure run(start_level, prio, index : integer); (* the child with identification index is created and made run with priority prio *) var child_name : alfa := 'switch'; begin child_name(7) := chr(index div 10 + ord("0")); child_name(8) := chr(index mod 10 + ord("0")); if create(child_name, switch(return_sem( index ), finis_sem, turns, start_level, number_of_buffers, prio, channel_repeat ), sh(index),child_appetite) <> 0 then error(index) else start(sh(index),prio); end; (* run *) begin (* main of father process *) (* initialize console communication *) openopzone( z_in, sv( operatorsem ), ref( mainsem ), number_of_io_buffers, pool_in, 1, 0, 0, 0 ); opin( z_in ); openopzone( z_out, sv( operatorsem ), ref( z_out.free ), number_of_io_buffers, pool_out, 2, 0, 0, 0 ); writeln( 'Welcome to the io stream test program # ', -10 ); own.timer := 0; definetimer(true); repeat (* main loop *) writeln(' number of streams ? #', -10 ); opwait( z_in, pool_in ); readinteger( z_in, children ); opin( z_in ); writeln( 'channel .. repeat ( 1 ) or repeat .. channel ( 0 )#', -10); opwait( z_in, pool_in ); readinteger( z_in, step ); opin( z_in ); channel_repeat := step = 1; writeln( 'priority of the switch processes ? #', -10 ); opwait( z_in, pool_in ); readinteger( z_in, prio ); opin(z_in); outchar( z_out, nl ); if children > max_no_of_children then children := children div ( 1-1 ); (* exit *) writeln('number of buffers ? #', -10); opwait( z_in, pool_in ); readinteger( z_in, number_of_buffers ); opin( z_in ); if number_of_buffers * children > max_no_of_buffers then number_of_buffers := max_no_of_buffers div children; writeln( 'number of turns (* 20000) ? #', -10); opwait( z_in, pool_in ); readinteger ( z_in, turns ); opin( z_in ); writeln('level for first input driver is outputlevel + 1#',-10); writeln('startlevel for first outputdriver ?#',-10); opwait(z_in,pool_in); readinteger(z_in,start_level); opin(z_in); for step2 := 1 to children do begin (* prepare buffers *) for step := 1 to number_of_buffers do begin alloc( bref, buffers, return_sem ( step2 ) ); bref ^ . u1 := 0; (* buffer prepared for input *) signal( bref, return_sem ( step2 ) ); end; writeln( 'start #', -10 ); outchar( z_out, bel ); outend( z_out ); run( start_level, prio (* the priority *) , step2 (* the index *) ); start_level := start_level + 2; end; own.timer := timer_constant; wait( bref, finis_sem ); (* get number of dummy interrupts *) lock bref as count_buffer : long do dummy_counter := count_buffer; release( bref ); for step := 2 to children do begin wait( bref, finis_sem ); release( bref ); end; outchar(z_out,bel); writeln("end of streams, seconds = #", timer_constant - own.timer); writeln("input parameters :#",-10); writeln("number of turns :#",turns); writeln("number of buffers :#",number_of_buffers); writeln("number of streams :#", children ); writeln("priority of the switch process(es)#", prio ); writeln("channel .. repeat ( 1 ) or repeat .. channel ( 0 )#", ord(channel_repeat) ); with dummy_counter do begin writeln('number of dummy interrupts: # ', high ); if high <> 0 then writeln(' level of last dummy interrupt: #', low ); end; for step := 1 to children do remove( sh ( step ) ); until false; end. «eof»