From: anon@att.net
Subject: Re: Termination of tasks waiting on a protected queue
Date: Sun, 18 May 2014 09:24:53 +0000 (UTC)
Date: 2014-05-18T09:24:53+00:00 [thread overview]
Message-ID: <ll9u93$ire$1@speranza.aioe.org> (raw)
In-Reply-To: slrnlngofv.i0l.lithiumcat@nat.rebma.instinctive.eu
try using a Select / terminate statements
task body Worker is
Job : Job_Description;
begin
loop
select
Queue.Get_Next (Job);
<actually to the job>
or
terminate ;
end select ;
end loop;
end Worker;
In <slrnlngofv.i0l.lithiumcat@nat.rebma.instinctive.eu>, Natasha Kerensikova <lithiumcat@instinctive.eu> writes:
>Hello,
>
>I have been having a task termination issue, and I'm wondering whether I
>got my design wrong or whether I'm missing something, so I ask you to
>help me on that.
>
>The basic need is delegating potentially long jobs to a dedicated task
>(or pool of tasks) so that the program flow generating the jobs and
>continue quickly. I furthermore assume that the jobs are "fire and
>forget", that there is no need to report anything about completion (or
>lack of thereof) to the code that generated the jobs (or more
>realistically, that reporting is performed through channels outside of
>the scope of the problem).
>
>So I went with the basic design below:
>
> package Example is
> type Job_Description is private;
>
> function Create_Job (...) return Job_Description;
> procedure Enqueue_Job (Job : in Job_Description);
>
> private
>
> package Job_Lists is new Ada.Containers.Doubly_Linked_Lists
> (Job_Description);
>
> protected Queue is
> procedure Append (Job : in Job_Description);
> entry Get_Next (Job : out Job_Description);
> private
> List : Job_Lists.List;
> Has_Job : Boolean := False;
> end Queue;
>
> task Worker is
> end Worker;
> end Example;
>
> package body Example is
> procedure Enqueue_Job (Job : in Job_Description) is
> begin
> Queue.Append (Job);
> end Enqueue_Job;
>
> protected body Queue is
> procedure Append (Job : in Job_Description) is
> begin
> List.Append (Job);
> Has_Job := True;
> end Append;
>
> entry Get_Next (Job : out Job_Description)
> when Has_Job is
> begin
> Job := List.First_Element;
> List.Delete_First;
> Has_Job := not List.Is_Empty;
> end Get_Next;
> end Queue;
>
> task body Worker is
> Job : Job_Description;
> begin
> loop
> Queue.Get_Next (Job);
> <actually to the job>
> end loop;
> end Worker;
> end Example;
>
>As you might have guessed, I have recently read a lot of material about
>Ravenscar profile, and as far as I can tell this example does match the
>profile, even though the original need happens in a much more relaxed
>environment.
>
>For example, without Ravenscar restrictions, the Worker task could
>easily be turned into a task type, and use an array of them to
>implement a pool of workers.
>
>The problem is, how to terminate cleanly the worker tasks in a
>non-Ravenscar environment when the main application is completed?
>
From my understanding of ARM 9.3, I need a terminate alternative in the
>worker tasks. But those can only exist in selective accepts, so I have
>to turn things around and make the task wait for one of its entries to
>be called, rather than wait for an external protected entry.
>
>But then, how can a worker task entry be used to solve my problem? A
>protected operation cannot call a task entry, because it's potentially
>blocking. The job generator cannot call the entry directly, because it
>would block when the task is not ready, so I still need a queue between
>the generator and the worker task.
>
>Alternatively, I could use a special value for Job_Description (or a new
>out parameter) to make the worker exit its infinite loop, and somehow
>make the protect Queue object aware that the master is completed, so
>that it can signal the worker task(s) to complete. But how can this be
>implemented? Since the tasks block the finalization of the master, I
>can't rely on a Finalize procedure to notify the protected object.
>
>
>Thanks in advance for your help,
>Natasha
next prev parent reply other threads:[~2014-05-18 9:24 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-18 7:32 Termination of tasks waiting on a protected queue Natasha Kerensikova
2014-05-18 9:24 ` anon [this message]
2014-05-18 19:43 ` Natasha Kerensikova
2014-05-18 17:16 ` Jeffrey Carter
2014-05-18 19:54 ` Natasha Kerensikova
2014-05-18 21:54 ` Jeffrey Carter
2014-05-18 18:42 ` sbelmont700
2014-05-18 18:48 ` Jeffrey Carter
2014-05-18 20:51 ` sbelmont700
2014-05-18 21:44 ` Jeffrey Carter
2014-05-19 21:49 ` Randy Brukardt
2014-05-20 7:54 ` Dmitry A. Kazakov
2014-05-20 7:58 ` Dmitry A. Kazakov
2014-05-18 23:05 ` Brad Moore
2014-05-19 7:28 ` Natasha Kerensikova
2014-05-27 11:08 ` Alejandro R. Mosteo
2014-05-28 1:04 ` Brad Moore
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox