in java/com/facebook/soloader/UnpackingSoSource.java [427:471]
private Runnable createSyncer(
final FileLocker lock,
final byte[] deps,
final File stateFileName,
final File depsFileName,
final DsoManifest manifest,
final Boolean quietly) {
return new Runnable() {
@Override
public void run() {
try {
try {
Log.v(TAG, "starting syncer worker");
// N.B. We can afford to write the deps file and the manifest file without
// synchronization or fsyncs because we've marked the DSO store STATE_DIRTY, which
// will cause us to ignore all intermediate state when regenerating it. That is,
// it's okay for the depsFile or manifestFile blocks to hit the disk before the
// actual DSO data file blocks as long as both hit the disk before we reset
// STATE_CLEAN.
try (RandomAccessFile depsFile = new RandomAccessFile(depsFileName, "rw")) {
depsFile.write(deps);
depsFile.setLength(depsFile.getFilePointer());
}
File manifestFileName = new File(soDirectory, MANIFEST_FILE_NAME);
try (RandomAccessFile manifestFile = new RandomAccessFile(manifestFileName, "rw")) {
manifest.write(manifestFile);
}
SysUtil.fsyncRecursive(soDirectory);
writeState(stateFileName, STATE_CLEAN);
} finally {
Log.v(TAG, "releasing dso store lock for " + soDirectory + " (from syncer thread)");
lock.close();
}
} catch (IOException ex) {
if (!quietly) {
throw new RuntimeException(ex);
}
}
}
};
}