[haiku-commits] r34405 - haiku/trunk/src/kits/storage

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 1 Dec 2009 10:55:33 +0100 (CET)

Author: bonefish
Date: 2009-12-01 10:55:33 +0100 (Tue, 01 Dec 2009)
New Revision: 34405
Changeset: http://dev.haiku-os.org/changeset/34405/haiku

Modified:
   haiku/trunk/src/kits/storage/ResourceFile.cpp
Log:
Don't read() the individual program and section headers, but rather read()
the respective tables at once.


Modified: haiku/trunk/src/kits/storage/ResourceFile.cpp
===================================================================
--- haiku/trunk/src/kits/storage/ResourceFile.cpp       2009-12-01 09:47:27 UTC 
(rev 34404)
+++ haiku/trunk/src/kits/storage/ResourceFile.cpp       2009-12-01 09:55:33 UTC 
(rev 34405)
@@ -538,12 +538,21 @@
                resourceOffset = std::max(resourceOffset,
                        programHeaderTableOffset + programHeaderTableSize);
 
+               // load the program headers into memory
+               uint8* programHeaders = (uint8*)malloc(
+                       programHeaderCount * programHeaderSize);
+               if (programHeaders == NULL)
+                       throw Exception(B_NO_MEMORY);
+               MemoryDeleter programHeadersDeleter(programHeaders);
+
+               read_exactly(file, programHeaderTableOffset, programHeaders,
+                       programHeaderCount * programHeaderSize,
+                       "Failed to read ELF program headers.");
+
                // iterate through the program headers
                for (uint32 i = 0; i < programHeaderCount; i++) {
-                       uint64 shOffset = programHeaderTableOffset + i * 
programHeaderSize;
-                       ElfProgramHeader programHeader;
-                       read_exactly(file, shOffset, &programHeader,
-                               sizeof(ElfProgramHeader), "Failed to read ELF 
program header.");
+                       ElfProgramHeader& programHeader
+                               = *(ElfProgramHeader*)(programHeaders + i * 
programHeaderSize);
 
                        // get the header values
                        uint32 type                     = 
_GetInt(programHeader.p_type);
@@ -587,12 +596,21 @@
                resourceOffset = std::max(resourceOffset,
                        sectionHeaderTableOffset + sectionHeaderTableSize);
 
+               // load the section headers into memory
+               uint8* sectionHeaders = (uint8*)malloc(
+                       sectionHeaderCount * sectionHeaderSize);
+               if (sectionHeaders == NULL)
+                       throw Exception(B_NO_MEMORY);
+               MemoryDeleter sectionHeadersDeleter(sectionHeaders);
+
+               read_exactly(file, sectionHeaderTableOffset, sectionHeaders,
+                       sectionHeaderCount * sectionHeaderSize,
+                       "Failed to read ELF section headers.");
+
                // iterate through the section headers
                for (uint32 i = 0; i < sectionHeaderCount; i++) {
-                       uint32 shOffset = sectionHeaderTableOffset + i * 
sectionHeaderSize;
-                       ElfSectionHeader sectionHeader;
-                       read_exactly(file, shOffset, &sectionHeader,
-                               sizeof(ElfSectionHeader), "Failed to read ELF 
section header.");
+                       ElfSectionHeader& sectionHeader
+                               = *(ElfSectionHeader*)(sectionHeaders + i * 
sectionHeaderSize);
 
                        // get the header values
                        uint32 type             = 
_GetInt(sectionHeader.sh_type);


Other related posts:

  • » [haiku-commits] r34405 - haiku/trunk/src/kits/storage - ingo_weinhold