1 = Filesystem Access = 2 3 Within the [[ServerLibrary|filesystem server library]], a number of different 4 abstractions and mechanisms are employed to provide access to filesystem 5 objects. An overview of these abstractions is presented below. 6 7 ######## A graph showing the relationships between filesystem access 8 ######## components 9 10 {{{#!graphviz 11 #format svg 12 #transform notugly 13 digraph components { 14 node [fontsize="12.0",fontname="sans-serif",shape=box]; 15 edge [fontsize="12.0",fontname="sans-serif"]; 16 rankdir=LR; 17 18 subgraph { 19 rank=same; 20 21 Opener_note [shape=note,style=filled,fillcolor=gold,label="Exposes\nfile open\noperation"]; 22 Opener; 23 24 Opener_note -> Opener [dir=none,style=dotted]; 25 } 26 27 subgraph { 28 rank=same; 29 30 ResourceRegistry_note [shape=note,style=filled,fillcolor=gold,label="Records\nopen file\nsessions"]; 31 ResourceRegistry; 32 33 ResourceRegistry_note -> ResourceRegistry [dir=none,style=dotted]; 34 } 35 36 subgraph { 37 rank=same; 38 39 Resource_note [shape=note,style=filled,fillcolor=gold,label="Provides\nfilesystem\ncontent"]; 40 Resource [label="Resource\n(Pager)"]; 41 42 Resource_note -> Resource [dir=none,style=dotted]; 43 } 44 45 subgraph { 46 rank=same; 47 48 Provider_note [shape=note,style=filled,fillcolor=gold,label="Represents\nopen file"]; 49 Provider; 50 51 Provider_note -> Provider [dir=none,style=dotted]; 52 } 53 54 subgraph { 55 rank=same; 56 57 PageMapper_note [shape=note,style=filled,fillcolor=gold,label="Provides\npopulated\nfile pages"]; 58 PageMapper; 59 60 PageMapper_note -> PageMapper [dir=none,style=dotted]; 61 } 62 63 ProviderRegistry [shape=record,label="<head> ProviderRegistry | ... | { file-n | provider-n } | ... "]; 64 65 subgraph { 66 rank=same; 67 68 FileOpening_note [shape=note,style=filled,fillcolor=gold,label="Exposes\nfilesystem\nfunctionality"]; 69 FileOpening; 70 71 FileOpening_note -> FileOpening [dir=none,style=dotted]; 72 } 73 74 subgraph { 75 rank=same; 76 77 Accessor_note [shape=note,style=filled,fillcolor=gold,label="Populates\nfile pages"]; 78 Accessor; 79 Accessor_note -> Accessor [dir=none,style=dotted]; 80 } 81 82 /* Opening a file. */ 83 84 Opener -> ResourceRegistry -> Resource; 85 ResourceRegistry -> FileOpening; 86 87 Provider -> PageMapper; 88 FileOpening -> Accessor; 89 90 /* Closing a file. */ 91 92 Resource -> Provider -> ProviderRegistry:head; 93 94 /* Open file management. */ 95 96 ResourceRegistry -> ProviderRegistry:head; 97 } 98 }}} 99 100 ######## 101 102 An `Opener` requests a `Resource` from a `ResourceRegistry`, each `Resource` 103 acting as a [[ServerLibrary#Pager|`Pager`]] and providing the actual access 104 mechanism to file content for a particular program. Since many programs may 105 access the same file simultaneously, a `Provider` object represents a file 106 opened in the system, retaining a `PageMapper` that coordinates the collective 107 access to the file (see the [[Paging|paging documentation]] for more 108 information). 109 110 A `ProviderRegistry` maintains the record of opened files, yielding a new 111 `Provider` for an unopened file or an existing `Provider` for a file that is 112 already open. The `ProviderRegistry` monitors the usage of files, discarding 113 any `Provider` no longer in use. 114 115 == Opening a File == 116 117 Opening a file involves the identification of the filesystem object involved, 118 the acquisition of a `Provider` representing the file, and the creation of a 119 `Resource` to deliver file content to the requesting program. 120 121 ######## A graph showing the opening mechanism for an already-open file 122 123 {{{#!graphviz 124 #format svg 125 #transform notugly 126 digraph opening_open { 127 node [fontsize="12.0",fontname="sans-serif",shape=box]; 128 edge [fontsize="12.0",fontname="sans-serif"]; 129 rankdir=LR; 130 131 subgraph { 132 rank=same; 133 134 Opener_note [shape=note,style=filled,fillcolor=gold,label="Exposes\nfile open\noperation"]; 135 Opener; 136 137 Opener_note -> Opener [dir=none,style=dotted]; 138 } 139 140 subgraph { 141 rank=same; 142 143 ResourceRegistry_note [shape=note,style=filled,fillcolor=gold,label="Records\nopen file\nsessions"]; 144 ResourceRegistry; 145 146 Resource_returned [label="Resource\n(Pager)"]; 147 Resource_returned_note [shape=note,style=filled,fillcolor=gold,label="Provides\nfilesystem\ncontent"]; 148 149 ResourceRegistry_note -> ResourceRegistry [dir=none,style=dotted]; 150 Resource_returned -> Resource_returned_note [dir=none,style=dotted]; 151 } 152 153 subgraph { 154 rank=same; 155 156 Resource [label="Resource\n(Pager)"]; 157 158 FileOpening_note [shape=note,style=filled,fillcolor=gold,label="Exposes\nfilesystem\nfunctionality"]; 159 FileOpening; 160 161 FileOpening_note -> FileOpening [dir=none,style=dotted]; 162 } 163 164 subgraph { 165 rank=max; 166 167 ProviderRegistry_note [shape=note,style=filled,fillcolor=gold,label="Provides\nopen files"]; 168 ProviderRegistry; 169 170 Provider; 171 Provider_note [shape=note,style=filled,fillcolor=gold,label="Represents\nopen file"]; 172 173 ProviderRegistry_note -> ProviderRegistry [dir=none,style=dotted]; 174 Provider -> Provider_note [dir=none,style=dotted]; 175 } 176 177 /* Obtaining a resource from the registry. */ 178 179 Opener -> ResourceRegistry [label="get_resource"]; 180 ResourceRegistry -> Resource_returned [dir=none]; 181 Resource_returned -> Opener; 182 183 /* Obtaining a provider. */ 184 185 ResourceRegistry -> FileOpening [label="get_fileid"]; 186 ResourceRegistry -> ProviderRegistry [label="get(fileid)"]; 187 ProviderRegistry -> Provider; 188 189 /* Obtaining the resource from the provider. */ 190 191 ResourceRegistry -> Provider [label="make_resource"]; 192 Provider -> Resource [dir=none]; 193 Resource -> ResourceRegistry; 194 } 195 }}} 196 197 ######## 198 199 Where a provider does not already exist, with the file not having been opened 200 already, some extra interactions occur: 201 202 ######## A graph showing opening mechanism details for an unopened file 203 204 {{{#!graphviz 205 #format svg 206 #transform notugly 207 digraph opening_unopened { 208 node [fontsize="12.0",fontname="sans-serif",shape=box]; 209 edge [fontsize="12.0",fontname="sans-serif"]; 210 rankdir=LR; 211 212 Opener; 213 214 ResourceRegistry [label="ResourceRegistry"]; 215 216 subgraph { 217 rank=same; 218 219 Provider_note [shape=note,style=filled,fillcolor=gold,label="Created\nand set in\nregistry"]; 220 Provider [label="Provider"]; 221 222 Accessor [label="Accessor"]; 223 Accessor_note [shape=note,style=filled,fillcolor=gold,label="Created\nfor provider"]; 224 225 Provider_note -> Provider [dir=none,style=dotted]; 226 Accessor -> Accessor_note [dir=none,style=dotted]; 227 } 228 229 subgraph { 230 rank=max; 231 232 ProviderRegistry_note [shape=note,style=filled,fillcolor=gold,label="Records\nopen files"]; 233 ProviderRegistry [label="ProviderRegistry"]; 234 FileOpening [label="FileOpening"]; 235 FileOpening_note [shape=note,style=filled,fillcolor=gold,label="Exposes\nfilesystem\nfunctionality"]; 236 237 ProviderRegistry_note -> ProviderRegistry [dir=none,style=dotted]; 238 FileOpening -> FileOpening_note [dir=none,style=dotted]; 239 } 240 241 Opener -> ResourceRegistry [dir=none,style=dashed]; 242 243 /* Obtaining a new provider. */ 244 245 ResourceRegistry -> FileOpening [label="make_accessor"]; 246 FileOpening -> Accessor [dir=none]; 247 Accessor -> ResourceRegistry; 248 249 ResourceRegistry -> Provider [dir=none]; 250 Provider -> ProviderRegistry [label="set(fileid)"]; 251 } 252 }}} 253 254 ########