Mercurial > hg
annotate mercurial/cext/util.h @ 48260:269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Keep integer seconds since the Unix epoch,
together with integer nanoseconds in the `0 <= n < 1e9` range.
For now, nanoseconds are still always zero.
This commit is about data structure changes.
Differential Revision: https://phab.mercurial-scm.org/D11684
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 18 Oct 2021 11:23:07 +0200 |
parents | 602c8e8411f5 |
children | 9205d9be8b41 |
rev | line source |
---|---|
11358
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
1 /* |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
2 util.h - utility functions for interfacing with the various python APIs. |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
3 |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
4 This software may be used and distributed according to the terms of |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
5 the GNU General Public License, incorporated herein by reference. |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
6 */ |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
7 |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
8 #ifndef _HG_UTIL_H_ |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
9 #define _HG_UTIL_H_ |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
10 |
29444
284d742e5611
internals: move the bitmanipulation routines into its own file
Maciej Fijalkowski <fijall@gmail.com>
parents:
25076
diff
changeset
|
11 #include "compat.h" |
284d742e5611
internals: move the bitmanipulation routines into its own file
Maciej Fijalkowski <fijall@gmail.com>
parents:
25076
diff
changeset
|
12 |
11358
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
13 #if PY_MAJOR_VERSION >= 3 |
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
14 #define IS_PY3K |
30112
9b6ff0f940ed
parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30101
diff
changeset
|
15 #endif |
11358
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
16 |
36618
9a639a33ad1f
py3: add PY23() macro to switch string literal depending on python version
Yuya Nishihara <yuya@tcha.org>
parents:
35775
diff
changeset
|
17 /* helper to switch things like string literal depending on Python version */ |
9a639a33ad1f
py3: add PY23() macro to switch string literal depending on python version
Yuya Nishihara <yuya@tcha.org>
parents:
35775
diff
changeset
|
18 #ifdef IS_PY3K |
9a639a33ad1f
py3: add PY23() macro to switch string literal depending on python version
Yuya Nishihara <yuya@tcha.org>
parents:
35775
diff
changeset
|
19 #define PY23(py2, py3) py3 |
9a639a33ad1f
py3: add PY23() macro to switch string literal depending on python version
Yuya Nishihara <yuya@tcha.org>
parents:
35775
diff
changeset
|
20 #else |
9a639a33ad1f
py3: add PY23() macro to switch string literal depending on python version
Yuya Nishihara <yuya@tcha.org>
parents:
35775
diff
changeset
|
21 #define PY23(py2, py3) py2 |
9a639a33ad1f
py3: add PY23() macro to switch string literal depending on python version
Yuya Nishihara <yuya@tcha.org>
parents:
35775
diff
changeset
|
22 #endif |
9a639a33ad1f
py3: add PY23() macro to switch string literal depending on python version
Yuya Nishihara <yuya@tcha.org>
parents:
35775
diff
changeset
|
23 |
34635
3455e2e2ce9b
util: add clang-format control comment around struct and format macro
Augie Fackler <augie@google.com>
parents:
33758
diff
changeset
|
24 /* clang-format off */ |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
19833
diff
changeset
|
25 typedef struct { |
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
19833
diff
changeset
|
26 PyObject_HEAD |
48250
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
27 int flags; |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
19833
diff
changeset
|
28 int mode; |
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
19833
diff
changeset
|
29 int size; |
48260
269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents:
48252
diff
changeset
|
30 int mtime_s; |
269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents:
48252
diff
changeset
|
31 int mtime_ns; |
47539
84391ddf4c78
dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
40598
diff
changeset
|
32 } dirstateItemObject; |
34635
3455e2e2ce9b
util: add clang-format control comment around struct and format macro
Augie Fackler <augie@google.com>
parents:
33758
diff
changeset
|
33 /* clang-format on */ |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
19833
diff
changeset
|
34 |
48250
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
35 static const int dirstate_flag_wc_tracked = 1; |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
36 static const int dirstate_flag_p1_tracked = 1 << 1; |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
37 static const int dirstate_flag_p2_info = 1 << 2; |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
38 static const int dirstate_flag_has_meaningful_data = 1 << 3; |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
39 static const int dirstate_flag_has_file_mtime = 1 << 4; |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
40 static const int dirstate_flag_has_directory_mtime = 1 << 5; |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
41 static const int dirstate_flag_mode_exec_perm = 1 << 6; |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
42 static const int dirstate_flag_mode_is_symlink = 1 << 7; |
1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents:
48232
diff
changeset
|
43 static const int dirstate_flag_expected_state_is_modified = 1 << 8; |
48251
dfc5a505ddc5
dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48250
diff
changeset
|
44 static const int dirstate_flag_all_unknown_recorded = 1 << 9; |
dfc5a505ddc5
dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48250
diff
changeset
|
45 static const int dirstate_flag_all_ignored_recorded = 1 << 10; |
48252
602c8e8411f5
dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48251
diff
changeset
|
46 static const int dirstate_flag_fallback_exec = 1 << 11; |
602c8e8411f5
dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48251
diff
changeset
|
47 static const int dirstate_flag_has_fallback_exec = 1 << 12; |
602c8e8411f5
dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48251
diff
changeset
|
48 static const int dirstate_flag_fallback_symlink = 1 << 13; |
602c8e8411f5
dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48251
diff
changeset
|
49 static const int dirstate_flag_has_fallback_symlink = 1 << 14; |
47948
83f0e93ec34b
dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47539
diff
changeset
|
50 |
47539
84391ddf4c78
dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
40598
diff
changeset
|
51 extern PyTypeObject dirstateItemType; |
84391ddf4c78
dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
40598
diff
changeset
|
52 #define dirstate_tuple_check(op) (Py_TYPE(op) == &dirstateItemType) |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
19833
diff
changeset
|
53 |
35775
440e8fce29e7
cext: define MIN macro only if it is not yet defined
André Sintzoff <andre.sintzoff@gmail.com>
parents:
34635
diff
changeset
|
54 #ifndef MIN |
34635
3455e2e2ce9b
util: add clang-format control comment around struct and format macro
Augie Fackler <augie@google.com>
parents:
33758
diff
changeset
|
55 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) |
35775
440e8fce29e7
cext: define MIN macro only if it is not yet defined
André Sintzoff <andre.sintzoff@gmail.com>
parents:
34635
diff
changeset
|
56 #endif |
24442
98042b0e19f9
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com>
parents:
24016
diff
changeset
|
57 /* VC9 doesn't include bool and lacks stdbool.h based on my searching */ |
24829
8e9f8d2a2c0c
util: fix the check for non-C99 compilers (issue4605)
Kevin Bullock <kbullock@ringworld.org>
parents:
24823
diff
changeset
|
58 #if defined(_MSC_VER) || __STDC_VERSION__ < 199901L |
24442
98042b0e19f9
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com>
parents:
24016
diff
changeset
|
59 #define true 1 |
98042b0e19f9
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com>
parents:
24016
diff
changeset
|
60 #define false 0 |
98042b0e19f9
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com>
parents:
24016
diff
changeset
|
61 typedef unsigned char bool; |
98042b0e19f9
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com>
parents:
24016
diff
changeset
|
62 #else |
98042b0e19f9
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com>
parents:
24016
diff
changeset
|
63 #include <stdbool.h> |
98042b0e19f9
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com>
parents:
24016
diff
changeset
|
64 #endif |
98042b0e19f9
manifest: move C bool polyfill into util.h
Matt Mackall <mpm@selenic.com>
parents:
24016
diff
changeset
|
65 |
33756
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
66 static inline PyObject *_dict_new_presized(Py_ssize_t expected_size) |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
67 { |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
68 /* _PyDict_NewPresized expects a minused parameter, but it actually |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
69 creates a dictionary that's the nearest power of two bigger than the |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
70 parameter. For example, with the initial minused = 1000, the |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
71 dictionary created has size 1024. Of course in a lot of cases that |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
72 can be greater than the maximum load factor Python's dict object |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
73 expects (= 2/3), so as soon as we cross the threshold we'll resize |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
74 anyway. So create a dictionary that's at least 3/2 the size. */ |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
75 return _PyDict_NewPresized(((1 + expected_size) / 2) * 3); |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
76 } |
5866ba5e9c48
cext: move _dict_new_presized() to header
Yuya Nishihara <yuya@tcha.org>
parents:
32386
diff
changeset
|
77 |
40598
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
78 /* Convert a PyInt or PyLong to a long. Returns false if there is an |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
79 error, in which case an exception will already have been set. */ |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
80 static inline bool pylong_to_long(PyObject *pylong, long *out) |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
81 { |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
82 *out = PyLong_AsLong(pylong); |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
83 /* Fast path to avoid hitting PyErr_Occurred if the value was obviously |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
84 * not an error. */ |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
85 if (*out != -1) { |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
86 return true; |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
87 } |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
88 return PyErr_Occurred() == NULL; |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
89 } |
fa33196088c4
revlog: replace PyInt_AS_LONG with a more portable helper function
Augie Fackler <augie@google.com>
parents:
36618
diff
changeset
|
90 |
11358
4494fb02d549
util.h: Utility macros for handling different Python APIs.
Renato Cunha <renatoc@gmail.com>
parents:
diff
changeset
|
91 #endif /* _HG_UTIL_H_ */ |