Remove enable_disk_heap setting
[hiphop-php.git] / hphp / hack / src / providers / file_provider.ml
blobfe661824c255695069f04396b0dba9b7f352c39a
1 (*
2 * Copyright (c) 2015, Facebook, Inc.
3 * All rights reserved.
5 * This source code is licensed under the MIT license found in the
6 * LICENSE file in the "hack" directory of this source tree.
8 *)
10 open Hh_prelude
13 Shared memory heap containing the contents of files.
14 Acts as a sort of caching facade which is filled on-demand
15 as contents are needed - The "cache" is filled by loading from
16 the file system if the file isn't opened in the IDE
17 (otherwise uses the IDE contents).
18 That is, the IDE version take precedence over file system's.
21 type file_type = Rust_provider_backend.File.file_type =
22 | Disk of string
23 | Ide of string
25 exception File_provider_stale
27 module FileHeap =
28 SharedMem.Heap
29 (SharedMem.ImmediateBackend (SharedMem.Evictable)) (Relative_path.S)
30 (struct
31 type t = file_type
33 let description = "File"
34 end)
36 let read_file_contents_from_disk (fn : Relative_path.t) : string option =
37 try Some (Sys_utils.cat (Relative_path.to_absolute fn)) with
38 | _ -> None
40 let get fn =
41 match Provider_backend.get () with
42 | Provider_backend.Analysis -> failwith "invalid"
43 | Provider_backend.Pessimised_shared_memory _
44 | Provider_backend.Shared_memory ->
45 FileHeap.get fn
46 | Provider_backend.Rust_provider_backend backend ->
47 Rust_provider_backend.File.get backend fn
48 | Provider_backend.Local_memory _
49 | Provider_backend.Decl_service _ ->
50 failwith "File_provider.get not supported with local/decl memory provider"
52 let get_unsafe fn =
53 match Provider_backend.get () with
54 | Provider_backend.Analysis -> failwith "invalid"
55 | Provider_backend.Pessimised_shared_memory _
56 | Provider_backend.Shared_memory ->
57 begin
58 match get fn with
59 | Some contents -> contents
60 | None -> failwith ("File not found: " ^ Relative_path.to_absolute fn)
61 end
62 | Provider_backend.Rust_provider_backend backend ->
63 begin
64 match Rust_provider_backend.File.get backend fn with
65 | Some contents -> contents
66 | None -> failwith ("File not found: " ^ Relative_path.to_absolute fn)
67 end
68 | Provider_backend.Local_memory _
69 | Provider_backend.Decl_service _ ->
70 failwith
71 "File_provider.get_unsafe not supported with local/decl memory provider"
73 let get_contents ?(force_read_disk = false) fn =
74 match Provider_backend.get () with
75 | Provider_backend.Analysis -> failwith "invalid"
76 | Provider_backend.Pessimised_shared_memory _
77 | Provider_backend.Shared_memory ->
78 let from_cache =
79 if force_read_disk then
80 None
81 else
82 FileHeap.get fn
84 (match from_cache with
85 | Some (Ide f) -> Some f
86 | Some (Disk contents) -> Some contents
87 | None ->
88 let contents =
89 Option.value (read_file_contents_from_disk fn) ~default:""
91 Some contents)
92 | Provider_backend.Rust_provider_backend backend ->
93 Some (Rust_provider_backend.File.get_contents backend fn)
94 | Provider_backend.Local_memory _
95 | Provider_backend.Decl_service _ ->
96 read_file_contents_from_disk fn
98 let get_ide_contents_unsafe fn =
99 match Provider_backend.get () with
100 | Provider_backend.Analysis -> failwith "invalid"
101 | Provider_backend.Pessimised_shared_memory _
102 | Provider_backend.Shared_memory ->
103 begin
104 match FileHeap.get fn with
105 | Some (Ide f) -> f
106 | _ -> failwith ("IDE file not found: " ^ Relative_path.to_absolute fn)
108 | Provider_backend.Rust_provider_backend backend ->
109 begin
110 match Rust_provider_backend.File.get backend fn with
111 | Some (Ide f) -> f
112 | _ -> failwith ("IDE file not found: " ^ Relative_path.to_absolute fn)
114 | Provider_backend.Local_memory _
115 | Provider_backend.Decl_service _ ->
116 failwith
117 ("File_provider.get_ide_contents_unsafe not supported "
118 ^ "with local/decl memory provider")
120 let provide_file_for_tests fn contents =
121 match Provider_backend.get () with
122 | Provider_backend.Analysis -> failwith "invalid"
123 | Provider_backend.Pessimised_shared_memory _
124 | Provider_backend.Shared_memory ->
125 FileHeap.add fn (Disk contents)
126 | Provider_backend.Rust_provider_backend backend ->
127 Rust_provider_backend.File.provide_file_for_tests backend fn contents
128 | Provider_backend.Local_memory _
129 | Provider_backend.Decl_service _ ->
130 failwith
131 "File_provider.provide_file_for_tests not supported with local/decl memory provider"
133 let provide_file_for_ide fn contents =
134 match Provider_backend.get () with
135 | Provider_backend.Analysis -> failwith "invalid"
136 | Provider_backend.Pessimised_shared_memory _
137 | Provider_backend.Shared_memory ->
138 FileHeap.add fn (Ide contents)
139 | Provider_backend.Rust_provider_backend backend ->
140 Rust_provider_backend.File.provide_file_for_ide backend fn contents
141 | Provider_backend.Local_memory _
142 | Provider_backend.Decl_service _ ->
143 failwith
144 "File_provider.provide_file_for_ide not supported with local/decl memory provider"
146 let provide_file_hint fn contents =
147 match Provider_backend.get () with
148 | Provider_backend.Analysis -> failwith "invalid"
149 | Provider_backend.Pessimised_shared_memory _
150 | Provider_backend.Shared_memory ->
151 (match contents with
152 | Ide _ -> FileHeap.add fn contents
153 | Disk _ -> ())
154 | Provider_backend.Rust_provider_backend backend ->
155 Rust_provider_backend.File.provide_file_hint backend fn contents
156 | Provider_backend.Local_memory _
157 | Provider_backend.Decl_service _ ->
158 failwith
159 "File_provider.provide_file_hint not supported with local/decl memory provider"
161 let remove_batch paths =
162 match Provider_backend.get () with
163 | Provider_backend.Analysis -> failwith "invalid"
164 | Provider_backend.Pessimised_shared_memory _
165 | Provider_backend.Shared_memory ->
166 FileHeap.remove_batch paths
167 | Provider_backend.Rust_provider_backend backend ->
168 Rust_provider_backend.File.remove_batch backend paths
169 | Provider_backend.Local_memory _
170 | Provider_backend.Decl_service _ ->
171 failwith
172 "File_provider.remove_batch not supported with local/decl memory provider"
174 let local_changes_push_sharedmem_stack () = FileHeap.LocalChanges.push_stack ()
176 let local_changes_pop_sharedmem_stack () = FileHeap.LocalChanges.pop_stack ()