“build hikey960 error”的版本间的差异
来自个人维基
free6d1823(讨论 | 贡献) |
free6d1823(讨论 | 贡献) |
||
第1行: | 第1行: | ||
− | Host: | + | Host:Linux 4.4.0-142-generic #168-Ubuntu x86_64 x86_64 x86_64 GNU/Linux |
Log: | Log: | ||
第25行: | 第25行: | ||
art/libartbase/base/scoped_flock.cc | art/libartbase/base/scoped_flock.cc | ||
<source lang="c"> | <source lang="c"> | ||
− | |||
− | + | ScopedFlock LockedFile::DupOf(const int fd, const std::string& path, | |
+ | const bool read_only_mode, std::string* error_msg) { | ||
+ | // NOTE: We don't check usage here because the ScopedFlock should *never* be | ||
+ | // responsible for flushing its underlying FD. Its only purpose should be | ||
+ | // to acquire a lock, and the unlock / close in the corresponding | ||
+ | // destructor. Callers should explicitly flush files they're writing to if | ||
+ | // that is the desired behaviour. | ||
+ | ScopedFlock locked_file( | ||
+ | new LockedFile(DupCloexec(fd), path, /* check_usage= */ false, read_only_mode)); | ||
+ | if (locked_file->Fd() == -1) { | ||
+ | *error_msg = StringPrintf("Failed to duplicate open file '%s': %s", | ||
+ | locked_file->GetPath().c_str(), strerror(errno)); | ||
+ | return nullptr; | ||
+ | } | ||
+ | if (0 != TEMP_FAILURE_RETRY(flock(locked_file->Fd(), LOCK_EX))) { | ||
+ | *error_msg = StringPrintf( | ||
+ | "Ignore: Failed to lock file '%s': %s", locked_file->GetPath().c_str(), strerror(errno)); | ||
+ | return nullptr; | ||
+ | } | ||
− | + | return locked_file; | |
− | + | ||
− | + | } | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</source> | </source> |
2019年10月12日 (六) 09:59的版本
Host:Linux 4.4.0-142-generic #168-Ubuntu x86_64 x86_64 x86_64 GNU/Linux
Log:
dex2oatd E 09-23 23:04:07 174391 174391 dex2oat.cc:2234] Cannot lock profiles: Failed to lock file 'out/soong/hikey960/dex_bootjars/boot.prof': Bad file descriptor dex2oatd E 09-23 23:04:07 174391 174391 dex2oat.cc:2842] Failed to process profile file ERROR: Dex2oat failed to compile a boot image.It is likely that the boot classpath is inconsistent.Rebuild with ART_BOOT_IMAGE_EXTRA_ARGS="--runtime-arg -verbose:verifier" to see verification errors.
Cause:
art/dex2oat/dex2oat.cc
bool LoadProfile() { .. if (profile_file_fd_ != -1) { profile_file = LockedFile::DupOf(profile_file_fd_, "profile", true /* read_only_mode */, &error); } else if (profile_file_ != "") { profile_file = LockedFile::Open(profile_file_.c_str(), O_RDONLY, true, &error); } // Return early if we're unable to obtain a lock on the profile. if (profile_file.get() == nullptr) { LOG(ERROR) << "Cannot lock profiles: " << error; return false; } }
art/libartbase/base/scoped_flock.cc
ScopedFlock LockedFile::DupOf(const int fd, const std::string& path, const bool read_only_mode, std::string* error_msg) { // NOTE: We don't check usage here because the ScopedFlock should *never* be // responsible for flushing its underlying FD. Its only purpose should be // to acquire a lock, and the unlock / close in the corresponding // destructor. Callers should explicitly flush files they're writing to if // that is the desired behaviour. ScopedFlock locked_file( new LockedFile(DupCloexec(fd), path, /* check_usage= */ false, read_only_mode)); if (locked_file->Fd() == -1) { *error_msg = StringPrintf("Failed to duplicate open file '%s': %s", locked_file->GetPath().c_str(), strerror(errno)); return nullptr; } if (0 != TEMP_FAILURE_RETRY(flock(locked_file->Fd(), LOCK_EX))) { *error_msg = StringPrintf( "Ignore: Failed to lock file '%s': %s", locked_file->GetPath().c_str(), strerror(errno)); return nullptr; } return locked_file; }