Skip to content

Commit c3d8da5

Browse files
peffgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 802b123 commit c3d8da5

File tree

2 files changed

+16
-32
lines changed

2 files changed

+16
-32
lines changed

compat/bswap.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,15 @@ static inline uint64_t git_bswap64(uint64_t x)
136136
defined(__powerpc__) || defined(__powerpc64__) || \
137137
defined(__s390__) || defined(__s390x__)
138138

139+
#define get_be16(p) ntohs(*(unsigned short *)(p))
139140
#define get_be32(p) ntohl(*(unsigned int *)(p))
140141
#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0)
141142

142143
#else
143144

145+
#define get_be16(p) ( \
146+
(*((unsigned char *)(p) + 0) << 8) | \
147+
(*((unsigned char *)(p) + 1) << 0) )
144148
#define get_be32(p) ( \
145149
(*((unsigned char *)(p) + 0) << 24) | \
146150
(*((unsigned char *)(p) + 1) << 16) | \

read-cache.c

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,43 +1313,23 @@ int read_index(struct index_state *istate)
13131313
return read_index_from(istate, get_index_file());
13141314
}
13151315

1316-
#ifndef NEEDS_ALIGNED_ACCESS
1317-
#define ntoh_s(var) ntohs(var)
1318-
#define ntoh_l(var) ntohl(var)
1319-
#else
1320-
static inline uint16_t ntoh_s_force_align(void *p)
1321-
{
1322-
uint16_t x;
1323-
memcpy(&x, p, sizeof(x));
1324-
return ntohs(x);
1325-
}
1326-
static inline uint32_t ntoh_l_force_align(void *p)
1327-
{
1328-
uint32_t x;
1329-
memcpy(&x, p, sizeof(x));
1330-
return ntohl(x);
1331-
}
1332-
#define ntoh_s(var) ntoh_s_force_align(&(var))
1333-
#define ntoh_l(var) ntoh_l_force_align(&(var))
1334-
#endif
1335-
13361316
static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *ondisk,
13371317
unsigned int flags,
13381318
const char *name,
13391319
size_t len)
13401320
{
13411321
struct cache_entry *ce = xmalloc(cache_entry_size(len));
13421322

1343-
ce->ce_stat_data.sd_ctime.sec = ntoh_l(ondisk->ctime.sec);
1344-
ce->ce_stat_data.sd_mtime.sec = ntoh_l(ondisk->mtime.sec);
1345-
ce->ce_stat_data.sd_ctime.nsec = ntoh_l(ondisk->ctime.nsec);
1346-
ce->ce_stat_data.sd_mtime.nsec = ntoh_l(ondisk->mtime.nsec);
1347-
ce->ce_stat_data.sd_dev = ntoh_l(ondisk->dev);
1348-
ce->ce_stat_data.sd_ino = ntoh_l(ondisk->ino);
1349-
ce->ce_mode = ntoh_l(ondisk->mode);
1350-
ce->ce_stat_data.sd_uid = ntoh_l(ondisk->uid);
1351-
ce->ce_stat_data.sd_gid = ntoh_l(ondisk->gid);
1352-
ce->ce_stat_data.sd_size = ntoh_l(ondisk->size);
1323+
ce->ce_stat_data.sd_ctime.sec = get_be32(&ondisk->ctime.sec);
1324+
ce->ce_stat_data.sd_mtime.sec = get_be32(&ondisk->mtime.sec);
1325+
ce->ce_stat_data.sd_ctime.nsec = get_be32(&ondisk->ctime.nsec);
1326+
ce->ce_stat_data.sd_mtime.nsec = get_be32(&ondisk->mtime.nsec);
1327+
ce->ce_stat_data.sd_dev = get_be32(&ondisk->dev);
1328+
ce->ce_stat_data.sd_ino = get_be32(&ondisk->ino);
1329+
ce->ce_mode = get_be32(&ondisk->mode);
1330+
ce->ce_stat_data.sd_uid = get_be32(&ondisk->uid);
1331+
ce->ce_stat_data.sd_gid = get_be32(&ondisk->gid);
1332+
ce->ce_stat_data.sd_size = get_be32(&ondisk->size);
13531333
ce->ce_flags = flags & ~CE_NAMEMASK;
13541334
ce->ce_namelen = len;
13551335
hashcpy(ce->sha1, ondisk->sha1);
@@ -1389,14 +1369,14 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk,
13891369
unsigned int flags;
13901370

13911371
/* On-disk flags are just 16 bits */
1392-
flags = ntoh_s(ondisk->flags);
1372+
flags = get_be16(&ondisk->flags);
13931373
len = flags & CE_NAMEMASK;
13941374

13951375
if (flags & CE_EXTENDED) {
13961376
struct ondisk_cache_entry_extended *ondisk2;
13971377
int extended_flags;
13981378
ondisk2 = (struct ondisk_cache_entry_extended *)ondisk;
1399-
extended_flags = ntoh_s(ondisk2->flags2) << 16;
1379+
extended_flags = get_be16(&ondisk2->flags2) << 16;
14001380
/* We do not yet understand any bit out of CE_EXTENDED_FLAGS */
14011381
if (extended_flags & ~CE_EXTENDED_FLAGS)
14021382
die("Unknown index entry format %08x", extended_flags);

0 commit comments

Comments
 (0)