]> git.saurik.com Git - cydia.git/blobdiff - Cytore.hpp
Support missing version information in metadata.
[cydia.git] / Cytore.hpp
index 62e956c0447cd16bdbcb5c6ca28136c5aab1ed60..9f3b4c8f99bfc1b0c647977c33ae17fc135eb1fc 100644 (file)
@@ -52,9 +52,6 @@ struct Header {
     uint32_t reserved_;
 };
 
     uint32_t reserved_;
 };
 
-struct Block {
-};
-
 template <typename Target_>
 class Offset {
   private:
 template <typename Target_>
 class Offset {
   private:
@@ -85,6 +82,10 @@ class Offset {
     }
 };
 
     }
 };
 
+struct Block {
+    Cytore::Offset<void> reserved_;
+};
+
 template <typename Type_>
 static _finline Type_ Round(Type_ value, Type_ size) {
     Type_ mask(size - 1);
 template <typename Type_>
 static _finline Type_ Round(Type_ value, Type_ size) {
     Type_ mask(size - 1);
@@ -100,7 +101,23 @@ class File {
 
   private:
     int 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]);
 
     Header &Header_() {
         return *reinterpret_cast<Header *>(blocks_[0]);
@@ -115,8 +132,11 @@ class File {
         size_t extend(size - before);
 
         void *data(mmap(NULL, extend, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, file_, before));
         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)
         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) {
     }
 
     void Truncate_(size_t capacity) {
@@ -138,10 +158,16 @@ class File {
     }
 
     ~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_);
     }
 
         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_;
     }
     size_t Capacity() const {
         return blocks_.size() * Block_;
     }