diff options
Diffstat (limited to 'storage/innobase/page/page0cur.cc')
-rw-r--r-- | storage/innobase/page/page0cur.cc | 99 |
1 files changed, 31 insertions, 68 deletions
diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc index 204fedf9d29..16f0495527d 100644 --- a/storage/innobase/page/page0cur.cc +++ b/storage/innobase/page/page0cur.cc @@ -35,38 +35,6 @@ Created 10/4/1994 Heikki Tuuri #include <algorithm> -/*******************************************************************//** -This is a linear congruential generator PRNG. Returns a pseudo random -number between 0 and 2^64-1 inclusive. The formula and the constants -being used are: -X[n+1] = (a * X[n] + c) mod m -where: -X[0] = my_interval_timer() -a = 1103515245 (3^5 * 5 * 7 * 129749) -c = 12345 (3 * 5 * 823) -m = 18446744073709551616 (2^64) - -@return number between 0 and 2^64-1 */ -static -ib_uint64_t -page_cur_lcg_prng(void) -/*===================*/ -{ -#define LCG_a 1103515245 -#define LCG_c 12345 - static uint64_t lcg_current; - - if (!lcg_current) { - lcg_current = my_interval_timer(); - } - - /* no need to "% 2^64" explicitly because lcg_current is - 64 bit and this will be done anyway */ - lcg_current = LCG_a * lcg_current + LCG_c; - - return(lcg_current); -} - #ifdef BTR_CUR_HASH_ADAPT # ifdef UNIV_SEARCH_PERF_STAT static ulint page_cur_short_succ; @@ -99,8 +67,8 @@ page_cur_try_search_shortcut( ibool success = FALSE; const page_t* page = buf_block_get_frame(block); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dtuple_check_typed(tuple)); @@ -183,8 +151,8 @@ page_cur_try_search_shortcut_bytes( ibool success = FALSE; const page_t* page = buf_block_get_frame(block); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dtuple_check_typed(tuple)); @@ -255,7 +223,7 @@ page_cur_rec_field_extends( /*=======================*/ const dtuple_t* tuple, /*!< in: data tuple */ const rec_t* rec, /*!< in: record */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n) /*!< in: compare nth field */ { const dtype_t* type; @@ -331,8 +299,8 @@ page_cur_search_with_match( const page_zip_des_t* page_zip = buf_block_get_page_zip(block); #endif /* UNIV_ZIP_DEBUG */ mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dtuple_validate(tuple)); @@ -590,8 +558,8 @@ page_cur_search_with_match_bytes( const page_zip_des_t* page_zip = buf_block_get_page_zip(block); #endif /* UNIV_ZIP_DEBUG */ mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dtuple_validate(tuple)); @@ -803,8 +771,7 @@ page_cur_open_on_rnd_user_rec( buf_block_t* block, /*!< in: page */ page_cur_t* cursor) /*!< out: page cursor */ { - ulint rnd; - ulint n_recs = page_get_n_recs(buf_block_get_frame(block)); + const ulint n_recs = page_get_n_recs(block->frame); page_cur_set_before_first(block, cursor); @@ -813,11 +780,8 @@ page_cur_open_on_rnd_user_rec( return; } - rnd = (ulint) (page_cur_lcg_prng() % n_recs); - - do { - page_cur_move_to_next(cursor); - } while (rnd--); + cursor->rec = page_rec_get_nth(block->frame, + ut_rnd_interval(n_recs) + 1); } /** Write a redo log record of inserting a record into an index page. @@ -857,11 +821,11 @@ page_cur_insert_rec_write_log( { mem_heap_t* heap = NULL; - ulint cur_offs_[REC_OFFS_NORMAL_SIZE]; - ulint ins_offs_[REC_OFFS_NORMAL_SIZE]; + offset_t cur_offs_[REC_OFFS_NORMAL_SIZE]; + offset_t ins_offs_[REC_OFFS_NORMAL_SIZE]; - ulint* cur_offs; - ulint* ins_offs; + offset_t* cur_offs; + offset_t* ins_offs; rec_offs_init(cur_offs_); rec_offs_init(ins_offs_); @@ -1037,8 +1001,8 @@ page_cur_parse_insert_rec( ulint info_and_status_bits = 0; /* remove warning */ page_cur_t cursor; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); page = block ? buf_block_get_frame(block) : NULL; @@ -1255,7 +1219,7 @@ page_cur_insert_rec_low( which the new record is inserted */ dict_index_t* index, /*!< in: record descriptor */ const rec_t* rec, /*!< in: pointer to a physical record */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ { byte* insert_buf; @@ -1306,8 +1270,8 @@ page_cur_insert_rec_low( free_rec = page_header_get_ptr(page, PAGE_FREE); if (UNIV_LIKELY_NULL(free_rec)) { /* Try to allocate from the head of the free list. */ - ulint foffsets_[REC_OFFS_NORMAL_SIZE]; - ulint* foffsets = foffsets_; + offset_t foffsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* foffsets = foffsets_; mem_heap_t* heap = NULL; rec_offs_init(foffsets_); @@ -1478,7 +1442,7 @@ page_cur_insert_rec_zip( page_cur_t* cursor, /*!< in/out: page cursor */ dict_index_t* index, /*!< in: record descriptor */ const rec_t* rec, /*!< in: pointer to a physical record */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ { byte* insert_buf; @@ -1719,8 +1683,8 @@ page_cur_insert_rec_zip( if (UNIV_LIKELY_NULL(free_rec)) { /* Try to allocate from the head of the free list. */ lint extra_size_diff; - ulint foffsets_[REC_OFFS_NORMAL_SIZE]; - ulint* foffsets = foffsets_; + offset_t foffsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* foffsets = foffsets_; mem_heap_t* heap = NULL; rec_offs_init(foffsets_); @@ -2042,8 +2006,8 @@ page_copy_rec_list_end_to_created_page( byte* log_ptr; ulint log_data_len; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(page_dir_get_n_heap(new_page) == PAGE_HEAP_NO_USER_LOW); @@ -2266,7 +2230,7 @@ page_cur_parse_delete_rec( if (block) { page_t* page = buf_block_get_frame(block); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; rec_t* rec = page + offset; rec_offs_init(offsets_); @@ -2294,7 +2258,7 @@ page_cur_delete_rec( /*================*/ page_cur_t* cursor, /*!< in/out: a page cursor */ const dict_index_t* index, /*!< in: record descriptor */ - const ulint* offsets,/*!< in: rec_get_offsets( + const offset_t* offsets,/*!< in: rec_get_offsets( cursor->rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle or NULL */ @@ -2430,18 +2394,17 @@ page_cur_delete_rec( #ifdef UNIV_COMPILE_TEST_FUNCS /*******************************************************************//** -Print the first n numbers, generated by page_cur_lcg_prng() to make sure +Print the first n numbers, generated by ut_rnd_gen() to make sure (visually) that it works properly. */ void -test_page_cur_lcg_prng( -/*===================*/ +test_ut_rnd_gen( int n) /*!< in: print first n numbers */ { int i; unsigned long long rnd; for (i = 0; i < n; i++) { - rnd = page_cur_lcg_prng(); + rnd = ut_rnd_gen(); printf("%llu\t%%2=%llu %%3=%llu %%5=%llu %%7=%llu %%11=%llu\n", rnd, rnd % 2, |