]> git.saurik.com Git - cydia.git/commitdiff
Add File::mappings_ to Cytore for munmap() and msync().
authorJay Freeman (saurik) <saurik@saurik.com>
Wed, 1 Dec 2010 07:38:24 +0000 (23:38 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Wed, 1 Dec 2010 09:46:27 +0000 (01:46 -0800)
Cytore.hpp
MobileCydia.mm

index 62e956c0447cd16bdbcb5c6ca28136c5aab1ed60..db40045982a98ef7f4bf5b696a332742cc8938a9 100644 (file)
@@ -100,7 +100,23 @@ class File {
 
   private:
     int file_;
-    std::vector<uint8_t *> blocks_;
+
+    typedef std::vector<uint8_t *> BlockVector_;
+    BlockVector_ blocks_;
+
+    struct Mapping_ {
+        uint8_t *data_;
+        size_t size_;
+
+        Mapping_(uint8_t *data, size_t size) :
+            data_(data),
+            size_(size)
+        {
+        }
+    };
+
+    typedef std::vector<Mapping_> MappingVector_;
+    MappingVector_ maps_;
 
     Header &Header_() {
         return *reinterpret_cast<Header *>(blocks_[0]);
@@ -115,8 +131,11 @@ class File {
         size_t extend(size - before);
 
         void *data(mmap(NULL, extend, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, file_, before));
+        uint8_t *bytes(reinterpret_cast<uint8_t *>(data));
+
+        maps_.push_back(Mapping_(bytes,extend));
         for (size_t i(0); i != extend >> Shift_; ++i)
-            blocks_.push_back(reinterpret_cast<uint8_t *>(data) + Block_ * i);
+            blocks_.push_back(bytes + Block_ * i);
     }
 
     void Truncate_(size_t capacity) {
@@ -138,10 +157,16 @@ class File {
     }
 
     ~File() {
-        // XXX: this object is never deconstructed. if it were, this should unmap the memory
+        for (typename MappingVector_::const_iterator map(maps_.begin()); map != maps_.end(); ++map)
+            munmap(map->data_, map->size_);
         close(file_);
     }
 
+    void Sync() {
+        for (typename MappingVector_::const_iterator map(maps_.begin()); map != maps_.end(); ++map)
+            msync(map->data_, map->size_, MS_SYNC);
+    }
+
     size_t Capacity() const {
         return blocks_.size() * Block_;
     }
index 069a04a89d1f59bf6cf0481b0af39dc4a3de32b0..5a091682743efba7a6e16d1efe61b83530e80f7c 100644 (file)
@@ -8062,21 +8062,24 @@ static _finline void _setHomePage(Cydia *self) {
 }
 
 - (void) _saveConfig {
+    _trace();
+    MetaFile_.Sync();
+    _trace();
+
     if (Changed_) {
-        _trace();
         NSString *error(nil);
+
         if (NSData *data = [NSPropertyListSerialization dataFromPropertyList:Metadata_ format:NSPropertyListBinaryFormat_v1_0 errorDescription:&error]) {
             _trace();
             NSError *error(nil);
             if (![data writeToFile:@"/var/lib/cydia/metadata.plist" options:NSAtomicWrite error:&error])
                 NSLog(@"failure to save metadata data: %@", error);
             _trace();
+
+            Changed_ = false;
         } else {
             NSLog(@"failure to serialize metadata: %@", error);
-            return;
         }
-
-        Changed_ = false;
     }
 }