comp.lang.ada
 help / color / mirror / Atom feed
From: Georg Bauhaus <bauhaus@futureapps.invalid>
Subject: Re: Exclusive file access
Date: Fri, 28 Aug 2015 09:10:42 +0200
Date: 2015-08-28T09:10:42+02:00	[thread overview]
Message-ID: <mrp1e9$8aq$1@dont-email.me> (raw)
In-Reply-To: <6a59d964-2c77-484e-a002-6e17aafb6cd2@googlegroups.com>

On 28.08.15 07:41, ahlan@marriott.org wrote:
> Under Windows files may be opened exclusively or shared.

No, they can't if using any ISO standard language support? You need OS support from Windows
for lock management, be that with ISO C, or with ISO C++, or with ISO Ada. Using Unix and C,
you will require OS services available through open(2)/flock(2), or some additional library
such as POSIX flockfile(3), etc.. On Windows, with C or Ada, as you have mentioned before,
you need to call some OS functions from Win32, not from ANSI C. The LRMs are not saying things
about the OS or about POSIX or file system here, but about internal Ada file objects in relation
to their names. I think that the GNAT RM is is talking about these, too, not about locking
at external levels. (You may have noticed that Use_Error *is* raised on attempt of using
the same full name in different Ada tasks; these may not be processes.)

So, the name of GNAT's Form parameter, "SHARED" could be misleading: it does not refer
to what "shared" might mean in an OS context.

> In fact you can have a mixture such as single writer multiple readers.
> Multiple writers is possible but rarely used, so it is an odd choice for Gnat to have chosen.
> Using form="Shared=no" on the open using Gnat for Windows does not open the file exclusively with regard to other processes.
> Which is what I would have expected and I would have thought 99% of users would require.
> As far as I can see there is no way that a pure Gnat Ada program can open a file for output exclusively.
> If this is true then this is a severe weakness of Gnat.
> ObjectAda did what was expected by default.
>
> On Thursday, August 27, 2015 at 3:52:36 PM UTC+2, 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
>


  reply	other threads:[~2015-08-28  7:10 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 [this message]
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
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