##// END OF EJS Templates
sparse: reliably avoid writing to store without a lock...
sparse: reliably avoid writing to store without a lock With the code as written before this patch we can still end up writing to store in `debugsparse`. Obviously we'll write to it if by accident a store requirement is modified, but more importantly we write to it if another concurrent transaction modifies the requirements file on disk. We can't rule this out since we're not holding the store lock, so it's better to explicitly pass a permission to write instead of inferring it based on file contents.

File last commit:

r49095:d8690805 default
r52699:95cdc01f default
Show More
bitmanipulation.h
77 lines | 1.7 KiB | text/x-c | CLexer
David Demelier
hg: remove reserved identifiers...
r49095 #ifndef HG_BITMANIPULATION_H
#define HG_BITMANIPULATION_H
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444
Martin von Zweigbergk
bitmanipulation: add missing include of string.h...
r32646 #include <string.h>
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 #include "compat.h"
Raphaël Gomès
bitmanipulation: add utils to read/write bigendian 64bit integers...
r47441 /* Reads a 64 bit integer from big-endian bytes. Assumes that the data is long
enough */
static inline uint64_t getbe64(const char *c)
{
const unsigned char *d = (const unsigned char *)c;
return ((((uint64_t)d[0]) << 56) | (((uint64_t)d[1]) << 48) |
(((uint64_t)d[2]) << 40) | (((uint64_t)d[3]) << 32) |
(((uint64_t)d[4]) << 24) | (((uint64_t)d[5]) << 16) |
(((uint64_t)d[6]) << 8) | (d[7]));
}
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 static inline uint32_t getbe32(const char *c)
{
const unsigned char *d = (const unsigned char *)c;
Augie Fackler
bitmanipulation: fix undefined behavior in bit shift in getbe32...
r38322 return ((((uint32_t)d[0]) << 24) | (((uint32_t)d[1]) << 16) |
(((uint32_t)d[2]) << 8) | (d[3]));
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 }
static inline int16_t getbeint16(const char *c)
{
const unsigned char *d = (const unsigned char *)c;
Augie Fackler
bitmanipulation: reformat with clang-format...
r34698 return ((d[0] << 8) | (d[1]));
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 }
static inline uint16_t getbeuint16(const char *c)
{
const unsigned char *d = (const unsigned char *)c;
Augie Fackler
bitmanipulation: reformat with clang-format...
r34698 return ((d[0] << 8) | (d[1]));
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 }
Raphaël Gomès
bitmanipulation: add utils to read/write bigendian 64bit integers...
r47441 /* Writes a 64 bit integer to bytes in a big-endian format.
Assumes that the buffer is long enough */
static inline void putbe64(uint64_t x, char *c)
{
c[0] = (x >> 56) & 0xff;
c[1] = (x >> 48) & 0xff;
c[2] = (x >> 40) & 0xff;
c[3] = (x >> 32) & 0xff;
c[4] = (x >> 24) & 0xff;
c[5] = (x >> 16) & 0xff;
c[6] = (x >> 8) & 0xff;
c[7] = (x)&0xff;
}
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 static inline void putbe32(uint32_t x, char *c)
{
c[0] = (x >> 24) & 0xff;
c[1] = (x >> 16) & 0xff;
c[2] = (x >> 8) & 0xff;
Augie Fackler
bitmanipulation: reformat with clang-format...
r34698 c[3] = (x)&0xff;
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 }
static inline double getbefloat64(const char *c)
{
const unsigned char *d = (const unsigned char *)c;
double ret;
int i;
uint64_t t = 0;
for (i = 0; i < 8; i++) {
Augie Fackler
bitmanipulation: reformat with clang-format...
r34698 t = (t << 8) + d[i];
Maciej Fijalkowski
internals: move the bitmanipulation routines into its own file...
r29444 }
memcpy(&ret, &t, sizeof(t));
return ret;
}
#endif