Skip to content

Commit 51ea551

Browse files
Nicolas Pitregitster
authored andcommitted
make sure byte swapping is optimal for git
We rely on ntohl() and htonl() to perform byte swapping in many places. However, some platforms have libraries providing really poor implementations of those which might cause significant performance issues, especially with the block-sha1 code. Signed-off-by: Nicolas Pitre <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d5f6a96 commit 51ea551

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

block-sha1/sha1.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
* and to avoid unnecessary copies into the context array.
55
*/
66

7-
#include <string.h>
8-
#include <arpa/inet.h>
7+
/* this is only to get definitions for memcpy(), ntohl() and htonl() */
8+
#include "../git-compat-util.h"
99

1010
#include "sha1.h"
1111

compat/bswap.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Let's make sure we always have a sane definition for ntohl()/htonl().
3+
* Some libraries define those as a function call, just to perform byte
4+
* shifting, bringing significant overhead to what should be a simple
5+
* operation.
6+
*/
7+
8+
/*
9+
* Default version that the compiler ought to optimize properly with
10+
* constant values.
11+
*/
12+
static inline unsigned int default_swab32(unsigned int val)
13+
{
14+
return (((val & 0xff000000) >> 24) |
15+
((val & 0x00ff0000) >> 8) |
16+
((val & 0x0000ff00) << 8) |
17+
((val & 0x000000ff) << 24));
18+
}
19+
20+
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
21+
22+
#define bswap32(x) ({ \
23+
unsigned int __res; \
24+
if (__builtin_constant_p(x)) { \
25+
__res = default_swab32(x); \
26+
} else { \
27+
__asm__("bswap %0" : "=r" (__res) : "0" (x)); \
28+
} \
29+
__res; })
30+
31+
#undef ntohl
32+
#undef htonl
33+
#define ntohl(x) bswap32(x)
34+
#define htonl(x) bswap32(x)
35+
36+
#endif

git-compat-util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ extern char *gitbasename(char *);
176176
#endif
177177
#endif
178178

179+
#include "compat/bswap.h"
180+
179181
/* General helper functions */
180182
extern void usage(const char *err) NORETURN;
181183
extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));

0 commit comments

Comments
 (0)