29 #include "page0cur.ic"
37 #ifndef UNIV_HOTBACKUP
41 # ifdef UNIV_SEARCH_PERF_STAT
42 static ulint page_cur_short_succ = 0;
59 page_cur_lcg_prng(
void)
62 #define LCG_a 1103515245
64 static ib_uint64_t lcg_current = 0;
65 static ibool initialized = FALSE;
74 lcg_current = LCG_a * lcg_current + LCG_c;
84 page_cur_try_search_shortcut(
89 ulint* iup_matched_fields,
92 ulint* iup_matched_bytes,
96 ulint* ilow_matched_fields,
99 ulint* ilow_matched_bytes,
106 const rec_t* next_rec;
111 #ifdef UNIV_SEARCH_DEBUG
114 ibool success = FALSE;
115 const page_t*
page = buf_block_get_frame(block);
117 ulint offsets_[REC_OFFS_NORMAL_SIZE];
119 rec_offs_init(offsets_);
124 offsets = rec_get_offsets(rec, index, offsets,
131 *ilow_matched_fields, *ilow_matched_bytes,
132 *iup_matched_fields, *iup_matched_bytes);
134 up_match = low_match;
135 up_bytes = low_bytes;
138 &low_match, &low_bytes) < 0) {
143 offsets = rec_get_offsets(next_rec, index, offsets,
147 &up_match, &up_bytes) >= 0) {
153 #ifdef UNIV_SEARCH_DEBUG
164 ut_a(*iup_matched_fields == up_match);
165 ut_a(*iup_matched_bytes == up_bytes);
168 ut_a(*ilow_matched_fields == low_match);
169 ut_a(*ilow_matched_bytes == low_bytes);
173 *iup_matched_fields = up_match;
174 *iup_matched_bytes = up_bytes;
177 *ilow_matched_fields = low_match;
178 *ilow_matched_bytes = low_bytes;
180 #ifdef UNIV_SEARCH_PERF_STAT
181 page_cur_short_succ++;
185 if (UNIV_LIKELY_NULL(heap)) {
193 #ifdef PAGE_CUR_LE_OR_EXTENDS
201 page_cur_rec_field_extends(
205 const ulint* offsets,
213 ut_ad(rec_offs_validate(rec, NULL, offsets));
214 dfield = dtuple_get_nth_field(tuple, n);
216 type = dfield_get_type(dfield);
218 rec_f = rec_get_nth_field(rec, offsets, n, &rec_f_len);
220 if (type->
mtype == DATA_VARCHAR
221 || type->
mtype == DATA_CHAR
222 || type->
mtype == DATA_FIXBINARY
223 || type->
mtype == DATA_BINARY
224 || type->
mtype == DATA_BLOB
225 || type->
mtype == DATA_VARMYSQL
226 || type->
mtype == DATA_MYSQL) {
229 && rec_f_len != UNIV_SQL_NULL
232 dfield_get_data(dfield),
256 ulint* iup_matched_fields,
259 ulint* iup_matched_bytes,
263 ulint* ilow_matched_fields,
266 ulint* ilow_matched_bytes,
276 const page_dir_slot_t* slot;
278 const rec_t* low_rec;
279 const rec_t* mid_rec;
280 ulint up_matched_fields;
281 ulint up_matched_bytes;
282 ulint low_matched_fields;
283 ulint low_matched_bytes;
284 ulint cur_matched_fields;
285 ulint cur_matched_bytes;
287 #ifdef UNIV_SEARCH_DEBUG
289 ulint dbg_matched_fields;
290 ulint dbg_matched_bytes;
292 #ifdef UNIV_ZIP_DEBUG
296 ulint offsets_[REC_OFFS_NORMAL_SIZE];
297 ulint* offsets = offsets_;
298 rec_offs_init(offsets_);
300 ut_ad(block && tuple && iup_matched_fields && iup_matched_bytes
301 && ilow_matched_fields && ilow_matched_bytes && cursor);
302 ut_ad(dtuple_validate(tuple));
305 if (mode != PAGE_CUR_DBG)
307 # ifdef PAGE_CUR_LE_OR_EXTENDS
308 if (mode != PAGE_CUR_LE_OR_EXTENDS)
310 ut_ad(mode == PAGE_CUR_L || mode == PAGE_CUR_LE
311 || mode == PAGE_CUR_G || mode == PAGE_CUR_GE);
313 page = buf_block_get_frame(block);
314 #ifdef UNIV_ZIP_DEBUG
315 ut_a(!page_zip || page_zip_validate(page_zip, page, index));
320 #ifdef PAGE_CUR_ADAPT
322 && (mode == PAGE_CUR_LE)
327 if (page_cur_try_search_shortcut(
329 iup_matched_fields, iup_matched_bytes,
330 ilow_matched_fields, ilow_matched_bytes,
336 if (mode == PAGE_CUR_DBG) {
344 #ifdef PAGE_CUR_LE_OR_EXTENDS
345 ut_a(mode != PAGE_CUR_LE_OR_EXTENDS);
354 up_matched_fields = *iup_matched_fields;
355 up_matched_bytes = *iup_matched_bytes;
356 low_matched_fields = *ilow_matched_fields;
357 low_matched_bytes = *ilow_matched_bytes;
369 while (up - low > 1) {
370 mid = (low + up) / 2;
371 slot = page_dir_get_nth_slot(page, mid);
374 ut_pair_min(&cur_matched_fields, &cur_matched_bytes,
375 low_matched_fields, low_matched_bytes,
376 up_matched_fields, up_matched_bytes);
378 offsets = rec_get_offsets(mid_rec, index, offsets,
382 cmp = cmp_dtuple_rec_with_match(tuple, mid_rec, offsets,
385 if (UNIV_LIKELY(cmp > 0)) {
388 low_matched_fields = cur_matched_fields;
389 low_matched_bytes = cur_matched_bytes;
391 }
else if (UNIV_EXPECT(cmp, -1)) {
392 #ifdef PAGE_CUR_LE_OR_EXTENDS
393 if (mode == PAGE_CUR_LE_OR_EXTENDS
394 && page_cur_rec_field_extends(
395 tuple, mid_rec, offsets,
396 cur_matched_fields)) {
403 up_matched_fields = cur_matched_fields;
404 up_matched_bytes = cur_matched_bytes;
406 }
else if (mode == PAGE_CUR_G || mode == PAGE_CUR_LE
407 #ifdef PAGE_CUR_LE_OR_EXTENDS
408 || mode == PAGE_CUR_LE_OR_EXTENDS
419 slot = page_dir_get_nth_slot(page, low);
421 slot = page_dir_get_nth_slot(page, up);
431 ut_pair_min(&cur_matched_fields, &cur_matched_bytes,
432 low_matched_fields, low_matched_bytes,
433 up_matched_fields, up_matched_bytes);
435 offsets = rec_get_offsets(mid_rec, index, offsets,
439 cmp = cmp_dtuple_rec_with_match(tuple, mid_rec, offsets,
442 if (UNIV_LIKELY(cmp > 0)) {
445 low_matched_fields = cur_matched_fields;
446 low_matched_bytes = cur_matched_bytes;
448 }
else if (UNIV_EXPECT(cmp, -1)) {
449 #ifdef PAGE_CUR_LE_OR_EXTENDS
450 if (mode == PAGE_CUR_LE_OR_EXTENDS
451 && page_cur_rec_field_extends(
452 tuple, mid_rec, offsets,
453 cur_matched_fields)) {
460 up_matched_fields = cur_matched_fields;
461 up_matched_bytes = cur_matched_bytes;
462 }
else if (mode == PAGE_CUR_G || mode == PAGE_CUR_LE
463 #ifdef PAGE_CUR_LE_OR_EXTENDS
464 || mode == PAGE_CUR_LE_OR_EXTENDS
475 #ifdef UNIV_SEARCH_DEBUG
479 dbg_matched_fields = 0;
480 dbg_matched_bytes = 0;
482 offsets = rec_get_offsets(low_rec, index, offsets,
483 ULINT_UNDEFINED, &heap);
487 if (mode == PAGE_CUR_G) {
489 }
else if (mode == PAGE_CUR_GE) {
491 }
else if (mode == PAGE_CUR_L) {
493 }
else if (mode == PAGE_CUR_LE) {
499 ut_a(low_matched_fields == dbg_matched_fields);
500 ut_a(low_matched_bytes == dbg_matched_bytes);
503 dbg_matched_fields = 0;
504 dbg_matched_bytes = 0;
506 offsets = rec_get_offsets(up_rec, index, offsets,
507 ULINT_UNDEFINED, &heap);
511 if (mode == PAGE_CUR_G) {
513 }
else if (mode == PAGE_CUR_GE) {
515 }
else if (mode == PAGE_CUR_L) {
517 }
else if (mode == PAGE_CUR_LE) {
523 ut_a(up_matched_fields == dbg_matched_fields);
524 ut_a(up_matched_bytes == dbg_matched_bytes);
527 if (mode <= PAGE_CUR_GE) {
533 *iup_matched_fields = up_matched_fields;
534 *iup_matched_bytes = up_matched_bytes;
535 *ilow_matched_fields = low_matched_fields;
536 *ilow_matched_bytes = low_matched_bytes;
537 if (UNIV_LIKELY_NULL(heap)) {
557 if (UNIV_UNLIKELY(n_recs == 0)) {
562 rnd = (ulint) (page_cur_lcg_prng() % n_recs);
573 page_cur_insert_rec_write_log(
584 ulint cur_extra_size;
590 ut_a(rec_size < UNIV_PAGE_SIZE);
597 ulint cur_offs_[REC_OFFS_NORMAL_SIZE];
598 ulint ins_offs_[REC_OFFS_NORMAL_SIZE];
603 rec_offs_init(cur_offs_);
604 rec_offs_init(ins_offs_);
606 cur_offs = rec_get_offsets(cursor_rec, index, cur_offs_,
607 ULINT_UNDEFINED, &heap);
608 ins_offs = rec_get_offsets(insert_rec, index, ins_offs_,
609 ULINT_UNDEFINED, &heap);
616 if (UNIV_LIKELY_NULL(heap)) {
621 ins_ptr = insert_rec - extra_size;
625 if (cur_extra_size == extra_size) {
626 ulint min_rec_size =
ut_min(cur_rec_size, rec_size);
628 const byte* cur_ptr = cursor_rec - cur_extra_size;
634 if (*ins_ptr == *cur_ptr) {
638 }
else if ((i < extra_size)
643 ins_ptr = insert_rec;
644 cur_ptr = cursor_rec;
648 }
while (i < min_rec_size);
656 2 + 5 + 1 + 5 + 5 + MLOG_BUF_MARGIN);
657 if (UNIV_UNLIKELY(!log_ptr)) {
667 if (UNIV_UNLIKELY(!log_ptr)) {
678 log_end = &log_ptr[2 + 5 + 1 + 5 + 5 + MLOG_BUF_MARGIN];
683 log_ptr =
mlog_open(mtr, 5 + 1 + 5 + 5 + MLOG_BUF_MARGIN);
689 log_end = &log_ptr[5 + 1 + 5 + 5 + MLOG_BUF_MARGIN];
697 goto need_extra_info;
704 goto need_extra_info;
708 if (extra_size != cur_extra_size || rec_size != cur_rec_size) {
713 2 * (rec_size - i) + 1);
728 ut_a(i < UNIV_PAGE_SIZE);
729 ut_a(extra_size < UNIV_PAGE_SIZE);
741 if (log_ptr + rec_size <= log_end) {
742 memcpy(log_ptr, ins_ptr, rec_size);
746 ut_a(rec_size < UNIV_PAGE_SIZE);
751 # define page_cur_insert_rec_write_log(ins_rec,size,cur,index,mtr) ((void) 0)
770 ulint mismatch_index;
776 ulint info_and_status_bits = 0;
779 ulint offsets_[REC_OFFS_NORMAL_SIZE];
780 ulint* offsets = offsets_;
781 rec_offs_init(offsets_);
783 page = block ? buf_block_get_frame(block) : NULL;
792 if (UNIV_UNLIKELY(end_ptr < ptr + 2)) {
800 cursor_rec = page +
offset;
802 if (UNIV_UNLIKELY(offset >= UNIV_PAGE_SIZE)) {
817 if (UNIV_UNLIKELY(end_seg_len >= UNIV_PAGE_SIZE << 1)) {
823 if (end_seg_len & 0x1UL) {
826 if (end_ptr < ptr + 1) {
841 ut_a(origin_offset < UNIV_PAGE_SIZE);
850 ut_a(mismatch_index < UNIV_PAGE_SIZE);
853 if (UNIV_UNLIKELY(end_ptr < ptr + (end_seg_len >> 1))) {
860 return(ptr + (end_seg_len >> 1));
869 offsets = rec_get_offsets(cursor_rec, index, offsets,
870 ULINT_UNDEFINED, &heap);
872 if (!(end_seg_len & 0x1UL)) {
876 mismatch_index =
rec_offs_size(offsets) - (end_seg_len >> 1);
881 if (mismatch_index + end_seg_len <
sizeof buf1) {
884 buf =
static_cast<byte*
>(
885 mem_alloc(mismatch_index + end_seg_len));
890 if (UNIV_UNLIKELY(mismatch_index >= UNIV_PAGE_SIZE)) {
892 "Is short %lu, info_and_status_bits %lu, offset %lu, "
894 "mismatch index %lu, end_seg_len %lu\n"
896 (ulong) is_short, (ulong) info_and_status_bits,
898 (ulong) origin_offset,
899 (ulong) mismatch_index, (ulong) end_seg_len,
900 (ulong) (ptr - ptr2));
902 fputs(
"Dump of 300 bytes of log:\n", stderr);
911 ut_memcpy(buf, rec_get_start(cursor_rec, offsets), mismatch_index);
912 ut_memcpy(buf + mismatch_index, ptr, end_seg_len);
916 info_and_status_bits);
919 info_and_status_bits);
924 offsets = rec_get_offsets(buf + origin_offset, index, offsets,
925 ULINT_UNDEFINED, &heap);
928 index, offsets, mtr))) {
939 if (UNIV_LIKELY_NULL(heap)) {
943 return(ptr + end_seg_len);
973 ut_ad(rec_offs_validate(rec, index, offsets));
987 #ifdef UNIV_DEBUG_VALGRIND
989 const void* rec_start
994 ? REC_N_NEW_EXTRA_BYTES
995 : REC_N_OLD_EXTRA_BYTES);
1000 UNIV_MEM_ASSERT_RW(rec_start, extra_size);
1007 if (UNIV_LIKELY_NULL(free_rec)) {
1009 ulint foffsets_[REC_OFFS_NORMAL_SIZE];
1010 ulint* foffsets = foffsets_;
1013 rec_offs_init(foffsets_);
1015 foffsets = rec_get_offsets(
1016 free_rec, index, foffsets, ULINT_UNDEFINED, &heap);
1018 if (UNIV_LIKELY_NULL(heap)) {
1039 if (UNIV_LIKELY_NULL(heap)) {
1046 rec_size, &heap_no);
1048 if (UNIV_UNLIKELY(insert_buf == NULL)) {
1054 insert_rec =
rec_copy(insert_buf, rec, offsets);
1055 rec_offs_make_valid(insert_rec, index, offsets);
1058 ut_ad(current_rec != insert_rec);
1066 <= REC_STATUS_INFIMUM);
1088 UNIV_MEM_ASSERT_RW(rec_get_start(insert_rec, offsets),
1097 if (UNIV_UNLIKELY(last_insert == NULL)) {
1102 }
else if ((last_insert == current_rec)
1110 page, PAGE_N_DIRECTION) + 1);
1120 page, PAGE_N_DIRECTION) + 1);
1145 if (UNIV_UNLIKELY(n_owned == PAGE_DIR_SLOT_MAX_N_OWNED)) {
1153 if (UNIV_LIKELY(mtr != NULL)) {
1154 page_cur_insert_rec_write_log(insert_rec, rec_size,
1155 current_rec, index, mtr);
1158 btr_blob_dbg_add_rec(insert_rec, index, offsets,
"insert");
1197 page_zip = page_cur_get_page_zip(cursor);
1200 ut_ad(rec_offs_validate(rec, index, offsets));
1202 page = page_cur_get_page(cursor);
1210 #ifdef UNIV_ZIP_DEBUG
1211 ut_a(page_zip_validate(page_zip, page, index));
1217 #ifdef UNIV_DEBUG_VALGRIND
1219 const void* rec_start
1224 ? REC_N_NEW_EXTRA_BYTES
1225 : REC_N_OLD_EXTRA_BYTES);
1230 UNIV_MEM_ASSERT_RW(rec_start, extra_size);
1242 || reorg_before_insert) {
1244 bool log_compressed = page_zip_log_pages;
1245 ulint
level = page_zip_level;
1247 rec_t* cursor_rec = page_cur_get_rec(cursor);
1279 }
else if (log_compressed && !reorg_before_insert) {
1284 cursor, index, mtr)) {
1301 cursor->
rec, index, rec, offsets, NULL);
1320 if (insert_rec == NULL) {
1330 rec_offs_make_valid(insert_rec, index, offsets);
1335 if (!log_compressed) {
1337 page_zip, page, index,
1339 page_cur_insert_rec_write_log(
1340 insert_rec, rec_size,
1341 cursor->
rec, index, mtr);
1343 level, page, index, mtr);
1345 rec_offs_make_valid(
1346 insert_rec, index, offsets);
1354 : page + PAGE_NEW_INFIMUM));
1360 cursor->
block, index, mtr)) {
1373 rec_offs_make_valid(
1374 insert_rec, index, offsets);
1389 btr_blob_dbg_remove(page, index,
"insert_zip_fail");
1394 btr_blob_dbg_add(page, index,
"insert_zip_fail");
1402 if (UNIV_LIKELY_NULL(free_rec)) {
1404 lint extra_size_diff;
1405 ulint foffsets_[REC_OFFS_NORMAL_SIZE];
1406 ulint* foffsets = foffsets_;
1409 rec_offs_init(foffsets_);
1411 foffsets = rec_get_offsets(free_rec, index, foffsets,
1412 ULINT_UNDEFINED, &heap);
1415 if (UNIV_LIKELY_NULL(heap)) {
1430 if (UNIV_UNLIKELY(extra_size_diff < 0)) {
1433 < rec_size - extra_size_diff) {
1438 insert_buf -= extra_size_diff;
1439 }
else if (UNIV_UNLIKELY(extra_size_diff)) {
1455 ut_ad(rec_size > REC_NODE_PTR_SIZE);
1460 memset(rec_get_end(free_rec, foffsets)
1461 - REC_NODE_PTR_SIZE, 0,
1475 ut_ad(trx_id_col > 0);
1476 ut_ad(trx_id_col != ULINT_UNDEFINED);
1480 ut_ad(len == DATA_TRX_ID_LEN);
1482 if (DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN + trx_id_offs
1489 memset(free_rec + trx_id_offs, 0,
1490 DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN);
1493 ut_ad(free_rec + trx_id_offs + DATA_TRX_ID_LEN
1494 == rec_get_nth_field(free_rec, foffsets,
1495 trx_id_col + 1, &len));
1496 ut_ad(len == DATA_ROLL_PTR_LEN);
1499 if (UNIV_LIKELY_NULL(heap)) {
1506 rec_size, &heap_no);
1508 if (UNIV_UNLIKELY(insert_buf == NULL)) {
1516 insert_rec =
rec_copy(insert_buf, rec, offsets);
1517 rec_offs_make_valid(insert_rec, index, offsets);
1527 <= REC_STATUS_INFIMUM);
1543 UNIV_MEM_ASSERT_RW(rec_get_start(insert_rec, offsets),
1555 if (UNIV_UNLIKELY(last_insert == NULL)) {
1560 }
else if ((last_insert == cursor->
rec)
1568 page, PAGE_N_DIRECTION) + 1);
1578 page, PAGE_N_DIRECTION) + 1);
1599 if (UNIV_UNLIKELY(n_owned == PAGE_DIR_SLOT_MAX_N_OWNED)) {
1608 btr_blob_dbg_add_rec(insert_rec, index, offsets,
"insert_zip_ok");
1611 if (UNIV_LIKELY(mtr != NULL)) {
1612 page_cur_insert_rec_write_log(insert_rec, rec_size,
1613 cursor->
rec, index, mtr);
1619 #ifndef UNIV_HOTBACKUP
1640 if (UNIV_LIKELY(log_ptr != NULL)) {
1666 if (ptr + 4 > end_ptr) {
1674 rec_end = ptr + log_data_len;
1676 if (rec_end > end_ptr) {
1686 while (ptr < rec_end) {
1691 ut_a(ptr == rec_end);
1693 page = buf_block_get_frame(block);
1704 #ifndef UNIV_HOTBACKUP
1722 page_dir_slot_t* slot = 0;
1724 rec_t* insert_rec = 0;
1734 ulint offsets_[REC_OFFS_NORMAL_SIZE];
1735 ulint* offsets = offsets_;
1736 rec_offs_init(offsets_);
1757 new_page + UNIV_PAGE_SIZE - 1);
1769 prev_rec = page_get_infimum_rec(new_page);
1771 heap_top = new_page + PAGE_NEW_SUPREMUM_END;
1773 heap_top = new_page + PAGE_OLD_SUPREMUM_END;
1780 offsets = rec_get_offsets(rec, index, offsets,
1781 ULINT_UNDEFINED, &heap);
1782 insert_rec =
rec_copy(heap_top, rec, offsets);
1790 PAGE_HEAP_NO_USER_LOW + n_recs);
1797 PAGE_HEAP_NO_USER_LOW + n_recs);
1804 (count == (PAGE_DIR_SLOT_MAX_N_OWNED + 1) / 2)) {
1808 slot = page_dir_get_nth_slot(new_page, slot_index);
1818 ut_ad(heap_top < new_page + UNIV_PAGE_SIZE);
1820 heap_top += rec_size;
1822 rec_offs_make_valid(insert_rec, index, offsets);
1823 btr_blob_dbg_add_rec(insert_rec, index, offsets,
"copy_end");
1825 page_cur_insert_rec_write_log(insert_rec, rec_size, prev_rec,
1827 prev_rec = insert_rec;
1831 if ((slot_index > 0) && (count + 1
1832 + (PAGE_DIR_SLOT_MAX_N_OWNED + 1) / 2
1833 <= PAGE_DIR_SLOT_MAX_N_OWNED)) {
1841 count += (PAGE_DIR_SLOT_MAX_N_OWNED + 1) / 2;
1848 if (UNIV_LIKELY_NULL(heap)) {
1854 ut_a(log_data_len < 100 * UNIV_PAGE_SIZE);
1856 if (UNIV_LIKELY(log_ptr != NULL)) {
1866 slot = page_dir_get_nth_slot(new_page, 1 + slot_index);
1917 # define page_cur_delete_rec_write_log(rec,index,mtr) ((void) 0)
1936 if (end_ptr < ptr + 2) {
1945 ut_a(offset <= UNIV_PAGE_SIZE);
1948 page_t* page = buf_block_get_frame(block);
1950 ulint offsets_[REC_OFFS_NORMAL_SIZE];
1951 rec_t* rec = page +
offset;
1952 rec_offs_init(offsets_);
1958 rec_get_offsets(rec, index, offsets_,
1959 ULINT_UNDEFINED, &heap),
1961 if (UNIV_LIKELY_NULL(heap)) {
1978 const ulint* offsets,
1982 page_dir_slot_t* cur_dir_slot;
1983 page_dir_slot_t* prev_slot;
1987 rec_t* prev_rec = NULL;
1993 page = page_cur_get_page(cursor);
1994 page_zip = page_cur_get_page_zip(cursor);
2004 current_rec = cursor->
rec;
2005 ut_ad(rec_offs_validate(current_rec, index, offsets));
2028 const_cast<dict_index_t*>(index), mtr);
2034 ut_ad(cur_slot_no > 0);
2035 cur_dir_slot = page_dir_get_nth_slot(page, cur_slot_no);
2060 ut_ad(cur_slot_no > 0);
2061 prev_slot = page_dir_get_nth_slot(page, cur_slot_no - 1);
2068 while(current_rec != rec) {
2074 next_rec = cursor->
rec;
2085 #if PAGE_DIR_SLOT_MIN_N_OWNED < 2
2086 # error "PAGE_DIR_SLOT_MIN_N_OWNED < 2"
2088 ut_ad(cur_n_owned > 1);
2099 btr_blob_dbg_remove_rec(current_rec, const_cast<dict_index_t*>(index),
2107 if (cur_n_owned <= PAGE_DIR_SLOT_MIN_N_OWNED) {
2111 #ifdef UNIV_ZIP_DEBUG
2112 ut_a(!page_zip || page_zip_validate(page_zip, page, index));
2116 #ifdef UNIV_COMPILE_TEST_FUNCS
2122 test_page_cur_lcg_prng(
2127 unsigned long long rnd;
2129 for (i = 0; i <
n; i++) {
2130 rnd = page_cur_lcg_prng();
2131 printf(
"%llu\t%%2=%llu %%3=%llu %%5=%llu %%7=%llu %%11=%llu\n",