diff --git a/index.bs b/index.bs index 881fb19..5a75380 100644 --- a/index.bs +++ b/index.bs @@ -110,7 +110,9 @@ specifications do not need to bother implementing [=/file system entry=]'s Issue(101): Make access check algorithms associated with a FileSystemHandle. -Each [=/file system entry=] has an associated <dfn for="file system entry" id=entry-name>name</dfn> (a [=string=]). +Each [=/file system entry=] has an associated <dfn for="file system entry" id=entry-name>name</dfn> (a [=string=]), +a <dfn for="file system entry">lock</dfn> (a string that may exclusively be "`open`", "`taken-exclusive`" or "`taken-shared`") +and a <dfn for="file system entry">shared lock count</dfn> (a number representing the number of shared locks that are taken at a given point in time). A <dfn>valid file name</dfn> is a [=string=] that is not an empty string, is not equal to "." or "..", and does not contain '/' or any other character used as path separator on the underlying platform. @@ -124,22 +126,20 @@ Issue: We should consider having further normative restrictions on file names th never be allowed using this API, rather than leaving it entirely up to underlying file systems. -A <dfn export id=file>file entry</dfn> additionally consists of -<dfn for="file entry" export>binary data</dfn> (a [=byte sequence=]), a -<dfn for="file entry">modification timestamp</dfn> (a number representing the number of milliseconds since the <a spec=FileAPI>Unix Epoch</a>), -a <dfn for="file entry">lock</dfn> (a string that may exclusively be "`open`", "`taken-exclusive`" or "`taken-shared`") -and a <dfn for="file entry">shared lock count</dfn> (a number representing the number shared locks that are taken at a given point in time). - A user agent has an associated <dfn>file system queue</dfn> which is the result of [=starting a new parallel queue=]. This queue is to be used for all file system operations. <div algorithm> -To <dfn for="file entry/lock">take</dfn> a [=file entry/lock=] with a |value| of -"`exclusive`" or "`shared`" on a given [=file entry=] |file|: - -1. Let |lock| be the |file|'s [=file entry/lock=]. -1. Let |count| be the |file|'s [=file entry/shared lock count=]. +To <dfn for="file system entry" id=file-entry-lock-take>take a lock</dfn> with a |value| of +"`exclusive`" or "`shared`" on a given [=/file system entry=] |entry|: + +1. Let |lock| be the |entry|'s [=file system entry/lock=]. +1. Let |count| be the |entry|'s [=file system entry/shared lock count=]. +1. If |entry| is a [=directory entry=]: + 1. Let |descendantLockStatus| be the result of [=file system entry/checking for a descendant lock=] on |entry|. + 1. If |descendantLockStatus| is "`taken`": + 1. Return "`failure`". 1. If |value| is "`exclusive`": 1. If |lock| is "`open`": 1. Set lock to "`taken-exclusive`". @@ -159,11 +159,29 @@ Note: These steps have to be run on the [=file system queue=]. </div> <div algorithm> -To <dfn for="file entry/lock">release</dfn> a [=file entry/lock=] on a given -[=file entry=] |file|: +To <dfn for="file system entry">check for a descendant lock</dfn> on a given +[=directory entry=] |directory|: + +1. [=set/For each=] |child| of |directory|'s [=directory entry/children=]: + 1. Let |lock| be the |child|'s [=file system entry/lock=]. + 1. If |lock| is not "`open`": + 1. Return "`taken`". + 1. If |child| is a [=directory entry=]: + 1. Let |descendantLockStatus| be the result of [=file system entry/checking for a descendant lock=] on |child|. + 1. If |descendantLockStatus| is "`taken`": + 1. Return "`taken`". +1. Return "`open`". -1. Let |lock| be the |file|'s associated [=file entry/lock=]. -1. Let |count| be the |file|'s [=file entry/shared lock count=]. +Note: These steps have to be run on the [=file system queue=]. + +</div> + +<div algorithm> +To <dfn for="file system entry/lock">release</dfn> a [=file system entry/lock=] on a given +[=/file system entry=] |entry|: + +1. Let |lock| be the |entry|'s associated [=file system entry/lock=]. +1. Let |count| be the |entry|'s [=file system entry/shared lock count=]. 1. If |lock| is "`taken-shared`": 1. Decrease |count| by 1. 1. If |count| is 0, set |lock| to "`open`". @@ -176,6 +194,10 @@ Note: These steps have to be run on the [=file system queue=]. Note: Locks help prevent concurrent modifications to a file. A {{FileSystemWritableFileStream}} requires a shared lock, while a {{FileSystemSyncAccessHandle}} requires an exclusive one. +A <dfn export id=file>file entry</dfn> additionally consists of +<dfn for="file entry" export>binary data</dfn> (a [=byte sequence=]) and a +<dfn for="file entry">modification timestamp</dfn> (a number representing the number of milliseconds since the <a spec=FileAPI>Unix Epoch</a>). + A <dfn export id=directory>directory entry</dfn> additionally consists of a [=/set=] of <dfn for="directory entry">children</dfn>, which are themselves [=/file system entries=]. Each member is either a [=/file entry=] or a [=/directory entry=]. @@ -538,7 +560,7 @@ The <dfn method for=FileSystemFileHandle>getFile()</dfn> method steps are: the temporary file starts out empty, otherwise the existing file is first copied to this temporary file. - Creating a {{FileSystemWritableFileStream}} [=file entry/lock/take|takes a shared lock=] on the + Creating a {{FileSystemWritableFileStream}} [=file system entry/take a lock|takes a shared lock=] on the [=file entry=] [=locate an entry|locatable=] with |fileHandle|'s [=FileSystemHandle/locator=]. This prevents the creation of {{FileSystemSyncAccessHandle|FileSystemSyncAccessHandles}} for the entry, until the stream is closed. @@ -575,7 +597,7 @@ The <dfn method for=FileSystemFileHandle>createWritable(|options|)</dfn> method |result| with a "{{NotFoundError}}" {{DOMException}} and abort these steps. 1. [=Assert=]: |entry| is a [=file entry=]. - 1. Let |lockResult| be the result of [=file entry/lock/take|taking a lock=] + 1. Let |lockResult| be the result of [=file system entry/take a lock|taking a lock=] with "`shared`" on |entry|. 1. [=Queue a storage task=] with |global| to run these steps: @@ -603,7 +625,7 @@ The <dfn method for=FileSystemFileHandle>createWritable(|options|)</dfn> method [=file entry=] [=locate an entry|locatable=] by |fileHandle|'s [=FileSystemHandle/locator=]. To ensure the changes are reflected in this file, the handle can be flushed. - Creating a {{FileSystemSyncAccessHandle}} [=file entry/lock/take|takes an exclusive lock=] on the + Creating a {{FileSystemSyncAccessHandle}} [=file system entry/take a lock|takes an exclusive lock=] on the [=file entry=] [=locate an entry|locatable=] with |fileHandle|'s [=FileSystemHandle/locator=]. This prevents the creation of further {{FileSystemSyncAccessHandle|FileSystemSyncAccessHandles}} or {{FileSystemWritableFileStream|FileSystemWritableFileStreams}} @@ -645,7 +667,7 @@ The <dfn method for=FileSystemFileHandle>createSyncAccessHandle()</dfn> method s |result| with a "{{NotFoundError}}" {{DOMException}} and abort these steps. 1. [=Assert=]: |entry| is a [=file entry=]. - 1. Let |lockResult| be the result of [=file entry/lock/take|taking a lock=] + 1. Let |lockResult| be the result of [=file system entry/take a lock|taking a lock=] with "`exclusive`" on |entry|. 1. [=Queue a storage task=] with |global| to run these steps: @@ -1181,7 +1203,7 @@ given a [=file entry=] |file| in a [=/Realm=] |realm|: file on disk being written to. 1. [=Enqueue the following steps=] to the [=file system queue=]: - 1. [=file entry/lock/release|Release the lock=] on + 1. [=file system entry/lock/release|Release the lock=] on |stream|'s [=FileSystemWritableFileStream/[[file]]=]. 1. [=Queue a storage task=] with |file|'s [=relevant global object=] to [=/resolve=] |closeResult| with `undefined`. @@ -1189,7 +1211,7 @@ given a [=file entry=] |file| in a [=/Realm=] |realm|: 1. Return |closeResult|. 1. Let |abortAlgorithm| be these steps: 1. [=enqueue steps|Enqueue this step=] to the [=file system queue=]: - 1. [=file entry/lock/release|Release the lock=] on + 1. [=file system entry/lock/release|Release the lock=] on |stream|'s [=FileSystemWritableFileStream/[[file]]=]. 1. Let |highWaterMark| be 1. 1. Let |sizeAlgorithm| be an algorithm that returns `1`. @@ -1649,7 +1671,7 @@ The <dfn method for=FileSystemSyncAccessHandle>flush()</dfn> method steps are: : |handle| . {{FileSystemSyncAccessHandle/close()}} :: Closes the access handle or no-ops if the access handle is already closed. This disables any further operations on it and - [=file entry/lock/release|releases the lock=] on the + [=file system entry/lock/release|releases the lock=] on the [=FileSystemSyncAccessHandle/[[file]]=] associated with |handle|. </div> @@ -1661,7 +1683,7 @@ The <dfn method for=FileSystemSyncAccessHandle>close()</dfn> method steps are: 1. Set |lockReleased| to false. 1. Let |file| be [=this=]'s [=FileSystemSyncAccessHandle/[[file]]=]. 1. [=Enqueue the following steps=] to the [=file system queue=]: - 1. [=file entry/lock/release|Release the lock=] on |file|. + 1. [=file system entry/lock/release|Release the lock=] on |file|. 1. Set |lockReleased| to true. 1. [=Pause=] until |lockReleased| is true.