Loading...
interlinked-dylibs/FileCache.cpp dyld-433.5 dyld-421.2
--- dyld/dyld-433.5/interlinked-dylibs/FileCache.cpp
+++ dyld/dyld-421.2/interlinked-dylibs/FileCache.cpp
@@ -157,7 +157,7 @@
 FileCache fileCache;
 
 FileCache::FileCache(void) {
-    cache_queue = dispatch_queue_create("com.apple.dyld.cache.cache", dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, 0));
+    cache_queue = dispatch_queue_create("com.apple.dyld.cache.cache", DISPATCH_QUEUE_SERIAL);
 }
 
 
@@ -172,91 +172,63 @@
     cacheBuilderDispatchAsync(cache_queue, [=] {
         std::string normalizedPath = normalize_absolute_file_path(path);
         if (entries.count(normalizedPath) == 0) {
-            entries[normalizedPath] = fill(normalizedPath);
+            fill(normalizedPath);
         }
     });
 }
 
 std::tuple<uint8_t *, struct stat, bool> FileCache::cacheLoad(const std::string path) {
-    bool found = false;
-    std::tuple<uint8_t*, struct stat, bool> retval;
     std::string normalizedPath = normalize_absolute_file_path(path);
-    cacheBuilderDispatchSync(cache_queue, [=, &found, &retval] {
-        auto entry = entries.find(normalizedPath);
-        if (entry != entries.end()) {
-            retval = entry->second;
-            found = true;
-        }
+    cacheBuilderDispatchSync(cache_queue, [=] {
+        if ( entries.count(normalizedPath) == 0 )
+            fill(normalizedPath);
     });
 
-    if (!found) {
-        auto info = fill(normalizedPath);
-        cacheBuilderDispatchSync(cache_queue, [=, &found, &retval] {
-            auto entry = entries.find(normalizedPath);
-            if (entry != entries.end()) {
-                retval = entry->second;
-            }else {
-                retval = entries[normalizedPath] = info;
-                retval = info;
-            }
-        });
-    }
-
-    return retval;
-}
+    return entries[normalizedPath];
+}
+
 
 //FIXME error handling
-std::tuple<uint8_t*, struct stat, bool>  FileCache::fill(const std::string& path) {
+void FileCache::fill(const std::string& path) {
     struct stat stat_buf;
 
     int fd = ::open(path.c_str(), O_RDONLY, 0);
     if ( fd == -1 ) {
         verboseLog("can't open file '%s', errno=%d", path.c_str(), errno);
-        return std::make_tuple((uint8_t*)(-1), stat_buf, false);
+        entries[path] = std::make_tuple((uint8_t*)(-1), stat_buf, false);
+        return;
     }
 
     if ( fstat(fd, &stat_buf) == -1) {
         verboseLog("can't stat open file '%s', errno=%d", path.c_str(), errno);
+        entries[path] = std::make_tuple((uint8_t*)(-1), stat_buf, false);
         ::close(fd);
-        return std::make_tuple((uint8_t*)(-1), stat_buf, false);
+        return;
     }
 
     if ( stat_buf.st_size < 4096 ) {
         verboseLog("file too small '%s'", path.c_str());
+        entries[path] = std::make_tuple((uint8_t*)(-1), stat_buf, false);
         ::close(fd);
-        return std::make_tuple((uint8_t*)(-1), stat_buf, false);
+        return;
     }
 
     bool rootlessProtected = isProtectedBySIP(path, fd);
 
     void* buffer_ptr = mmap(NULL, stat_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
     if (buffer_ptr == MAP_FAILED) {
-        verboseLog("mmap() for file at %s failed, errno=%d", path.c_str(), errno);
+        verboseLog("mmap() for shared cache at %s failed, errno=%d", path.c_str(), errno);
+        entries[path] = std::make_tuple((uint8_t*)(-1), stat_buf, false);
         ::close(fd);
-        return std::make_tuple((uint8_t*)(-1), stat_buf, false);
-    }
-
+        return;
+    }
+
+    entries[path] = std::make_tuple((uint8_t*)buffer_ptr, stat_buf, rootlessProtected);
     ::close(fd);
-
-    //PERF-HACK: touch bits of the MachO before we need them to speed things up on a spinning disk
-    madvise((void*)buffer_ptr, 4096, MADV_WILLNEED);
-
-    //if it is fat we need to touch each architecture
-    const fat_header* fh = (fat_header*)buffer_ptr;
-    if ( OSSwapBigToHostInt32( fh->magic ) == FAT_MAGIC ) {
-        const fat_arch* slices = (const fat_arch*)( (char*)fh + sizeof( fat_header ) );
-        const uint32_t sliceCount = OSSwapBigToHostInt32( fh->nfat_arch );
-        for ( uint32_t i = 0; i < sliceCount; ++i ) {
-            uint32_t fileOffset = OSSwapBigToHostInt32( slices[i].offset );
-            madvise((void*)((uint8_t *)buffer_ptr+fileOffset), 4096, MADV_WILLNEED);
-        }
-    }
-
-    return std::make_tuple((uint8_t*)buffer_ptr, stat_buf, rootlessProtected);
-}
-
-
-
-
-
-
+}
+
+
+
+
+
+