18 #include <sys/types.h>
27 fprintf(stderr,
"invalid chain: loc1.name>loc2.name (%i>%i)\n", loc1.
get_name(), loc2.
get_name());
42 #if defined(PTM_DEBUG_VALIDATE_CHAINS)
43 template <
typename CHAINITER>
44 inline bool PT_is_empty_chain(
const typename CHAINITER::POS_TREE_TYPE *
const node) {
46 return !CHAINITER(node);
50 template <
typename CHAINITER>
56 CHAINITER entry(node);
57 if (!entry)
return false;
75 for (
int i=0; i<256; i++) {
89 #if (GCC_VERSION_CODE > 404)
91 #define __ATTR__DONT_VECTORIZE_HERE __ATTR__DONT_VECTORIZE
92 #else // !(GCC_VERSION_CODE > 404)
94 #define __ATTR__DONT_VECTORIZE_HERE
98 for (
int i=0; i<256; i++) {
113 for (
unsigned i=0; i<256; i++) {
114 unsigned h = 0xff >> (8-base);
117 for (
unsigned j=0; j<8; j++) {
130 #define CACHE_SEQ_PERCENT 50 // @@@ make global def and use in mem est.
153 for (; i >= 0; i--) {
155 if (link==old_link) {
171 static const int MAXSIZEPERELEMENT = 2*5;
174 : size(forElements*MAXSIZEPERELEMENT),
176 refabspos(refabspos_),
183 int namediff = loc.
get_name()-lastname;
187 write_nat_with_reserved_bits<1>(write_pos, namediff, has_refabspos);
201 #if defined(PTM_DEBUG_VALIDATE_CHAINS)
202 pt_assert(PT_is_empty_chain<ChainIteratorStage1>(node) ||
203 PT_chain_has_valid_entries<ChainIteratorStage1>(node));
221 for (
int e = 0; e<entries; ++e) {
255 if (header->
entries>10) new_memsize *= 1.25;
259 char *new_mem = (
char*)
MEM.
get(new_memsize);
272 #if defined(PTM_DEBUG_VALIDATE_CHAINS)
273 pt_assert(!PT_is_empty_chain<ChainIteratorStage1>(node));
274 pt_assert(PT_chain_has_valid_entries<ChainIteratorStage1>(node));
347 int basebit = 1 << base;
352 if (i & father->
flags) {
353 POS_TREE1 *son = PT_read_pointer<POS_TREE1>(father->
udata()+sbase);
361 else if (i & basebit) {
368 new_elemfather->
flags = father->
flags | basebit;
369 MEM.
put(father, oldfathersize);
370 *pfather = new_elemfather;
374 char *dest = node->
udata();
424 const size_t SIZE = 8;
427 unsigned char buf[
SIZE];
428 PT_write_long(buf, i);
435 const size_t SIZE = 4;
439 unsigned char buf[
SIZE];
446 const size_t SIZE = 2;
447 unsigned char buf[
SIZE];
461 const size_t MAXSIZE = 5;
467 size_t size = bp-buf;
489 char *no_father = (
char*)(&node->
father);
495 STATIC_ASSERT((MAX_SIZE_IN_FLAGS-MIN_SIZE_IN_FLAGS+1) == SIZE_MASK);
497 if (former_size >= MIN_SIZE_IN_FLAGS && former_size <= MAX_SIZE_IN_FLAGS) {
523 size_t cnt = size-
sizeof(
PT_PNTR)-1;
526 long pos = oldpos+size-
sizeof(
PT_PNTR);
542 uint_8 has_long_apos = refabspos>0xffff;
547 if (has_long_apos) {
PTD_put_int (out, refabspos); pos += 4; }
555 while (entry && !error) {
568 error =
GB_IO_error(
"writing chains to",
"ptserver-index");
591 #if defined(PTM_DEBUG_NODES)
593 printf (
"Inner Node Statistic:\n");
600 printf (
" Int Nodes: %6i\n",
psg.
stat.int_node);
602 printf (
" Ints: %6i\n",
psg.
stat.ints2);
607 printf (
" Ints: %6i\n",
psg.
stat.ints);
614 printf (
" maxdiff: %6li\n",
psg.
stat.maxdiff);
638 long diff = oldpos - r_poss[i];
644 if (max_diff >
psg.
stat.maxdiff) {
655 if ((count == 1) && (max_diff<=9) && (max_diff != 2)) {
656 if (max_diff>2) max_diff -= 2;
else max_diff -= 1;
657 long flags = 0xc0 | lasti | (max_diff << 3);
658 fputc((
int)flags, out);
666 if (max_diff > 0xffffffff) {
667 printf(
"Warning: max_diff > 0xffffffff is not tested.\n");
672 else if (max_diff > 0xffff) {
682 if (max_diff > 0xffff) {
695 long diff = oldpos - r_poss[i];
698 if (diff>level) flags2 |= 1<<i;
705 long diff = oldpos - r_poss[i];
708 if (max_diff > 0xffffffff) {
709 printf(
"Warning: max_diff > 0xffffffff is not tested.\n");
721 else if (max_diff > 0xffff) {
775 long pos = oldpos+size-
sizeof(
PT_PNTR);
840 char *
main = &(buffer[size-4]);
846 if (i == 0xffffffff) {
866 bool info_detected =
false;
869 if (info_size>0 && info_size<(main-buffer)) {
879 info_detected =
true;
882 error =
"PT-server database has different version (rebuild necessary)";
890 error =
"PT-server database can only be used with 64bit-PT-Server";
892 if (!error && !info_detected) {
893 printf(
"Warning: ptserver DB has old format (no problem)\n");
908 #if defined(PTM_MEM_DUMP_STATS)
910 const char *known =
NULp;
921 case PT1_EMPTY_LEAF_SIZE: known =
"PT1_EMPTY_LEAF_SIZE and PT1_CHAIN_SHORT_HEAD_SIZE";
break;
947 uint_32 unmodified = 0xffffffff;
958 if (expect_in_flags) {
965 return all().ofgroup(expected);
968 #define TEST_SIZE_SAVED_IN_FLAGS(pt,size) TEST_EXPECTATION(has_proper_saved_state(pt,size,true))
969 #define TEST_SIZE_SAVED_EXTERNAL(pt,size) TEST_EXPECTATION(has_proper_saved_state(pt,size,false))
970 #define TEST_SIZE_SAVED_IN_FLAGS__BROKEN(pt,size) TEST_EXPECTATION__BROKEN(has_proper_saved_state(pt,size,true))
971 #define TEST_SIZE_SAVED_EXTERNAL__BROKEN(pt,size) TEST_EXPECTATION__BROKEN(has_proper_saved_state(pt,size,false))
989 void TEST_saved_state() {
999 TEST_SIZE_SAVED_IN_FLAGS(node, MIN_SIZE_IN_FLAGS);
1000 TEST_SIZE_SAVED_IN_FLAGS(node, MAX_SIZE_IN_FLAGS);
1002 TEST_SIZE_SAVED_EXTERNAL(node, 5000);
1003 TEST_SIZE_SAVED_EXTERNAL(node, 40);
1006 TEST_SIZE_SAVED_EXTERNAL(node, 24);
1007 TEST_SIZE_SAVED_IN_FLAGS(node, 23);
1009 TEST_SIZE_SAVED_EXTERNAL(node, 20);
1010 TEST_SIZE_SAVED_IN_FLAGS(node, 19);
1013 TEST_SIZE_SAVED_IN_FLAGS(node, 10);
1014 TEST_SIZE_SAVED_IN_FLAGS(node, 9);
1019 TEST_SIZE_SAVED_IN_FLAGS(node, 8);
1020 TEST_SIZE_SAVED_IN_FLAGS(node, 7);
1021 TEST_SIZE_SAVED_IN_FLAGS(node, 6);
1022 TEST_SIZE_SAVED_IN_FLAGS(node, 5);
1030 #if defined(ENABLE_CRASH_TESTS)
1034 #if defined(TEST_BAD_CHAINS)
1039 static void bad_add_to_chain() {
1041 #if !defined(PTM_DEBUG_VALIDATE_CHAINS)
1042 pt_assert(PT_chain_has_valid_entries<ChainIteratorStage1>(theChain));
1049 void TEST_chains() {
1069 for (
int base =
PT_A; base <=
PT_G; ++base) {
1075 TEST_EXPECT(PT_chain_has_valid_entries<ChainIteratorStage1>(chain));
1099 #if defined(TEST_BAD_CHAINS)
1116 FILE *out = fopen(
"/dev/null",
"wb");
1134 #if defined(PTM_MEM_DUMP_STATS)
1135 MEM.dump_stats(
false);
1138 const int MAXSIZE = 1024;
1139 char *ptr[MAXSIZE+1];
1141 for (
int size =
PTM_MIN_SIZE; size <= MAXSIZE; ++size) {
1142 ptr[size] = (
char*)
MEM.
get(size);
1144 for (
int size =
PTM_MIN_SIZE; size <= MAXSIZE; ++size) {
1145 #if defined(PTM_MEM_CHECKED_FREE)
1150 MEM.
put(ptr[size], size);
1154 #if defined(PTM_MEM_DUMP_STATS)
1155 MEM.dump_stats(
true);
1164 static uint_8 reserved_bits = 0;
1167 uint_8 reserved_bits_read;
1172 write_nat_with_reserved_bits<R>(wp, written_nat, reserved_bits);
1173 uint_32 read_nat = read_nat_with_reserved_bits<R>(rp, reserved_bits_read);
1175 int written_bytes = wp-
buffer;
1176 int read_bytes = rp-
buffer;
1185 return all().ofgroup(expected);
1192 static uint_8 reserved_bits = 0;
1195 uint_8 reserved_bits_read;
1200 write_int_with_reserved_bits<R>(wp, written_int, reserved_bits);
1201 int32_t read_int = read_int_with_reserved_bits<R>(rp, reserved_bits_read);
1203 int written_bytes = wp-
buffer;
1204 int read_bytes = rp-
buffer;
1213 return all().ofgroup(expected);
1217 #define TEST_COMPACT_NAT_STORAGE(nat,inBytes) TEST_EXPECTATION(nat_stored_as_expected<0>(nat, inBytes))
1218 #define TEST_COMPACT_NAT_STORAGE_RESERVE1(nat,inBytes) TEST_EXPECTATION(nat_stored_as_expected<1>(nat, inBytes))
1219 #define TEST_COMPACT_NAT_STORAGE_RESERVE2(nat,inBytes) TEST_EXPECTATION(nat_stored_as_expected<2>(nat, inBytes))
1220 #define TEST_COMPACT_NAT_STORAGE_RESERVE3(nat,inBytes) TEST_EXPECTATION(nat_stored_as_expected<3>(nat, inBytes))
1221 #define TEST_COMPACT_NAT_STORAGE_RESERVE4(nat,inBytes) TEST_EXPECTATION(nat_stored_as_expected<4>(nat, inBytes))
1222 #define TEST_COMPACT_NAT_STORAGE_RESERVE5(nat,inBytes) TEST_EXPECTATION(nat_stored_as_expected<5>(nat, inBytes))
1224 #define TEST_COMPACT_INT_STORAGE(i,inBytes) TEST_EXPECTATION(int_stored_as_expected<0>(i, inBytes))
1225 #define TEST_COMPACT_INT_STORAGE_RESERVE3(i,inBytes) TEST_EXPECTATION(int_stored_as_expected<3>(i, inBytes))
1227 void TEST_compact_storage() {
1230 TEST_COMPACT_NAT_STORAGE(0, 1);
1231 TEST_COMPACT_NAT_STORAGE(0x7f, 1);
1233 TEST_COMPACT_NAT_STORAGE(0x80, 2);
1234 TEST_COMPACT_NAT_STORAGE(0x407F, 2);
1236 TEST_COMPACT_NAT_STORAGE(0x4080, 3);
1237 TEST_COMPACT_NAT_STORAGE(0x20407F, 3);
1239 TEST_COMPACT_NAT_STORAGE(0x204080, 4);
1240 TEST_COMPACT_NAT_STORAGE(0x1020407F, 4);
1242 TEST_COMPACT_NAT_STORAGE(0x10204080, 5);
1243 TEST_COMPACT_NAT_STORAGE(0xffffffff, 5);
1246 TEST_COMPACT_NAT_STORAGE_RESERVE1(0, 1);
1247 TEST_COMPACT_NAT_STORAGE_RESERVE1(0x3f, 1);
1249 TEST_COMPACT_NAT_STORAGE_RESERVE1(0x40, 2);
1250 TEST_COMPACT_NAT_STORAGE_RESERVE1(0x203f, 2);
1252 TEST_COMPACT_NAT_STORAGE_RESERVE1(0x2040, 3);
1253 TEST_COMPACT_NAT_STORAGE_RESERVE1(0x10203f, 3);
1255 TEST_COMPACT_NAT_STORAGE_RESERVE1(0x102040, 4);
1256 TEST_COMPACT_NAT_STORAGE_RESERVE1(0x0810203f, 4);
1258 TEST_COMPACT_NAT_STORAGE_RESERVE1(0x08102040, 5);
1259 TEST_COMPACT_NAT_STORAGE_RESERVE1(0xffffffff, 5);
1262 TEST_COMPACT_INT_STORAGE( 0, 1);
1263 TEST_COMPACT_INT_STORAGE( 0x3f, 1);
1264 TEST_COMPACT_INT_STORAGE(-0x40, 1);
1266 TEST_COMPACT_INT_STORAGE( 0x40, 2);
1267 TEST_COMPACT_INT_STORAGE(-0x41, 2);
1268 TEST_COMPACT_INT_STORAGE( 0x203f, 2);
1269 TEST_COMPACT_INT_STORAGE(-0x2040, 2);
1271 TEST_COMPACT_INT_STORAGE( 0x2040, 3);
1272 TEST_COMPACT_INT_STORAGE(-0x2041, 3);
1273 TEST_COMPACT_INT_STORAGE( 0x10203f, 3);
1274 TEST_COMPACT_INT_STORAGE(-0x102040, 3);
1276 TEST_COMPACT_INT_STORAGE( 0x102040, 4);
1277 TEST_COMPACT_INT_STORAGE(-0x102041, 4);
1278 TEST_COMPACT_INT_STORAGE( 0x0810203f, 4);
1279 TEST_COMPACT_INT_STORAGE(-0x08102040, 4);
1281 TEST_COMPACT_INT_STORAGE( 0x08102040, 5);
1282 TEST_COMPACT_INT_STORAGE(-0x08102041, 5);
1283 TEST_COMPACT_INT_STORAGE(INT_MAX, 5);
1284 TEST_COMPACT_INT_STORAGE(INT_MIN, 5);
1287 TEST_COMPACT_NAT_STORAGE_RESERVE2(0, 1);
1288 TEST_COMPACT_NAT_STORAGE_RESERVE2(0x1f, 1);
1290 TEST_COMPACT_NAT_STORAGE_RESERVE2(0x20, 2);
1291 TEST_COMPACT_NAT_STORAGE_RESERVE2(0x101f, 2);
1293 TEST_COMPACT_NAT_STORAGE_RESERVE2(0x1020, 3);
1294 TEST_COMPACT_NAT_STORAGE_RESERVE2(0x08101f, 3);
1296 TEST_COMPACT_NAT_STORAGE_RESERVE2(0x081020, 4);
1297 TEST_COMPACT_NAT_STORAGE_RESERVE2(0x0408101f, 4);
1299 TEST_COMPACT_NAT_STORAGE_RESERVE2(0x04081020, 5);
1300 TEST_COMPACT_NAT_STORAGE_RESERVE2(0xffffffff, 5);
1303 TEST_COMPACT_NAT_STORAGE_RESERVE3(0, 1);
1304 TEST_COMPACT_NAT_STORAGE_RESERVE3(0xf, 1);
1306 TEST_COMPACT_NAT_STORAGE_RESERVE3(0x10, 2);
1307 TEST_COMPACT_NAT_STORAGE_RESERVE3(0x080f, 2);
1309 TEST_COMPACT_NAT_STORAGE_RESERVE3(0x0810, 3);
1310 TEST_COMPACT_NAT_STORAGE_RESERVE3(0x04080f, 3);
1312 TEST_COMPACT_NAT_STORAGE_RESERVE3(0x040810, 4);
1313 TEST_COMPACT_NAT_STORAGE_RESERVE3(0x0204080f, 4);
1315 TEST_COMPACT_NAT_STORAGE_RESERVE3(0x02040810, 5);
1316 TEST_COMPACT_NAT_STORAGE_RESERVE3(0xffffffff, 5);
1319 TEST_COMPACT_NAT_STORAGE_RESERVE4(0, 1);
1320 TEST_COMPACT_NAT_STORAGE_RESERVE4(0x07, 1);
1322 TEST_COMPACT_NAT_STORAGE_RESERVE4(0x08, 2);
1323 TEST_COMPACT_NAT_STORAGE_RESERVE4(0x0407, 2);
1325 TEST_COMPACT_NAT_STORAGE_RESERVE4(0x0408, 3);
1326 TEST_COMPACT_NAT_STORAGE_RESERVE4(0x020407, 3);
1328 TEST_COMPACT_NAT_STORAGE_RESERVE4(0x020408, 4);
1329 TEST_COMPACT_NAT_STORAGE_RESERVE4(0x01020407, 4);
1331 TEST_COMPACT_NAT_STORAGE_RESERVE4(0x01020408, 5);
1332 TEST_COMPACT_NAT_STORAGE_RESERVE4(0xffffffff, 5);
1335 TEST_COMPACT_INT_STORAGE_RESERVE3( 0, 1);
1336 TEST_COMPACT_INT_STORAGE_RESERVE3( 0x07, 1);
1337 TEST_COMPACT_INT_STORAGE_RESERVE3(-0x08, 1);
1339 TEST_COMPACT_INT_STORAGE_RESERVE3( 0x08, 2);
1340 TEST_COMPACT_INT_STORAGE_RESERVE3(-0x09, 2);
1341 TEST_COMPACT_INT_STORAGE_RESERVE3( 0x0407, 2);
1342 TEST_COMPACT_INT_STORAGE_RESERVE3(-0x0408, 2);
1344 TEST_COMPACT_INT_STORAGE_RESERVE3( 0x0408, 3);
1345 TEST_COMPACT_INT_STORAGE_RESERVE3(-0x0409, 3);
1346 TEST_COMPACT_INT_STORAGE_RESERVE3( 0x020407, 3);
1347 TEST_COMPACT_INT_STORAGE_RESERVE3(-0x020408, 3);
1349 TEST_COMPACT_INT_STORAGE_RESERVE3( 0x020408, 4);
1350 TEST_COMPACT_INT_STORAGE_RESERVE3(-0x020409, 4);
1351 TEST_COMPACT_INT_STORAGE_RESERVE3( 0x01020407, 4);
1352 TEST_COMPACT_INT_STORAGE_RESERVE3(-0x01020408, 4);
1354 TEST_COMPACT_INT_STORAGE_RESERVE3( 0x01020408, 5);
1355 TEST_COMPACT_INT_STORAGE_RESERVE3(-0x01020409, 5);
1356 TEST_COMPACT_INT_STORAGE_RESERVE3(INT_MAX, 5);
1357 TEST_COMPACT_INT_STORAGE_RESERVE3(INT_MIN, 5);
1362 TEST_COMPACT_NAT_STORAGE_RESERVE5(0, 1);
1366 #endif // UNIT_TESTS
long PTD_save_upper_tree(FILE *out, POS_TREE1 *&node, long pos, long &node_pos, ARB_ERROR &error)
#define PT1_CHAIN_SHORT_HEAD_SIZE
const int FLAG_SIZE_REDUCTION
void PT_add_to_chain(POS_TREE1 *node, const DataLoc &loc)
#define PT_SERVER_VERSION
bool PT_chain_has_valid_entries(const typename CHAINITER::POS_TREE_TYPE *const node)
static TYPE flag_2_type[256]
const char * get_mem() const
#define SHORT_CHAIN_HEADER_SIZE_MASK
const uint_32 MIN_SIZE_IN_FLAGS
const char * udata() const
#define PT1_NODE_SIZE(node)
STATIC_ASSERT(PT1_BASE_SIZE<=PT1_EMPTY_LEAF_SIZE)
void PTD_put_int(FILE *out, ULONG i)
void PTD_delete_saved_node(POS_TREE1 *&node)
#define PT1_EMPTY_NODE_SIZE
int main(int argc, char **argv)
POS_TREE1 * get_father() const
#define ASSERT_RESULT(Type, Expected, Expr)
GB_ERROR GB_IO_error(const char *action, const char *filename)
void PTD_put_longlong(FILE *out, ULONG i)
int get_memsize_of_saved(const POS_TREE1 *node)
const char * GBS_global_string(const char *templat,...)
ARB_ERROR PTD_read_leafs_from_disk(const char *fname, POS_TREE2 *&root_ptr)
const uint_32 MAX_SIZE_IN_FLAGS
int get_refabspos() const
probe_statistic_struct stat
long GB_size_of_file(const char *path)
char buffer[MESSAGE_BUFFERSIZE]
#define PT1_EMPTY_LEAF_SIZE
#define PT1_MIN_CHAIN_ENTRY_SIZE
void PTD_put_byte(FILE *out, ULONG i)
#define PT1_CHAIN_LONG_HEAD_SIZE
void enter_stage(Stage stage_)
static long PTD_write_chain_to_disk(FILE *out, POS_TREE1 *const node, const long oldpos, ARB_ERROR &error)
ChainEntryBuffer(int forElements, int refabspos_, int lastname_)
GB_ERROR GB_await_error()
static int diff(int v1, int v2, int v3, int v4, int st, int en)
#define TEST_EXPECT(cond)
#define PT1_MAX_CHAIN_ENTRY_SIZE
#define PT1_LEAF_SIZE(leaf)
#define does_differ_from(val)
long PTD_write_leafs_to_disk(FILE *out, POS_TREE1 *const node, long pos, long *node_pos, ARB_ERROR &error)
static long PTD_write_tip_to_disk(FILE *out, POS_TREE1 *node, const long oldpos)
static void PTD_set_object_to_saved_status(POS_TREE1 *node, long pos_start, uint_32 former_size)
void GBK_terminate(const char *error) __ATTR__NORETURN
#define pt_assert_stage(s)
#define SHORT_CHAIN_HEADER_ELEMS
void PT_init_cache_sizes(Stage stage)
void set_father(POS_TREE1 *new_father)
char * GB_map_file(const char *path, int writeable)
static void error(const char *msg)
expectation_group & add(const expectation &e)
struct pt_global PT_GLOBAL
static void PT_change_link_in_father(POS_TREE1 *father, POS_TREE1 *old_link, POS_TREE1 *new_link)
#define SHORT_CHAIN_HEADER_FLAG_BIT
bool locs_in_chain_order(const AbsLoc &loc1, const AbsLoc &loc2)
POS_TREE1 * PT_leaf_to_chain(POS_TREE1 *node)
POS_TREE1 * PT_create_leaf(POS_TREE1 **pfather, PT_base base, const DataLoc &loc)
void add(const AbsLoc &loc)
int get_refabspos() const
#define __ATTR__DONT_VECTORIZE_HERE
PT * PT_read_son(PT *node, PT_base base)
static long PTD_write_node_to_disk(FILE *out, POS_TREE1 *node, long *r_poss, const long oldpos)
#define TEST_EXPECTATION(EXPCTN)
const char * get_blocksize_description(int blocksize)
#define TEST_EXPECT_NULL(n)
#define TEST_EXPECT_CODE_ASSERTION_FAILS(cb)
static TYPE flag_2_type[256]
#define CACHE_SEQ_PERCENT
void PTD_debug_nodes(void)
#define TEST_EXPECT_NO_ERROR(call)
void put(void *vblock, int size)
const AbsLoc & at() const
#define pt_assert_valid_chain_stage1(node)
static void init_static()
static void init_static()
#define PT1_NODE_WITHSONS_SIZE(sons)
int get_elements_ahead() const
char count_bits[PT_BASES+1][256]
#define TEST_EXPECT_EQUAL(expr, want)
void PTD_put_short(FILE *out, ULONG i)
long PTD_save_lower_tree(FILE *out, POS_TREE1 *node, long pos, ARB_ERROR &error)
static int put_compact_nat(FILE *out, uint_32 nat)
POS_TREE1 * PT_change_leaf_to_node(POS_TREE1 *node)