comp.lang.ada
 help / color / mirror / Atom feed
From: brbarkstrom@gmail.com
Subject: Re: Exclusive file access
Date: Tue, 1 Sep 2015 05:37:43 -0700 (PDT)
Date: 2015-09-01T05:37:43-07:00	[thread overview]
Message-ID: <d012b0de-070c-4d90-a001-f38b752f80e6@googlegroups.com> (raw)
In-Reply-To: <eec18573-876b-4151-b13a-15a103bba30e@googlegroups.com>

On Thursday, August 27, 2015 at 9:52:36 AM UTC-4, ah...@marriott.org wrote:
> Dear All,
> 
> Obviously I'm misunderstanding something here.
> 
> I thought that if two processes tried to open the same file for write access then the second process would get an exception.
> 
> I have a simple example which when compiled using GnatPro 7.3.1 and run under 32-bit Windows XP demonstrates that this is not so.
> 
> Which then begs the question on how to detect if the file is in use and abort if it is.
> This should be simple but obviously too complex for my tiny brain.
> Does anyone know how to do this from Ada (without resorting to the OS directly)?
> 
> My simple test program is
> 
> package body Test is
> 
>   package Io renames Ada.Text_IO;
> 
>   procedure Work is
>     The_File : Io.File_Type;
>   begin
>     Io.Open (The_File, Io.Out_File, "Test.Txt");
>     for Count in Natural'value(Ada.Command_Line.Argument(1)) .. Natural'value(Ada.Command_Line.Argument(2)) loop
>       Io.Put_Line (The_File, "Count =" & Count'img);
>       Io.Put_Line ("Count =" & Count'img);
>       delay 1.0;
>     end loop;
>     Io.Close (The_File);
>   exception
>   when others =>
>     Io.Put_Line ("Exception");
>   end Work;
> 
> end Test;
> 
> If I execute this from one process with parameters 1 10 and then when it reaches 8 start the program again from a second process with parameters 3 7 on the same machine, the resultant file is a nice mixture! :-(
> 
> Count = 3
> Count = 4
> Count = 5
> Count = 6
> Count = 7
> Count = 6
> Count = 7
> Count = 8
> Count = 9
> Count = 10
> 
> This is not what I want. I want what the first instance produces and the second instance to fail. Surely nobody would want otherwise ;-)
> 
> Best wishes,
> Ahlan

When I first read this post, it seemed to me that if the program were
operating sequentially, it would be appropriate to use the Directories
package that already has functions or procedures to detect whether a
file exists and is open.  If you use those functions, you can detect
the problem and throw an exception (or some such).

If you're really wanting to do concurrent operations where different
tasks can access an open file, it seems to me that the appropriate
Ada approach is to embed the content of the file in a protected object
and use that capability to avoid the problems with the second file's
access.  Chapter 4 in McCormick, Singhoff, and Hugues [Building Parallel,
Embedded, and Real-Time Applications with Ada, 2005, Cambridge U Press]
has most of the material that you would need for this approach.

If you have to deal with unreliable components, then Burns and Wellings
book should have a pretty good start on the algorithms in their "Reader
Writer" example.

You might see if these suggestions would make your work a bit easier.

Bruce B.

  parent reply	other threads:[~2015-09-01 12:37 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-27 13:52 Exclusive file access ahlan
2015-08-27 14:27 ` gautier_niouzes
2015-08-31 23:20   ` Randy Brukardt
2015-09-01 16:23     ` Pascal Obry
2015-09-01 20:48       ` Randy Brukardt
2015-08-27 14:42 ` Björn Lundin
2015-08-27 14:48 ` G.B.
2015-08-27 15:08   ` Björn Lundin
2015-08-27 18:38     ` tmoran
2015-08-27 23:16     ` Georg Bauhaus
2015-08-27 23:29       ` Pascal Obry
2015-08-28  7:25         ` Georg Bauhaus
2015-08-27 15:15   ` ahlan
2015-08-27 18:29     ` Jeffrey R. Carter
2015-08-28  5:41 ` ahlan
2015-08-28  7:10   ` Georg Bauhaus
2015-08-28 17:40 ` ahlan
2015-08-28 19:49   ` Anh Vo
2015-08-28 21:06     ` Simon Wright
2015-08-28 21:38       ` Jeffrey R. Carter
2015-08-29  7:05   ` Dmitry A. Kazakov
2015-08-29  8:31     ` Pascal Obry
2015-08-29 12:02       ` Dmitry A. Kazakov
2015-08-30 11:35         ` Florian Weimer
2015-08-30 12:44           ` Dmitry A. Kazakov
2015-08-30 19:37             ` Florian Weimer
2015-08-31  7:22               ` Dmitry A. Kazakov
2015-08-31 21:12                 ` Florian Weimer
2015-09-01  7:26                   ` Dmitry A. Kazakov
2015-09-07 18:27                     ` Florian Weimer
2015-09-07 19:06                       ` Dmitry A. Kazakov
2015-09-11 16:54                         ` Florian Weimer
2015-08-31 23:34             ` Randy Brukardt
2015-09-01  7:33               ` Dmitry A. Kazakov
2015-08-29 16:07     ` gautier_niouzes
2015-08-29 17:12       ` Dmitry A. Kazakov
2015-09-01 12:37 ` brbarkstrom [this message]
2015-09-01 14:05 ` ahlan
2015-09-01 15:13   ` Simon Wright
2015-09-01 20:36     ` Randy Brukardt
2015-09-01 15:17   ` Jacob Sparre Andersen
2015-09-01 20:37     ` Randy Brukardt
2015-09-01 16:05   ` G.B.
2015-09-01 20:02   ` brbarkstrom
2015-09-01 21:17     ` Simon Wright
2015-09-05 15:52       ` Björn Lundin
2015-09-01 20:31   ` Randy Brukardt
2015-09-01 15:31 ` ahlan
2015-09-05 15:56   ` Björn Lundin
2015-09-06 17:38     ` brbarkstrom
2015-09-06 19:52       ` Björn Lundin
2015-09-07 15:18         ` brbarkstrom
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox