Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f0df423 authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi
Browse files

Revert^2 "[res] Better modification time resolution in Idmap"

This reverts commit e2cc267a.

Reason for revert: relanding with the macos build fix

Original comment:

We used to track the modification time in seconds, which is both
imprecise (an apk installation + idmap generation can easily
take less time) and forces us to wait for >1s in the tests to
just check if up-to-date checks work.

This change updates the time to nanosecond resolution where
supported (hm, MinGW for Windows, hm), as the underlying
OS API provides

Test: build + atest libandroidfw_tests idmap2_tests + boot
Flag: EXEMPT minor change

Change-Id: I49c36b0a6ae6e677fa1259090da20ccc7a224b99
parent 09429c7d
Loading
Loading
Loading
Loading
+17 −15
Original line number Diff line number Diff line
@@ -1420,10 +1420,12 @@ void AssetManager::mergeInfoLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo
Mutex AssetManager::SharedZip::gLock;
DefaultKeyedVector<String8, wp<AssetManager::SharedZip> > AssetManager::SharedZip::gOpen;

AssetManager::SharedZip::SharedZip(const String8& path, time_t modWhen)
    : mPath(path), mZipFile(NULL), mModWhen(modWhen),
      mResourceTableAsset(NULL), mResourceTable(NULL)
{
AssetManager::SharedZip::SharedZip(const String8& path, ModDate modWhen)
    : mPath(path),
      mZipFile(NULL),
      mModWhen(modWhen),
      mResourceTableAsset(NULL),
      mResourceTable(NULL) {
  if (kIsDebug) {
    ALOGI("Creating SharedZip %p %s\n", this, mPath.c_str());
  }
@@ -1453,7 +1455,7 @@ sp<AssetManager::SharedZip> AssetManager::SharedZip::get(const String8& path,
        bool createIfNotPresent)
{
    AutoMutex _l(gLock);
    time_t modWhen = getFileModDate(path.c_str());
    auto modWhen = getFileModDate(path.c_str());
    sp<SharedZip> zip = gOpen.valueFor(path).promote();
    if (zip != NULL && zip->mModWhen == modWhen) {
        return zip;
@@ -1520,7 +1522,7 @@ ResTable* AssetManager::SharedZip::setResourceTable(ResTable* res)

bool AssetManager::SharedZip::isUpToDate()
{
    time_t modWhen = getFileModDate(mPath.c_str());
  auto modWhen = getFileModDate(mPath.c_str());
  return mModWhen == modWhen;
}

+11 −11
Original line number Diff line number Diff line
@@ -280,13 +280,13 @@ private:
        ~SharedZip();

    private:
        SharedZip(const String8& path, time_t modWhen);
     SharedZip(const String8& path, ModDate modWhen);
     SharedZip(int fd, const String8& path);
     SharedZip();  // <-- not implemented

     String8 mPath;
     ZipFileRO* mZipFile;
        time_t mModWhen;
     ModDate mModWhen;

     Asset* mResourceTableAsset;
     ResTable* mResourceTable;
+3 −2
Original line number Diff line number Diff line
@@ -25,8 +25,9 @@
#include "android-base/macros.h"
#include "android-base/unique_fd.h"
#include "androidfw/ConfigDescription.h"
#include "androidfw/StringPiece.h"
#include "androidfw/ResourceTypes.h"
#include "androidfw/StringPiece.h"
#include "androidfw/misc.h"
#include "utils/ByteOrder.h"

namespace android {
@@ -213,7 +214,7 @@ class LoadedIdmap {
  android::base::unique_fd idmap_fd_;
  std::string_view overlay_apk_path_;
  std::string_view target_apk_path_;
  time_t idmap_last_mod_time_;
  ModDate idmap_last_mod_time_;

 private:
  DISALLOW_COPY_AND_ASSIGN(LoadedIdmap);
+27 −8
Original line number Diff line number Diff line
@@ -13,14 +13,13 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#pragma once

#include <sys/types.h>
#include <time.h>

//
// Handy utility functions and portability code.
//
#ifndef _LIBS_ANDROID_FW_MISC_H
#define _LIBS_ANDROID_FW_MISC_H

namespace android {

@@ -41,15 +40,35 @@ typedef enum FileType {
} FileType;
/* get the file's type; follows symlinks */
FileType getFileType(const char* fileName);
/* get the file's modification date; returns -1 w/errno set on failure */
time_t getFileModDate(const char* fileName);

// MinGW doesn't support nanosecond resolution in stat() modification time, and given
// that it only matters on the device it's ok to keep it at a seconds level there.
#ifdef _WIN32
using ModDate = time_t;
inline constexpr ModDate kInvalidModDate = ModDate(-1);
inline constexpr unsigned long long kModDateResolutionNs = 1ull * 1000 * 1000 * 1000;
inline time_t toTimeT(ModDate m) {
  return m;
}
#else
using ModDate = timespec;
inline constexpr ModDate kInvalidModDate = {-1, -1};
inline constexpr unsigned long long kModDateResolutionNs = 1;
inline time_t toTimeT(ModDate m) {
  return m.tv_sec;
}
#endif

/* get the file's modification date; returns kInvalidModDate w/errno set on failure */
ModDate getFileModDate(const char* fileName);
/* same, but also returns -1 if the file has already been deleted */
time_t getFileModDate(int fd);
ModDate getFileModDate(int fd);

// Check if |path| or |fd| resides on a readonly filesystem.
bool isReadonlyFilesystem(const char* path);
bool isReadonlyFilesystem(int fd);

}; // namespace android
}  // namespace android

#endif // _LIBS_ANDROID_FW_MISC_H
// Whoever uses getFileModDate() will need this as well
bool operator==(const timespec& l, const timespec& r);
+35 −22
Original line number Diff line number Diff line
@@ -28,11 +28,13 @@
#include <sys/vfs.h>
#endif  // __linux__

#include <cstring>
#include <cstdio>
#include <errno.h>
#include <sys/stat.h>

#include <cstdio>
#include <cstring>
#include <tuple>

namespace android {

/*
@@ -73,27 +75,34 @@ FileType getFileType(const char* fileName)
    }
}

/*
 * Get a file's modification date.
 */
time_t getFileModDate(const char* fileName) {
static ModDate getModDate(const struct stat& st) {
#ifdef _WIN32
  return st.st_mtime;
#elif defined(__APPLE__)
  return st.st_mtimespec;
#else
  return st.st_mtim;
#endif
}

ModDate getFileModDate(const char* fileName) {
  struct stat sb;
  if (stat(fileName, &sb) < 0) {
        return (time_t)-1;
    return kInvalidModDate;
  }
    return sb.st_mtime;
  return getModDate(sb);
}

time_t getFileModDate(int fd) {
ModDate getFileModDate(int fd) {
  struct stat sb;
  if (fstat(fd, &sb) < 0) {
        return (time_t)-1;
    return kInvalidModDate;
  }
  if (sb.st_nlink <= 0) {
    errno = ENOENT;
        return (time_t)-1;
    return kInvalidModDate;
  }
    return sb.st_mtime;
  return getModDate(sb);
}

#ifndef __linux__
@@ -124,4 +133,8 @@ bool isReadonlyFilesystem(int fd) {
}
#endif  // __linux__

}; // namespace android
}  // namespace android

bool operator==(const timespec& l, const timespec& r) {
  return std::tie(l.tv_sec, l.tv_nsec) == std::tie(r.tv_sec, l.tv_nsec);
}
Loading