23
23
import com .google .devtools .build .lib .actions .Artifact .SpecialArtifact ;
24
24
import com .google .devtools .build .lib .actions .Artifact .SpecialArtifactType ;
25
25
import com .google .devtools .build .lib .actions .Artifact .TreeFileArtifact ;
26
- import com .google .devtools .build .lib .skyframe .serialization .DeserializationContext ;
26
+ import com .google .devtools .build .lib .skyframe .serialization .AsyncDeserializationContext ;
27
+ import com .google .devtools .build .lib .skyframe .serialization .DeferredObjectCodec ;
27
28
import com .google .devtools .build .lib .skyframe .serialization .ObjectCodec ;
28
29
import com .google .devtools .build .lib .skyframe .serialization .SerializationContext ;
29
30
import com .google .devtools .build .lib .skyframe .serialization .SerializationException ;
30
31
import com .google .devtools .build .lib .vfs .PathFragment ;
32
+ import com .google .devtools .build .lib .vfs .Root ;
31
33
import com .google .protobuf .CodedInputStream ;
32
34
import com .google .protobuf .CodedOutputStream ;
33
35
import java .io .IOException ;
36
+ import java .util .function .Supplier ;
34
37
35
38
/** Codec implementations for {@link Artifact} subclasses. */
36
39
final class ArtifactCodecs {
37
40
38
41
@ SuppressWarnings ("unused" ) // Codec used by reflection.
39
- private static final class DerivedArtifactCodec implements ObjectCodec <DerivedArtifact > {
42
+ private static final class DerivedArtifactCodec extends DeferredObjectCodec <DerivedArtifact > {
40
43
41
44
@ Override
42
45
public Class <DerivedArtifact > getEncodedClass () {
@@ -53,17 +56,52 @@ public void serialize(
53
56
}
54
57
55
58
@ Override
56
- public DerivedArtifact deserialize (DeserializationContext context , CodedInputStream codedIn )
59
+ public Supplier <DerivedArtifact > deserializeDeferred (
60
+ AsyncDeserializationContext context , CodedInputStream codedIn )
57
61
throws SerializationException , IOException {
58
- ArtifactRoot root = context .deserialize (codedIn );
59
- PathFragment rootRelativePath = context .deserialize (codedIn );
60
- Object generatingActionKey = context .deserialize (codedIn );
61
- DerivedArtifact artifact =
62
+ DeserializedDerivedArtifactBuilder builder =
63
+ new DeserializedDerivedArtifactBuilder (
64
+ context .getDependency (ArtifactSerializationContext .class ));
65
+ context .deserializeFully (codedIn , builder , DeserializedDerivedArtifactBuilder ::setRoot );
66
+ context .deserializeFully (
67
+ codedIn , builder , DeserializedDerivedArtifactBuilder ::setRootRelativePath );
68
+ context .deserializeFully (
69
+ codedIn , builder , DeserializedDerivedArtifactBuilder ::setGeneratingActionKey );
70
+ return builder ;
71
+ }
72
+ }
73
+
74
+ private static class DeserializedDerivedArtifactBuilder implements Supplier <DerivedArtifact > {
75
+ private final ArtifactSerializationContext context ;
76
+ private ArtifactRoot root ;
77
+ private PathFragment rootRelativePath ;
78
+ private Object generatingActionKey ;
79
+
80
+ private DeserializedDerivedArtifactBuilder (ArtifactSerializationContext context ) {
81
+ this .context = context ;
82
+ }
83
+
84
+ @ Override
85
+ public DerivedArtifact get () {
86
+ return context .intern (
62
87
new DerivedArtifact (
63
88
root ,
64
89
getExecPathForDeserialization (root , rootRelativePath , generatingActionKey ),
65
- generatingActionKey );
66
- return context .getDependency (ArtifactSerializationContext .class ).intern (artifact );
90
+ generatingActionKey ));
91
+ }
92
+
93
+ private static void setRoot (DeserializedDerivedArtifactBuilder builder , Object value ) {
94
+ builder .root = (ArtifactRoot ) value ;
95
+ }
96
+
97
+ private static void setRootRelativePath (
98
+ DeserializedDerivedArtifactBuilder builder , Object value ) {
99
+ builder .rootRelativePath = (PathFragment ) value ;
100
+ }
101
+
102
+ private static void setGeneratingActionKey (
103
+ DeserializedDerivedArtifactBuilder builder , Object value ) {
104
+ builder .generatingActionKey = value ;
67
105
}
68
106
}
69
107
@@ -95,7 +133,7 @@ private static PathFragment getExecPathForDeserialization(
95
133
96
134
/** {@link ObjectCodec} for {@link SourceArtifact} */
97
135
@ SuppressWarnings ("unused" ) // Used by reflection.
98
- private static final class SourceArtifactCodec implements ObjectCodec <SourceArtifact > {
136
+ private static final class SourceArtifactCodec extends DeferredObjectCodec <SourceArtifact > {
99
137
100
138
@ Override
101
139
public Class <SourceArtifact > getEncodedClass () {
@@ -107,25 +145,55 @@ public void serialize(
107
145
SerializationContext context , SourceArtifact obj , CodedOutputStream codedOut )
108
146
throws SerializationException , IOException {
109
147
context .serialize (obj .getExecPath (), codedOut );
110
- context .serialize (obj .getRoot (), codedOut );
148
+ context .serialize (obj .getRoot (). getRoot () , codedOut );
111
149
context .serialize (obj .getArtifactOwner (), codedOut );
112
150
}
113
151
114
152
@ Override
115
- public SourceArtifact deserialize (DeserializationContext context , CodedInputStream codedIn )
153
+ public Supplier <SourceArtifact > deserializeDeferred (
154
+ AsyncDeserializationContext context , CodedInputStream codedIn )
116
155
throws SerializationException , IOException {
117
- PathFragment execPath = context .deserialize (codedIn );
118
- ArtifactRoot artifactRoot = context .deserialize (codedIn );
119
- ArtifactOwner owner = context .deserialize (codedIn );
120
- return context
121
- .getDependency (ArtifactSerializationContext .class )
122
- .getSourceArtifact (execPath , artifactRoot .getRoot (), owner );
156
+ DeserializedSourceArtifactBuilder builder =
157
+ new DeserializedSourceArtifactBuilder (
158
+ context .getDependency (ArtifactSerializationContext .class ));
159
+ context .deserializeFully (codedIn , builder , DeserializedSourceArtifactBuilder ::setExecPath );
160
+ context .deserializeFully (codedIn , builder , DeserializedSourceArtifactBuilder ::setRoot );
161
+ context .deserializeFully (codedIn , builder , DeserializedSourceArtifactBuilder ::setOwner );
162
+ return builder ;
163
+ }
164
+ }
165
+
166
+ private static class DeserializedSourceArtifactBuilder implements Supplier <SourceArtifact > {
167
+ private final ArtifactSerializationContext context ;
168
+ private PathFragment execPath ;
169
+ private Root root ;
170
+ private ArtifactOwner owner ;
171
+
172
+ private DeserializedSourceArtifactBuilder (ArtifactSerializationContext context ) {
173
+ this .context = context ;
174
+ }
175
+
176
+ @ Override
177
+ public SourceArtifact get () {
178
+ return context .getSourceArtifact (execPath , root , owner );
179
+ }
180
+
181
+ private static void setExecPath (DeserializedSourceArtifactBuilder builder , Object value ) {
182
+ builder .execPath = (PathFragment ) value ;
183
+ }
184
+
185
+ private static void setRoot (DeserializedSourceArtifactBuilder builder , Object value ) {
186
+ builder .root = (Root ) value ;
187
+ }
188
+
189
+ private static void setOwner (DeserializedSourceArtifactBuilder builder , Object value ) {
190
+ builder .owner = (ArtifactOwner ) value ;
123
191
}
124
192
}
125
193
126
194
// Keep in sync with DerivedArtifactCodec.
127
195
@ SuppressWarnings ("unused" ) // Used by reflection.
128
- private static final class SpecialArtifactCodec implements ObjectCodec <SpecialArtifact > {
196
+ private static final class SpecialArtifactCodec extends DeferredObjectCodec <SpecialArtifact > {
129
197
130
198
@ Override
131
199
public Class <SpecialArtifact > getEncodedClass () {
@@ -143,26 +211,66 @@ public void serialize(
143
211
}
144
212
145
213
@ Override
146
- public SpecialArtifact deserialize (DeserializationContext context , CodedInputStream codedIn )
214
+ public Supplier <SpecialArtifact > deserializeDeferred (
215
+ AsyncDeserializationContext context , CodedInputStream codedIn )
147
216
throws SerializationException , IOException {
148
- ArtifactRoot root = context .deserialize (codedIn );
149
- PathFragment rootRelativePath = context .deserialize (codedIn );
150
- Object generatingActionKey = context .deserialize (codedIn );
151
- SpecialArtifactType type = context .deserialize (codedIn );
152
- SpecialArtifact artifact =
153
- new SpecialArtifact (
154
- root ,
155
- getExecPathForDeserialization (root , rootRelativePath , generatingActionKey ),
156
- generatingActionKey ,
157
- type );
217
+ DeserializedSpecialArtifactBuilder builder =
218
+ new DeserializedSpecialArtifactBuilder (
219
+ context .getDependency (ArtifactSerializationContext .class ));
220
+ context .deserializeFully (codedIn , builder , DeserializedSpecialArtifactBuilder ::setRoot );
221
+ context .deserializeFully (
222
+ codedIn , builder , DeserializedSpecialArtifactBuilder ::setRootRelativePath );
223
+ context .deserializeFully (
224
+ codedIn , builder , DeserializedSpecialArtifactBuilder ::setGeneratingActionKey );
225
+ context .deserializeFully (codedIn , builder , DeserializedSpecialArtifactBuilder ::setType );
226
+ return builder ;
227
+ }
228
+ }
229
+
230
+ private static class DeserializedSpecialArtifactBuilder implements Supplier <SpecialArtifact > {
231
+ private final ArtifactSerializationContext context ;
232
+ private ArtifactRoot root ;
233
+ private PathFragment rootRelativePath ;
234
+ private Object generatingActionKey ;
235
+ private SpecialArtifactType type ;
236
+
237
+ private DeserializedSpecialArtifactBuilder (ArtifactSerializationContext context ) {
238
+ this .context = context ;
239
+ }
240
+
241
+ @ Override
242
+ public SpecialArtifact get () {
158
243
return (SpecialArtifact )
159
- context .getDependency (ArtifactSerializationContext .class ).intern (artifact );
244
+ context .intern (
245
+ new SpecialArtifact (
246
+ root ,
247
+ getExecPathForDeserialization (root , rootRelativePath , generatingActionKey ),
248
+ generatingActionKey ,
249
+ type ));
250
+ }
251
+
252
+ private static void setRoot (DeserializedSpecialArtifactBuilder builder , Object value ) {
253
+ builder .root = (ArtifactRoot ) value ;
254
+ }
255
+
256
+ private static void setRootRelativePath (
257
+ DeserializedSpecialArtifactBuilder builder , Object value ) {
258
+ builder .rootRelativePath = (PathFragment ) value ;
259
+ }
260
+
261
+ private static void setGeneratingActionKey (
262
+ DeserializedSpecialArtifactBuilder builder , Object value ) {
263
+ builder .generatingActionKey = value ;
264
+ }
265
+
266
+ private static void setType (DeserializedSpecialArtifactBuilder builder , Object value ) {
267
+ builder .type = (SpecialArtifactType ) value ;
160
268
}
161
269
}
162
270
163
271
@ SuppressWarnings ("unused" ) // Codec used by reflection.
164
272
private static final class ArchivedTreeArtifactCodec
165
- implements ObjectCodec <ArchivedTreeArtifact > {
273
+ extends DeferredObjectCodec <ArchivedTreeArtifact > {
166
274
167
275
@ Override
168
276
public Class <ArchivedTreeArtifact > getEncodedClass () {
@@ -181,24 +289,55 @@ public void serialize(
181
289
}
182
290
183
291
@ Override
184
- public ArchivedTreeArtifact deserialize (
185
- DeserializationContext context , CodedInputStream codedIn )
292
+ public Supplier < ArchivedTreeArtifact > deserializeDeferred (
293
+ AsyncDeserializationContext context , CodedInputStream codedIn )
186
294
throws SerializationException , IOException {
187
- SpecialArtifact treeArtifact = context .deserialize (codedIn );
188
- PathFragment derivedTreeRoot = context .deserialize (codedIn );
189
- PathFragment rootRelativePath = context .deserialize (codedIn );
295
+ DeserializedArchivedTreeArtifactBuilder builder =
296
+ new DeserializedArchivedTreeArtifactBuilder ();
297
+ context .deserializeFully (
298
+ codedIn , builder , DeserializedArchivedTreeArtifactBuilder ::setTreeArtifact );
299
+ context .deserializeFully (
300
+ codedIn , builder , DeserializedArchivedTreeArtifactBuilder ::setDerivedTreeRoot );
301
+ context .deserializeFully (
302
+ codedIn , builder , DeserializedArchivedTreeArtifactBuilder ::setRootRelativePath );
303
+ return builder ;
304
+ }
305
+ }
306
+
307
+ private static class DeserializedArchivedTreeArtifactBuilder
308
+ implements Supplier <ArchivedTreeArtifact > {
309
+ private SpecialArtifact treeArtifact ;
310
+ private PathFragment derivedTreeRoot ;
311
+ private PathFragment rootRelativePath ;
312
+
313
+ @ Override
314
+ public ArchivedTreeArtifact get () {
190
315
Object generatingActionKey =
191
316
treeArtifact .hasGeneratingActionKey ()
192
317
? treeArtifact .getGeneratingActionKey ()
193
318
: OMITTED_FOR_SERIALIZATION ;
194
-
195
319
return ArchivedTreeArtifact .createInternal (
196
320
treeArtifact , derivedTreeRoot , rootRelativePath , generatingActionKey );
197
321
}
322
+
323
+ private static void setTreeArtifact (
324
+ DeserializedArchivedTreeArtifactBuilder builder , Object value ) {
325
+ builder .treeArtifact = (SpecialArtifact ) value ;
326
+ }
327
+
328
+ private static void setDerivedTreeRoot (
329
+ DeserializedArchivedTreeArtifactBuilder builder , Object value ) {
330
+ builder .derivedTreeRoot = (PathFragment ) value ;
331
+ }
332
+
333
+ private static void setRootRelativePath (
334
+ DeserializedArchivedTreeArtifactBuilder builder , Object value ) {
335
+ builder .rootRelativePath = (PathFragment ) value ;
336
+ }
198
337
}
199
338
200
339
@ SuppressWarnings ("unused" ) // Used by reflection.
201
- private static final class TreeFileArtifactCodec implements ObjectCodec <TreeFileArtifact > {
340
+ private static final class TreeFileArtifactCodec extends DeferredObjectCodec <TreeFileArtifact > {
202
341
203
342
@ Override
204
343
public Class <TreeFileArtifact > getEncodedClass () {
@@ -215,13 +354,42 @@ public void serialize(
215
354
}
216
355
217
356
@ Override
218
- public TreeFileArtifact deserialize (DeserializationContext context , CodedInputStream codedIn )
357
+ public Supplier <TreeFileArtifact > deserializeDeferred (
358
+ AsyncDeserializationContext context , CodedInputStream codedIn )
219
359
throws SerializationException , IOException {
220
- SpecialArtifact parent = context .deserialize (codedIn );
221
- PathFragment parentRelativePath = context .deserialize (codedIn );
222
- Object generatingActionKey = context .deserialize (codedIn );
360
+ DeserializedTreeFileArtifactBuilder builder = new DeserializedTreeFileArtifactBuilder ();
361
+ context .deserializeFully (codedIn , builder , DeserializedTreeFileArtifactBuilder ::setParent );
362
+ context .deserializeFully (
363
+ codedIn , builder , DeserializedTreeFileArtifactBuilder ::setParentRelativePath );
364
+ context .deserializeFully (
365
+ codedIn , builder , DeserializedTreeFileArtifactBuilder ::setGeneratingActionKey );
366
+ return builder ;
367
+ }
368
+ }
369
+
370
+ private static class DeserializedTreeFileArtifactBuilder implements Supplier <TreeFileArtifact > {
371
+ private SpecialArtifact parent ;
372
+ private PathFragment parentRelativePath ;
373
+ private Object generatingActionKey ;
374
+
375
+ @ Override
376
+ public TreeFileArtifact get () {
223
377
return new TreeFileArtifact (parent , parentRelativePath , generatingActionKey );
224
378
}
379
+
380
+ private static void setParent (DeserializedTreeFileArtifactBuilder builder , Object value ) {
381
+ builder .parent = (SpecialArtifact ) value ;
382
+ }
383
+
384
+ private static void setParentRelativePath (
385
+ DeserializedTreeFileArtifactBuilder builder , Object value ) {
386
+ builder .parentRelativePath = (PathFragment ) value ;
387
+ }
388
+
389
+ private static void setGeneratingActionKey (
390
+ DeserializedTreeFileArtifactBuilder builder , Object value ) {
391
+ builder .generatingActionKey = value ;
392
+ }
225
393
}
226
394
227
395
private ArtifactCodecs () {}
0 commit comments