зеркало из https://github.com/microsoft/git.git
read-cache: use get_be32 instead of hand-rolled ntoh_l
Commit d60c49c
(read-cache.c: allow unaligned mapping of the
index file, 2012-04-03) introduced helpers to access
unaligned data. However, we already have get_be32, which has
a few advantages:
1. It's already written, so we avoid duplication.
2. It's probably faster, since it does the endian
conversion and the alignment fix at the same time.
3. The get_be32 code is well-tested, having been in
block-sha1 for a long time. By contrast, our custom
helpers were probably almost never used, since the user
needed to manually define a macro to enable them.
We have to add a get_be16 implementation to the existing
get_be32, but that is very simple to do.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
802b123366
Коммит
c3d8da571f
|
@ -136,11 +136,15 @@ static inline uint64_t git_bswap64(uint64_t x)
|
|||
defined(__powerpc__) || defined(__powerpc64__) || \
|
||||
defined(__s390__) || defined(__s390x__)
|
||||
|
||||
#define get_be16(p) ntohs(*(unsigned short *)(p))
|
||||
#define get_be32(p) ntohl(*(unsigned int *)(p))
|
||||
#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0)
|
||||
|
||||
#else
|
||||
|
||||
#define get_be16(p) ( \
|
||||
(*((unsigned char *)(p) + 0) << 8) | \
|
||||
(*((unsigned char *)(p) + 1) << 0) )
|
||||
#define get_be32(p) ( \
|
||||
(*((unsigned char *)(p) + 0) << 24) | \
|
||||
(*((unsigned char *)(p) + 1) << 16) | \
|
||||
|
|
44
read-cache.c
44
read-cache.c
|
@ -1313,26 +1313,6 @@ int read_index(struct index_state *istate)
|
|||
return read_index_from(istate, get_index_file());
|
||||
}
|
||||
|
||||
#ifndef NEEDS_ALIGNED_ACCESS
|
||||
#define ntoh_s(var) ntohs(var)
|
||||
#define ntoh_l(var) ntohl(var)
|
||||
#else
|
||||
static inline uint16_t ntoh_s_force_align(void *p)
|
||||
{
|
||||
uint16_t x;
|
||||
memcpy(&x, p, sizeof(x));
|
||||
return ntohs(x);
|
||||
}
|
||||
static inline uint32_t ntoh_l_force_align(void *p)
|
||||
{
|
||||
uint32_t x;
|
||||
memcpy(&x, p, sizeof(x));
|
||||
return ntohl(x);
|
||||
}
|
||||
#define ntoh_s(var) ntoh_s_force_align(&(var))
|
||||
#define ntoh_l(var) ntoh_l_force_align(&(var))
|
||||
#endif
|
||||
|
||||
static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *ondisk,
|
||||
unsigned int flags,
|
||||
const char *name,
|
||||
|
@ -1340,16 +1320,16 @@ static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *on
|
|||
{
|
||||
struct cache_entry *ce = xmalloc(cache_entry_size(len));
|
||||
|
||||
ce->ce_stat_data.sd_ctime.sec = ntoh_l(ondisk->ctime.sec);
|
||||
ce->ce_stat_data.sd_mtime.sec = ntoh_l(ondisk->mtime.sec);
|
||||
ce->ce_stat_data.sd_ctime.nsec = ntoh_l(ondisk->ctime.nsec);
|
||||
ce->ce_stat_data.sd_mtime.nsec = ntoh_l(ondisk->mtime.nsec);
|
||||
ce->ce_stat_data.sd_dev = ntoh_l(ondisk->dev);
|
||||
ce->ce_stat_data.sd_ino = ntoh_l(ondisk->ino);
|
||||
ce->ce_mode = ntoh_l(ondisk->mode);
|
||||
ce->ce_stat_data.sd_uid = ntoh_l(ondisk->uid);
|
||||
ce->ce_stat_data.sd_gid = ntoh_l(ondisk->gid);
|
||||
ce->ce_stat_data.sd_size = ntoh_l(ondisk->size);
|
||||
ce->ce_stat_data.sd_ctime.sec = get_be32(&ondisk->ctime.sec);
|
||||
ce->ce_stat_data.sd_mtime.sec = get_be32(&ondisk->mtime.sec);
|
||||
ce->ce_stat_data.sd_ctime.nsec = get_be32(&ondisk->ctime.nsec);
|
||||
ce->ce_stat_data.sd_mtime.nsec = get_be32(&ondisk->mtime.nsec);
|
||||
ce->ce_stat_data.sd_dev = get_be32(&ondisk->dev);
|
||||
ce->ce_stat_data.sd_ino = get_be32(&ondisk->ino);
|
||||
ce->ce_mode = get_be32(&ondisk->mode);
|
||||
ce->ce_stat_data.sd_uid = get_be32(&ondisk->uid);
|
||||
ce->ce_stat_data.sd_gid = get_be32(&ondisk->gid);
|
||||
ce->ce_stat_data.sd_size = get_be32(&ondisk->size);
|
||||
ce->ce_flags = flags & ~CE_NAMEMASK;
|
||||
ce->ce_namelen = len;
|
||||
hashcpy(ce->sha1, ondisk->sha1);
|
||||
|
@ -1389,14 +1369,14 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk,
|
|||
unsigned int flags;
|
||||
|
||||
/* On-disk flags are just 16 bits */
|
||||
flags = ntoh_s(ondisk->flags);
|
||||
flags = get_be16(&ondisk->flags);
|
||||
len = flags & CE_NAMEMASK;
|
||||
|
||||
if (flags & CE_EXTENDED) {
|
||||
struct ondisk_cache_entry_extended *ondisk2;
|
||||
int extended_flags;
|
||||
ondisk2 = (struct ondisk_cache_entry_extended *)ondisk;
|
||||
extended_flags = ntoh_s(ondisk2->flags2) << 16;
|
||||
extended_flags = get_be16(&ondisk2->flags2) << 16;
|
||||
/* We do not yet understand any bit out of CE_EXTENDED_FLAGS */
|
||||
if (extended_flags & ~CE_EXTENDED_FLAGS)
|
||||
die("Unknown index entry format %08x", extended_flags);
|
||||
|
|
Загрузка…
Ссылка в новой задаче