Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-index/mail-tree-redblack.c @ 903:fd8888f6f037 HEAD
Naming style changes, finally got tired of most of the typedefs. Also the
previous enum -> macro change reverted so that we don't use the highest bit
anymore, that's incompatible with old indexes so they will be rebuilt.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 05 Jan 2003 15:09:51 +0200 |
parents | 41dde6822eea |
children | e291bf36d57f |
rev | line source |
---|---|
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 Redblack balanced tree algorithm, http://libredblack.sourceforge.net/ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 Copyright (C) Damian Ivereigh 2000 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 Modified to be suitable for mmap()ing and for IMAP server |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 Copyright (C) Timo Sirainen 2002 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 This program is free software; you can redistribute it and/or modify |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 it under the terms of the GNU Lesser General Public License as published by |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 the Free Software Foundation; either version 2.1 of the License, or |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 (at your option) any later version. See the file COPYING for details. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 This program is distributed in the hope that it will be useful, |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 but WITHOUT ANY WARRANTY; without even the implied warranty of |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 GNU General Public License for more details. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 You should have received a copy of the GNU Lesser General Public License |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 along with this program; if not, write to the Free Software |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
21 */ |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
22 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
23 /* NOTE: currently this code doesn't do any bounds checkings. I'm not sure |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
24 if I should even bother, the code would just get uglier and slower. */ |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 #include "lib.h" |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 #include "mail-index.h" |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 #include "mail-tree.h" |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
360
d57e5037db2c
guess it works now, debugging disabled now.
Timo Sirainen <tss@iki.fi>
parents:
359
diff
changeset
|
30 /* #define DEBUG_TREE */ |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 #ifndef DEBUG_TREE |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 # define rb_check(tree) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 #endif |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 /* Dummy (sentinel) node, so that we can make X->left->up = X |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 ** We then use this instead of NULL to mean the top or bottom |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 ** end of the rb tree. It is a black node. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 #define RBNULL 0 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
42 /* If highest bit in node_count is set, the node is red. */ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
43 #define RED_MASK (1 << (SIZEOF_INT*CHAR_BIT-1)) |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
44 |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
45 #define IS_NODE_BLACK(node) \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
46 (((node).node_count & RED_MASK) == 0) |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
47 #define IS_NODE_RED(node) \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
48 (((node).node_count & RED_MASK) != 0) |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
49 |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
50 #define NODE_SET_BLACK(node) \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
51 STMT_START { (node).node_count &= ~RED_MASK; } STMT_END |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
52 #define NODE_SET_RED(node) \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
53 STMT_START { (node).node_count |= RED_MASK; } STMT_END |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
54 |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
55 #define NODE_COPY_COLOR(dest, src) \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
56 STMT_START { \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
57 if (((src).node_count & RED_MASK) != \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
58 ((dest).node_count & RED_MASK)) \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
59 (dest).node_count ^= RED_MASK; \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
60 } STMT_END |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
61 |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
62 #define NODE_COUNT(node) \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
63 ((node).node_count & ~RED_MASK) |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
64 |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
65 #define NODE_COUNT_ADD(node, count) \ |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
66 STMT_START { (node).node_count += (count); } STMT_END |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
67 |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 /* |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 ** OK here we go, the balanced tree stuff. The algorithm is the |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 ** fairly standard red/black taken from "Introduction to Algorithms" |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 ** by Cormen, Leiserson & Rivest. Maybe one of these days I will |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 ** fully understand all this stuff. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 ** Basically a red/black balanced tree has the following properties:- |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 ** 1) Every node is either red or black (color is RED or BLACK) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 ** 2) A leaf (RBNULL pointer) is considered black |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 ** 3) If a node is red then its children are black |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 ** 4) Every path from a node to a leaf contains the same no |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 ** of black nodes |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 ** 3) & 4) above guarantee that the longest path (alternating |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 ** red and black nodes) is only twice as long as the shortest |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 ** path (all black nodes). Thus the tree remains fairly balanced. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 static unsigned int |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
87 rb_alloc(struct mail_tree *tree) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 unsigned int x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 if (tree->mmap_used_length == tree->mmap_full_length) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 if (!_mail_tree_grow(tree)) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 return RBNULL; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 i_assert(tree->header->used_file_size == tree->mmap_used_length); |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
97 i_assert(tree->mmap_used_length + sizeof(struct mail_tree_node) <= |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 tree->mmap_full_length); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
100 x = (tree->mmap_used_length - sizeof(struct mail_tree_header)) / |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
101 sizeof(struct mail_tree_node); |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
102 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
103 tree->header->used_file_size += sizeof(struct mail_tree_node); |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
104 tree->mmap_used_length += sizeof(struct mail_tree_node); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
106 memset(&tree->node_base[x], 0, sizeof(struct mail_tree_node)); |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
107 return x; |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
108 } |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
109 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
110 static void |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
111 rb_move(struct mail_tree *tree, unsigned int src, unsigned int dest) |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
112 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
113 struct mail_tree_node *node = tree->node_base; |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
114 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
115 /* update parent */ |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
116 if (node[src].up != RBNULL) { |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
117 if (node[node[src].up].left == src) |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
118 node[node[src].up].left = dest; |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
119 else if (node[node[src].up].right == src) |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
120 node[node[src].up].right = dest; |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
121 } |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
122 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
123 /* update children */ |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
124 if (node[src].left != RBNULL) |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
125 node[node[src].left].up = dest; |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
126 if (node[src].right != RBNULL) |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
127 node[node[src].right].up = dest; |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
128 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
129 /* update root */ |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
130 if (tree->header->root == src) |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
131 tree->header->root = dest; |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
132 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
133 memcpy(&node[dest], &node[src], sizeof(struct mail_tree_node)); |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
134 memset(&node[src], 0, sizeof(struct mail_tree_node)); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 static void |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
138 rb_free(struct mail_tree *tree, unsigned int x) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 { |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
140 unsigned int last; |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
141 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
142 i_assert(tree->mmap_used_length >= |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
143 sizeof(struct mail_tree_header) + |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
144 sizeof(struct mail_tree_node)); |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
145 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
146 /* get index to last used record */ |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
147 last = (tree->mmap_used_length - sizeof(struct mail_tree_header)) / |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
148 sizeof(struct mail_tree_node) - 1; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
150 if (last != x) { |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
151 /* move it over the one we want free'd */ |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
152 rb_move(tree, last, x); |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
153 } |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
154 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
155 /* mark the moved node unused */ |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
156 tree->mmap_used_length -= sizeof(struct mail_tree_node); |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
157 tree->header->used_file_size -= sizeof(struct mail_tree_node); |
496
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
158 |
fef80ac4fb09
Instead of keeping "unused nodes" list in tree file, just move the last node
Timo Sirainen <tss@iki.fi>
parents:
488
diff
changeset
|
159 _mail_tree_truncate(tree); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 /* |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 ** Rotate our tree thus:- |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 ** X rb_left_rotate(X)---> Y |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 ** / \ / \ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 ** A Y <---rb_right_rotate(Y) X C |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 ** / \ / \ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 ** B C A B |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 ** N.B. This does not change the ordering. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 ** We assume that neither X or Y is NULL |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 ** Node count changes: |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 ** X += C+1 X -= C+1 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 ** Y -= A+1 Y += A+1 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 static void |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
181 rb_left_rotate(struct mail_tree *tree, unsigned int x) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
183 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 unsigned int y, a_nodes, c_nodes; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 i_assert(x != RBNULL); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 i_assert(node[x].right != RBNULL); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 y = node[x].right; |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
190 a_nodes = NODE_COUNT(node[node[x].left]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
191 c_nodes = NODE_COUNT(node[node[y].right]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 /* Turn Y's left subtree into X's right subtree (move B) */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 node[x].right = node[y].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 /* If B is not null, set it's parent to be X */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 if (node[y].left != RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 node[node[y].left].up = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 /* Set Y's parent to be what X's parent was */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 node[y].up = node[x].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 /* if X was the root */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 if (node[x].up == RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 tree->header->root = y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 /* Set X's parent's left or right pointer to be Y */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 if (x == node[node[x].up].left) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 node[node[x].up].left = y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 else |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 node[node[x].up].right = y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 /* Put X on Y's left */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 node[y].left = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 /* Set X's parent to be Y */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 node[x].up = y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 /* Update node counts */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
221 NODE_COUNT_ADD(node[x], -(c_nodes+1)); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
222 NODE_COUNT_ADD(node[y], a_nodes+1); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 static void |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
226 rb_right_rotate(struct mail_tree *tree, unsigned int y) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
228 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 unsigned int x, a_nodes, c_nodes; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 i_assert(y != RBNULL); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 i_assert(node[y].left != RBNULL); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 x = node[y].left; |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
235 a_nodes = NODE_COUNT(node[node[x].left]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
236 c_nodes = NODE_COUNT(node[node[y].right]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 /* Turn X's right subtree into Y's left subtree (move B) */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 node[y].left = node[x].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 /* If B is not null, set it's parent to be Y */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 if (node[x].right != RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 node[node[x].right].up = y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 /* Set X's parent to be what Y's parent was */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 node[x].up = node[y].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 /* if Y was the root */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 if (node[y].up == RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 tree->header->root = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 /* Set Y's parent's left or right pointer to be X */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 if (y == node[node[y].up].left) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 node[node[y].up].left = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 else |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 node[node[y].up].right = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 /* Put Y on X's right */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 node[x].right = y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 /* Set Y's parent to be X */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 node[y].up = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 /* Update node counts */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
266 NODE_COUNT_ADD(node[x], c_nodes+1); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
267 NODE_COUNT_ADD(node[y], -(a_nodes+1)); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 /* Return index to the smallest key greater than x |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 static unsigned int |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
273 rb_successor(struct mail_tree *tree, unsigned int x) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
275 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 unsigned int y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 if (node[x].right != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 /* If right is not NULL then go right one and |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 ** then keep going left until we find a node with |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 ** no left pointer. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 y = node[x].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 while (node[y].left != RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 y = node[y].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 /* Go up the tree until we get to a node that is on the |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 ** left of its parent (or the root) and then return the |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 ** parent. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 y = node[x].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 while (y != RBNULL && x == node[y].right) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 x = y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 y = node[y].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 return y; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 /* Restore the reb-black properties after insert */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 static int |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
303 rb_insert_fix(struct mail_tree *tree, unsigned int z) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
305 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 unsigned int x, y, x_up_up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 /* color this new node red */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
309 NODE_SET_RED(node[z]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 /* Having added a red node, we must now walk back up the tree balancing |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 ** it, by a series of rotations and changing of colors |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 x = z; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 /* While we are not at the top and our parent node is red |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 ** N.B. Since the root node is garanteed black, then we |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 ** are also going to stop if we are the child of the root |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
321 while (x != tree->header->root && IS_NODE_RED(node[node[x].up])) { |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 /* if our parent is on the left side of our grandparent */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 x_up_up = node[node[x].up].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 if (node[x].up == node[x_up_up].left) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 /* get the right side of our grandparent (uncle?) */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 y = node[x_up_up].right; |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
327 if (IS_NODE_RED(node[y])) { |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 /* make our parent black */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
329 NODE_SET_BLACK(node[node[x].up]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 /* make our uncle black */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
331 NODE_SET_BLACK(node[y]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 /* make our grandparent red */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
333 NODE_SET_RED(node[x_up_up]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 /* now consider our grandparent */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 x = x_up_up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 /* if we are on the right side of our parent */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 if (x == node[node[x].up].right) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 /* Move up to our parent */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 x = node[x].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 rb_left_rotate(tree, x); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 /* make our parent black */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
346 NODE_SET_BLACK(node[node[x].up]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 /* make our grandparent red */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
348 NODE_SET_RED(node[x_up_up]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 /* right rotate our grandparent */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 rb_right_rotate(tree, x_up_up); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 /* everything here is the same as above, but |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 ** exchanging left for right |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 y = node[x_up_up].left; |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
358 if (IS_NODE_RED(node[y])) { |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
359 NODE_SET_BLACK(node[node[x].up]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
360 NODE_SET_BLACK(node[y]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
361 NODE_SET_RED(node[x_up_up]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 x = x_up_up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 if (x == node[node[x].up].left) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 x = node[x].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 rb_right_rotate(tree, x); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
370 NODE_SET_BLACK(node[node[x].up]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
371 NODE_SET_RED(node[x_up_up]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 rb_left_rotate(tree, x_up_up); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 /* Set the root node black */ |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
378 NODE_SET_BLACK(node[tree->header->root]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 return z; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 /* Restore the reb-black properties after a delete */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 static void |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
384 rb_delete_fix(struct mail_tree *tree, unsigned int x) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
386 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 unsigned int w; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
389 while (x != tree->header->root && IS_NODE_BLACK(node[x])) { |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 if (x == node[node[x].up].left) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
391 w = node[node[x].up].right; |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
392 if (IS_NODE_RED(node[w])) { |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
393 NODE_SET_BLACK(node[w]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
394 NODE_SET_RED(node[node[x].up]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 rb_left_rotate(tree, node[x].up); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
396 w = node[node[x].up].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
397 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
399 if (IS_NODE_BLACK(node[node[w].left]) && |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
400 IS_NODE_BLACK(node[node[w].right])) { |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
401 NODE_SET_RED(node[w]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 x = node[x].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
403 } else { |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
404 if (IS_NODE_BLACK(node[node[w].right])) { |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
405 NODE_SET_BLACK(node[node[w].left]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
406 NODE_SET_RED(node[w]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 rb_right_rotate(tree, w); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 w = node[node[x].up].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
412 NODE_COPY_COLOR(node[w], node[node[x].up]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
413 NODE_SET_BLACK(node[node[x].up]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
414 NODE_SET_BLACK(node[node[w].right]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 rb_left_rotate(tree, node[x].up); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
416 x = tree->header->root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 w = node[node[x].up].left; |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
420 if (IS_NODE_RED(node[w])) { |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
421 NODE_SET_BLACK(node[w]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
422 NODE_SET_RED(node[node[x].up]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
423 rb_right_rotate(tree, node[x].up); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 w = node[node[x].up].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
427 if (IS_NODE_BLACK(node[node[w].right]) && |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
428 IS_NODE_BLACK(node[node[w].left])) { |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
429 NODE_SET_RED(node[w]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 x = node[x].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
431 } else { |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
432 if (IS_NODE_BLACK(node[node[w].left])) { |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
433 NODE_SET_BLACK(node[node[w].right]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
434 NODE_SET_RED(node[w]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 rb_left_rotate(tree, w); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 w = node[node[x].up].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
439 NODE_COPY_COLOR(node[w], node[node[x].up]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
440 NODE_SET_BLACK(node[node[x].up]); |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
441 NODE_SET_BLACK(node[node[w].left]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 rb_right_rotate(tree, node[x].up); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 x = tree->header->root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
444 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
446 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
448 NODE_SET_BLACK(node[x]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
449 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
450 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 /* |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 ** case 1 - only one child: |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
453 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 ** Z --> Y |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 ** / |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
456 ** Y |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
457 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 ** Node count changes: |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 ** parents -= 1 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 ** case 2 - right child has no left child: |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 ** Z Y |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 ** / \ / \ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 ** A Y --> A X |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 ** \ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 ** X |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 ** Node count changes: |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
470 ** parents -= 1 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 ** Y = Z-1 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 ** case 3 - right child has left child: |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
474 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
475 ** Z Y |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 ** / \ / \ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
477 ** A B --> A B |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 ** / / |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 ** .. .. |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 ** / / |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
481 ** Y X |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
482 ** \ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
483 ** X |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
484 ** |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
485 ** Node count changes: |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
486 ** parents -= 1 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
487 ** Y = Z-1 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
488 ** B .. X.up -= 1 (NOTE: X may not exist) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
489 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
491 /* Delete the node z, and free up the space |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
492 */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
493 static void |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
494 rb_delete(struct mail_tree *tree, unsigned int z) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
496 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
497 unsigned int x, y, b; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
498 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
499 if (node[z].left == RBNULL || node[z].right == RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
500 y = z; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 b = RBNULL; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
502 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 y = rb_successor(tree, z); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
504 if (y == node[z].right) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
505 b = RBNULL; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
506 else |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
507 b = node[z].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
508 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
509 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
510 if (node[y].left != RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
511 x = node[y].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 else |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 x = node[y].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
514 |
359 | 515 /* this may modify RBNULL, which IMHO is a bit nasty, |
516 but rb_delete_fix() requires it to work properly. */ | |
517 node[x].up = node[y].up; | |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 if (node[y].up == RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 tree->header->root = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
522 if (y == node[node[y].up].left) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
523 node[node[y].up].left = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
524 else |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 node[node[y].up].right = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
526 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
527 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 if (y != z) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
529 node[z].key = node[y].key; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
530 node[z].value = node[y].value; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 if (b != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 /* case 3 updates */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 while (b != x) { |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
536 NODE_COUNT_ADD(node[b], -1); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 b = node[b].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
540 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 while (z != RBNULL) { |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
542 NODE_COUNT_ADD(node[z], -1); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 z = node[z].up; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
544 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
546 if (IS_NODE_BLACK(node[y])) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
547 rb_delete_fix(tree, x); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 rb_free(tree, y); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
552 #ifdef DEBUG_TREE |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
553 int |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
554 rb_check1(struct mail_tree *tree, unsigned int x) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
555 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
556 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
557 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
558 if (IS_NODE_RED(node[x])) { |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
559 if (!IS_NODE_BLACK(node[node[x].left]) || |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
560 !IS_NODE_BLACK(node[node[x].right])) { |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 i_error("Children of red node not both black, x=%u", x); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
565 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 if (node[x].left != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
567 if (node[node[x].left].up != x) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 i_error("x->left->up != x, x=%u", x); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
571 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 if (rb_check1(tree, node[x].left)) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
573 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
574 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
575 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 if (node[x].right != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
577 if (node[node[x].right].up != x) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 i_error("x->right->up != x, x=%u", x); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
579 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
580 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 if (rb_check1(tree, node[x].right)) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
584 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
585 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
586 return 0; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
588 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
589 int count_black(struct mail_tree *tree, unsigned int x) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
591 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
592 int nleft, nright; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
593 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
594 if (x == RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
595 return 1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
597 nleft = count_black(tree, node[x].left); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
598 nright = count_black(tree, node[x].right); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
599 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
600 if (nleft == -1 || nright == -1) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
601 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
602 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
603 if (nleft != nright) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
604 i_error("Black count not equal on left & right, x=%u", x); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
605 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
606 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
607 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
608 if (IS_NODE_BLACK(node[x])) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
609 nleft++; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
610 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
611 return nleft; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
612 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
613 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
614 int count_nodes(struct mail_tree *tree, unsigned int x) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
615 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
616 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
617 int nleft, nright; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
618 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
619 if (x == RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
620 return 0; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
621 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
622 nleft = count_nodes(tree, node[x].left); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
623 nright = count_nodes(tree, node[x].right); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
624 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
625 if (nleft == -1 || nright == -1) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
626 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
628 if (nleft+nright+1 != (int)NODE_COUNT(node[x])) { |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
629 i_error("Invalid node count, x=%u, %d+%d+1 != %u", |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
630 x, nleft, nright, NODE_COUNT(node[x])); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
631 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
633 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
634 return nleft+nright+1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
636 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
637 void dumptree(struct mail_tree *tree, unsigned int x, int n) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
638 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
639 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
640 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
641 if (x != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
642 n++; |
799
41dde6822eea
Try not to split strings to multiple lines from the middle of human readable
Timo Sirainen <tss@iki.fi>
parents:
539
diff
changeset
|
643 i_error("Tree: %*s %u: left=%u, right=%u, color=%s, " |
41dde6822eea
Try not to split strings to multiple lines from the middle of human readable
Timo Sirainen <tss@iki.fi>
parents:
539
diff
changeset
|
644 "nodes=%u, key=%u", |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
645 n, "", x, node[x].left, node[x].right, |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
646 IS_NODE_BLACK(node[x]) ? "BLACK" : "RED", |
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
647 NODE_COUNT(node[x]), node[x].key); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
648 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
649 dumptree(tree, node[x].left, n); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 dumptree(tree, node[x].right, n); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
651 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
652 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
653 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
654 int |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
655 rb_check(struct mail_tree *tree) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
656 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
657 struct mail_tree_node *node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
658 unsigned int root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
659 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
660 root = tree->header->root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
661 if (root == RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
662 return 0; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
663 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
664 if (node[root].up != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
665 i_error("Root up pointer not RBNULL"); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
666 dumptree(tree, root, 0); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
667 return 1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
668 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
669 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
670 if (rb_check1(tree, root)) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
671 dumptree(tree, root, 0); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
672 return 1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
673 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
674 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
675 if (count_black(tree, root) == -1) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
676 dumptree(tree, root, 0); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
677 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
678 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
679 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
680 if (count_nodes(tree, root) == -1) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
681 dumptree(tree, root, 0); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
682 return -1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
683 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
684 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
685 return 0; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
686 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
687 #endif |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
688 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
689 unsigned int mail_tree_lookup_uid_range(struct mail_tree *tree, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
690 unsigned int *seq_r, |
389
60040a9d243f
ioloop_create() takes now pool-parameter. io_buffer_create_mmaped() takes
Timo Sirainen <tss@iki.fi>
parents:
380
diff
changeset
|
691 unsigned int first_uid, |
60040a9d243f
ioloop_create() takes now pool-parameter. io_buffer_create_mmaped() takes
Timo Sirainen <tss@iki.fi>
parents:
380
diff
changeset
|
692 unsigned int last_uid) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
693 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
694 struct mail_tree_node *node; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
695 unsigned int x, y, seq; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
696 |
393
f09e67287f7d
whops, update tree and modifylog with correct uid instead of 0. added extra
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
697 i_assert(first_uid > 0 && last_uid > 0); |
f09e67287f7d
whops, update tree and modifylog with correct uid instead of 0. added extra
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
698 i_assert(first_uid <= last_uid); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
699 i_assert(tree->index->lock_type != MAIL_LOCK_UNLOCK); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
700 |
488
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
701 if (!_mail_tree_mmap_update(tree, FALSE)) |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
702 return (unsigned int)-1; |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
703 |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
704 rb_check(tree); |
512
41133ae3feb6
and correct a stupid copy&paste-bug
Timo Sirainen <tss@iki.fi>
parents:
511
diff
changeset
|
705 node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
706 |
453
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
393
diff
changeset
|
707 if (seq_r != NULL) |
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
393
diff
changeset
|
708 *seq_r = 0; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
709 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
710 y = RBNULL; /* points to the parent of x */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
711 x = tree->header->root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
712 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
713 /* walk x down the tree */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
714 seq = 0; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
715 while (x != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
716 y = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
717 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
718 if (first_uid < node[x].key) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
719 x = node[x].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
720 else { |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
721 seq += NODE_COUNT(node[node[x].left])+1; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
722 if (first_uid > node[x].key) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
723 x = node[x].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
724 else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
725 /* found it */ |
453
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
393
diff
changeset
|
726 if (seq_r != NULL) |
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
393
diff
changeset
|
727 *seq_r = seq; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
728 return node[x].value; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
729 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
730 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
731 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
732 |
393
f09e67287f7d
whops, update tree and modifylog with correct uid instead of 0. added extra
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
733 if (first_uid != last_uid) { |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
734 /* get the next key, make sure it's in range */ |
379
b319eb0fc181
mail_tree_lookup_uid_range() still buggy if first_uid wasn't found.
Timo Sirainen <tss@iki.fi>
parents:
378
diff
changeset
|
735 if (node[y].key > first_uid) |
b319eb0fc181
mail_tree_lookup_uid_range() still buggy if first_uid wasn't found.
Timo Sirainen <tss@iki.fi>
parents:
378
diff
changeset
|
736 x = y; |
b319eb0fc181
mail_tree_lookup_uid_range() still buggy if first_uid wasn't found.
Timo Sirainen <tss@iki.fi>
parents:
378
diff
changeset
|
737 else |
b319eb0fc181
mail_tree_lookup_uid_range() still buggy if first_uid wasn't found.
Timo Sirainen <tss@iki.fi>
parents:
378
diff
changeset
|
738 x = rb_successor(tree, y); |
b319eb0fc181
mail_tree_lookup_uid_range() still buggy if first_uid wasn't found.
Timo Sirainen <tss@iki.fi>
parents:
378
diff
changeset
|
739 |
378
225d515edaa1
sequence number still wasn't right always
Timo Sirainen <tss@iki.fi>
parents:
375
diff
changeset
|
740 if (node[x].key > last_uid) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
741 x = RBNULL; |
453
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
393
diff
changeset
|
742 else { |
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
393
diff
changeset
|
743 if (seq_r != NULL) |
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
393
diff
changeset
|
744 *seq_r = seq+1; |
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
393
diff
changeset
|
745 } |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
746 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
747 |
389
60040a9d243f
ioloop_create() takes now pool-parameter. io_buffer_create_mmaped() takes
Timo Sirainen <tss@iki.fi>
parents:
380
diff
changeset
|
748 return x == RBNULL ? (unsigned int)-1 : node[x].value; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
749 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
750 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
751 unsigned int mail_tree_lookup_sequence(struct mail_tree *tree, unsigned int seq) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
752 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
753 struct mail_tree_node *node; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
754 unsigned int x, upleft_nodes, left_nodes; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
755 |
393
f09e67287f7d
whops, update tree and modifylog with correct uid instead of 0. added extra
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
756 i_assert(seq != 0); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
757 i_assert(tree->index->lock_type != MAIL_LOCK_UNLOCK); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
758 |
488
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
759 if (!_mail_tree_mmap_update(tree, FALSE)) |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
760 return (unsigned int)-1; |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
761 |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
762 rb_check(tree); |
511
10d6c1cb6511
Set node variable after mmap updating which may change it..
Timo Sirainen <tss@iki.fi>
parents:
498
diff
changeset
|
763 node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
764 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
765 x = tree->header->root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
766 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
767 /* walk x down the tree */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
768 seq--; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
769 upleft_nodes = left_nodes = 0; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
770 while (x != RBNULL) { |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
771 left_nodes = upleft_nodes + NODE_COUNT(node[node[x].left]); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
772 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
773 if (seq < left_nodes) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
774 x = node[x].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
775 else if (seq > left_nodes) { |
359 | 776 upleft_nodes = left_nodes+1; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
777 x = node[x].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
778 } else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
779 /* found it */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
780 return node[x].value; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
781 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
782 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
783 |
389
60040a9d243f
ioloop_create() takes now pool-parameter. io_buffer_create_mmaped() takes
Timo Sirainen <tss@iki.fi>
parents:
380
diff
changeset
|
784 return (unsigned int)-1; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
785 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
786 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
787 int mail_tree_insert(struct mail_tree *tree, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
788 unsigned int uid, unsigned int index) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
789 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
790 struct mail_tree_node *node; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
791 unsigned int x, z; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
792 |
393
f09e67287f7d
whops, update tree and modifylog with correct uid instead of 0. added extra
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
793 i_assert(uid != 0); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
794 i_assert(tree->index->lock_type == MAIL_LOCK_EXCLUSIVE); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
795 |
488
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
796 if (!_mail_tree_mmap_update(tree, FALSE)) |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
797 return FALSE; |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
798 |
511
10d6c1cb6511
Set node variable after mmap updating which may change it..
Timo Sirainen <tss@iki.fi>
parents:
498
diff
changeset
|
799 node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
800 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
801 /* we'll always insert to right side of the tree */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
802 x = tree->header->root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
803 if (x != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
804 while (node[x].right != RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
805 x = node[x].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
806 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
807 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
808 if (node[x].key >= uid) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
809 _mail_tree_set_corrupted(tree, |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
810 "UID to be inserted isn't higher than existing " |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
811 "(%u <= %u)", uid, node[x].key); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
812 return FALSE; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
813 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
814 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
815 if ((z = rb_alloc(tree)) == RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
816 return FALSE; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
817 |
356
a39343e9e197
crashfix when growing tree file size
Timo Sirainen <tss@iki.fi>
parents:
355
diff
changeset
|
818 /* rb_alloc() may change mmap base */ |
a39343e9e197
crashfix when growing tree file size
Timo Sirainen <tss@iki.fi>
parents:
355
diff
changeset
|
819 node = tree->node_base; |
a39343e9e197
crashfix when growing tree file size
Timo Sirainen <tss@iki.fi>
parents:
355
diff
changeset
|
820 |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
821 node[z].key = uid; |
389
60040a9d243f
ioloop_create() takes now pool-parameter. io_buffer_create_mmaped() takes
Timo Sirainen <tss@iki.fi>
parents:
380
diff
changeset
|
822 node[z].value = index; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
823 node[z].up = x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
824 node[z].node_count = 1; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
825 node[z].left = RBNULL; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
826 node[z].right = RBNULL; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
827 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
828 if (x == RBNULL) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
829 tree->header->root = z; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
830 else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
831 if (node[z].key < node[x].key) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
832 node[x].left = z; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
833 else |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
834 node[x].right = z; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
835 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
836 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
837 for (; x != RBNULL; x = node[x].up) |
539
a182d31b46cd
node color needs only one bit, not a full 32bit integer. so moved it to
Timo Sirainen <tss@iki.fi>
parents:
512
diff
changeset
|
838 NODE_COUNT_ADD(node[x], 1); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
839 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
840 rb_insert_fix(tree, z); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
841 rb_check(tree); |
511
10d6c1cb6511
Set node variable after mmap updating which may change it..
Timo Sirainen <tss@iki.fi>
parents:
498
diff
changeset
|
842 |
10d6c1cb6511
Set node variable after mmap updating which may change it..
Timo Sirainen <tss@iki.fi>
parents:
498
diff
changeset
|
843 tree->modified = TRUE; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
844 return TRUE; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
845 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
846 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
847 int mail_tree_update(struct mail_tree *tree, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
848 unsigned int uid, unsigned int index) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
849 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
850 struct mail_tree_node *node; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
851 unsigned int x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
852 |
393
f09e67287f7d
whops, update tree and modifylog with correct uid instead of 0. added extra
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
853 i_assert(uid != 0); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
854 i_assert(tree->index->lock_type == MAIL_LOCK_EXCLUSIVE); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
855 |
488
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
856 if (!_mail_tree_mmap_update(tree, FALSE)) |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
857 return FALSE; |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
858 |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
859 rb_check(tree); |
511
10d6c1cb6511
Set node variable after mmap updating which may change it..
Timo Sirainen <tss@iki.fi>
parents:
498
diff
changeset
|
860 node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
861 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
862 tree->modified = TRUE; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
863 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
864 x = tree->header->root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
865 while (x != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
866 if (uid < node[x].key) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
867 x = node[x].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
868 else if (uid > node[x].key) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
869 x = node[x].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
870 else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
871 /* found it */ |
389
60040a9d243f
ioloop_create() takes now pool-parameter. io_buffer_create_mmaped() takes
Timo Sirainen <tss@iki.fi>
parents:
380
diff
changeset
|
872 node[x].value = index; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
873 return TRUE; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
874 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
875 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
876 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
877 _mail_tree_set_corrupted(tree, "Tried to update nonexisting UID %u", |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
878 uid); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
879 return FALSE; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
880 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
881 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
882 void mail_tree_delete(struct mail_tree *tree, unsigned int uid) |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
883 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
799
diff
changeset
|
884 struct mail_tree_node *node; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
885 unsigned int x; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
886 |
393
f09e67287f7d
whops, update tree and modifylog with correct uid instead of 0. added extra
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
887 i_assert(uid != 0); |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
888 i_assert(tree->index->lock_type == MAIL_LOCK_EXCLUSIVE); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
889 |
488
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
890 if (!_mail_tree_mmap_update(tree, FALSE)) |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
891 return; |
48728d36513a
Use fdatasync() instead of fsync() where possible. msync() all files first,
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
892 |
511
10d6c1cb6511
Set node variable after mmap updating which may change it..
Timo Sirainen <tss@iki.fi>
parents:
498
diff
changeset
|
893 node = tree->node_base; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
894 |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
895 x = tree->header->root; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
896 while (x != RBNULL) { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
897 if (uid < node[x].key) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
898 x = node[x].left; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
899 else if (uid > node[x].key) |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
900 x = node[x].right; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
901 else { |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
902 /* found it */ |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
903 rb_delete(tree, x); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
904 rb_check(tree); |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
905 break; |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
906 } |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
907 } |
511
10d6c1cb6511
Set node variable after mmap updating which may change it..
Timo Sirainen <tss@iki.fi>
parents:
498
diff
changeset
|
908 |
10d6c1cb6511
Set node variable after mmap updating which may change it..
Timo Sirainen <tss@iki.fi>
parents:
498
diff
changeset
|
909 tree->modified = TRUE; |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
910 } |