Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,6 +0,0 @@
|
|||
package Synchronous_Concurrent is
|
||||
task Printer is
|
||||
entry Put(Item : in String);
|
||||
entry Get_Count(Count : out Natural);
|
||||
end Printer;
|
||||
end Synchronous_Concurrent;
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
with Ada.Text_Io; use Ada.Text_Io;
|
||||
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
|
||||
|
||||
package body Synchronous_Concurrent is
|
||||
|
||||
task body Printer is
|
||||
Num_Iter : Natural := 0;
|
||||
Line : Unbounded_String;
|
||||
begin
|
||||
loop
|
||||
select
|
||||
accept Put(Item : in String) do
|
||||
Line := To_Unbounded_String(Item);
|
||||
end Put;
|
||||
Put_Line(To_String(Line));
|
||||
Num_Iter := Num_Iter + 1;
|
||||
or
|
||||
accept Get_Count(Count : out Natural) do
|
||||
Count := Num_Iter;
|
||||
end Get_Count;
|
||||
or terminate;
|
||||
end select;
|
||||
end loop;
|
||||
end Printer;
|
||||
|
||||
end Synchronous_Concurrent;
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
with Synchronous_Concurrent; use Synchronous_Concurrent;
|
||||
with Ada.Text_Io; use Ada.Text_Io;
|
||||
|
||||
procedure Synchronous_Concurrent_Main is
|
||||
Num_Strings : Natural;
|
||||
The_File : File_Type;
|
||||
Line : String(1..255);
|
||||
Length : Natural;
|
||||
begin
|
||||
Open(File => The_File, Mode => In_File, Name => "input.txt");
|
||||
while not End_Of_File(The_File) loop
|
||||
Get_Line(File => The_File, Item => Line, Last => Length);
|
||||
Printer.Put(Line(1..Length));
|
||||
end loop;
|
||||
Close(The_File);
|
||||
Printer.Get_Count(Num_Strings);
|
||||
New_Line;
|
||||
Put_Line("The task wrote" & Natural'Image(Num_Strings) & " strings.");
|
||||
end Synchronous_Concurrent_Main;
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
sequence lines
|
||||
sequence count
|
||||
lines = {}
|
||||
count = {}
|
||||
|
||||
procedure read(integer fn)
|
||||
object line
|
||||
while 1 do
|
||||
line = gets(fn)
|
||||
if atom(line) then
|
||||
exit
|
||||
else
|
||||
lines = append(lines, line)
|
||||
task_yield()
|
||||
end if
|
||||
end while
|
||||
|
||||
lines = append(lines,0)
|
||||
while length(count) = 0 do
|
||||
task_yield()
|
||||
end while
|
||||
|
||||
printf(1,"Count: %d\n",count[1])
|
||||
end procedure
|
||||
|
||||
procedure write(integer fn)
|
||||
integer n
|
||||
object line
|
||||
n = 0
|
||||
while 1 do
|
||||
while length(lines) = 0 do
|
||||
task_yield()
|
||||
end while
|
||||
|
||||
line = lines[1]
|
||||
lines = lines[2..$]
|
||||
if atom(line) then
|
||||
exit
|
||||
else
|
||||
puts(fn,line)
|
||||
n += 1
|
||||
end if
|
||||
end while
|
||||
count = append(count,n)
|
||||
end procedure
|
||||
|
||||
integer fn
|
||||
atom reader, writer
|
||||
constant stdout = 1
|
||||
fn = open("input.txt","r")
|
||||
reader = task_create(routine_id("read"),{fn})
|
||||
writer = task_create(routine_id("write"),{stdout})
|
||||
task_schedule(writer,1)
|
||||
task_schedule(reader,1)
|
||||
|
||||
while length(task_list()) > 1 do
|
||||
task_yield()
|
||||
end while
|
||||
|
|
@ -1,55 +1,53 @@
|
|||
(notonline)-->
|
||||
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Synchronous_concurrency.exw</span>
|
||||
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- threads, file i/o, command_line()</span>
|
||||
<span style="color: #004080;">string</span> <span style="color: #000000;">filename</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">command_line</span><span style="color: #0000FF;">()[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span><span style="color: #008000;">".exe"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">".exw"</span><span style="color: #0000FF;">)</span>
|
||||
-- demo\rosetta\Synchronous_concurrency.exw
|
||||
without js -- threads, file i/o, command_line()
|
||||
string filename = substitute(command_line()[2],".exe",".exw")
|
||||
|
||||
<span style="color: #004080;">atom</span> <span style="color: #000000;">frThread</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- file reader thread</span>
|
||||
<span style="color: #000000;">lcThread</span> <span style="color: #000080;font-style:italic;">-- line counter thread</span>
|
||||
atom frThread, -- file reader thread
|
||||
lcThread -- line counter thread
|
||||
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">queue</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">qlock</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">init_cs</span><span style="color: #0000FF;">(),</span>
|
||||
<span style="color: #000000;">linecount</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
|
||||
sequence queue = {}
|
||||
integer qlock = init_cs(),
|
||||
linecount = 1
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">readfile</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"r"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #004080;">object</span> <span style="color: #000000;">line</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">gets</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">enter_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qlock</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">queue</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">queue</span><span style="color: #0000FF;">,</span><span style="color: #000000;">line</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">line</span> <span style="color: #0000FF;">=</span> <span style="color: #004080;">atom</span><span style="color: #0000FF;">(</span><span style="color: #000000;">line</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- kill refcount!</span>
|
||||
<span style="color: #7060A8;">leave_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qlock</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">line</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">wait_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lcThread</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Lines read: %d\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">linecount</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">exit_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure readfile()
|
||||
integer fn = open(filename,"r")
|
||||
while 1 do
|
||||
object line = gets(fn)
|
||||
enter_cs(qlock)
|
||||
queue = append(queue,line)
|
||||
line = atom(line) -- kill refcount!
|
||||
leave_cs(qlock)
|
||||
if line then exit end if
|
||||
end while
|
||||
close(fn)
|
||||
wait_thread(lcThread)
|
||||
printf(1,"Lines read: %d\n",linecount)
|
||||
exit_thread(0)
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">countlines</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">linecount</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #7060A8;">enter_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qlock</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">queue</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">leave_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qlock</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000080;font-style:italic;">-- sleep(0.1)</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #004080;">object</span> <span style="color: #000000;">line</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">queue</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #000000;">queue</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">queue</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]</span>
|
||||
<span style="color: #7060A8;">leave_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qlock</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #004080;">atom</span><span style="color: #0000FF;">(</span><span style="color: #000000;">line</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000080;font-style:italic;">-- ?line</span>
|
||||
<span style="color: #000000;">linecount</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #7060A8;">exit_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure countlines()
|
||||
linecount = 0
|
||||
while 1 do
|
||||
enter_cs(qlock)
|
||||
if length(queue)=0 then
|
||||
leave_cs(qlock)
|
||||
-- sleep(0.1)
|
||||
else
|
||||
object line = queue[1]
|
||||
queue = queue[2..$]
|
||||
leave_cs(qlock)
|
||||
if atom(line) then exit end if
|
||||
-- ?line
|
||||
linecount += 1
|
||||
end if
|
||||
end while
|
||||
exit_thread(0)
|
||||
end procedure
|
||||
|
||||
<span style="color: #000000;">lcThread</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">create_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">countlines</span><span style="color: #0000FF;">,{})</span>
|
||||
<span style="color: #000000;">frThread</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">create_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">readfile</span><span style="color: #0000FF;">,{})</span>
|
||||
lcThread = create_thread(countlines,{})
|
||||
frThread = create_thread(readfile,{})
|
||||
|
||||
<span style="color: #7060A8;">wait_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">frThread</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"done"</span><span style="color: #0000FF;">)</span>
|
||||
wait_thread(frThread)
|
||||
puts(1,"done")
|
||||
|
||||
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
|
||||
<!--
|
||||
{} = wait_key()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue