Remove unnecessary allocation of FileMaps

Change-Id: I97bb72b9edeee5b3eff4ffd21a761a1af472a3b5
This commit is contained in:
Dmitriy Ivanov 2015-03-06 10:22:34 -08:00
parent 88492ec4e1
commit 4b67f8339d

View file

@ -293,7 +293,7 @@ struct ZipArchive {
/* mapped central directory area */
off64_t directory_offset;
android::FileMap* directory_map;
android::FileMap directory_map;
/* number of entries in the Zip archive */
uint16_t num_entries;
@ -311,7 +311,6 @@ struct ZipArchive {
fd(fd),
close_file(assume_ownership),
directory_offset(0),
directory_map(NULL),
num_entries(0),
hash_table_size(0),
hash_table(NULL) {}
@ -321,25 +320,10 @@ struct ZipArchive {
close(fd);
}
delete directory_map;
free(hash_table);
}
};
// Returns 0 on success and negative values on failure.
static android::FileMap* MapFileSegment(const int fd, const off64_t start,
const size_t length, const bool read_only,
const char* debug_file_name) {
android::FileMap* file_map = new android::FileMap;
const bool success = file_map->create(debug_file_name, fd, start, length, read_only);
if (!success) {
delete file_map;
return NULL;
}
return file_map;
}
static int32_t CopyFileToFile(int fd, uint8_t* begin, const uint32_t length, uint64_t *crc_out) {
static const uint32_t kBufSize = 32768;
uint8_t buf[kBufSize];
@ -521,16 +505,12 @@ static int32_t MapCentralDirectory0(int fd, const char* debug_file_name,
* It all looks good. Create a mapping for the CD, and set the fields
* in archive.
*/
android::FileMap* map = MapFileSegment(fd,
static_cast<off64_t>(eocd->cd_start_offset),
static_cast<size_t>(eocd->cd_size),
true /* read only */, debug_file_name);
if (map == NULL) {
archive->directory_map = NULL;
if (!archive->directory_map.create(debug_file_name, fd,
static_cast<off64_t>(eocd->cd_start_offset),
static_cast<size_t>(eocd->cd_size), true /* read only */) ) {
return kMmapFailed;
}
archive->directory_map = map;
archive->num_entries = eocd->num_records;
archive->directory_offset = eocd->cd_start_offset;
@ -600,8 +580,8 @@ static int32_t MapCentralDirectory(int fd, const char* debug_file_name,
*/
static int32_t ParseZipArchive(ZipArchive* archive) {
int32_t result = -1;
const uint8_t* const cd_ptr = (const uint8_t*) archive->directory_map->getDataPtr();
const size_t cd_length = archive->directory_map->getDataLength();
const uint8_t* const cd_ptr = (const uint8_t*) archive->directory_map.getDataPtr();
const size_t cd_length = archive->directory_map.getDataLength();
const uint16_t num_entries = archive->num_entries;
/*
@ -774,8 +754,8 @@ static int32_t FindEntry(const ZipArchive* archive, const int ent,
// the name that's in the hash table is a pointer to a location within
// this mapped region.
const uint8_t* base_ptr = reinterpret_cast<const uint8_t*>(
archive->directory_map->getDataPtr());
if (ptr < base_ptr || ptr > base_ptr + archive->directory_map->getDataLength()) {
archive->directory_map.getDataPtr());
if (ptr < base_ptr || ptr > base_ptr + archive->directory_map.getDataLength()) {
ALOGW("Zip: Invalid entry pointer");
return kInvalidOffset;
}
@ -1159,16 +1139,14 @@ int32_t ExtractEntryToFile(ZipArchiveHandle handle,
return 0;
}
android::FileMap* map = MapFileSegment(fd, current_offset, declared_length,
false, kTempMappingFileName);
if (map == NULL) {
android::FileMap map;
if (!map.create(kTempMappingFileName, fd, current_offset, declared_length, false)) {
return kMmapFailed;
}
const int32_t error = ExtractToMemory(handle, entry,
reinterpret_cast<uint8_t*>(map->getDataPtr()),
map->getDataLength());
delete map;
reinterpret_cast<uint8_t*>(map.getDataPtr()),
map.getDataLength());
return error;
}