mariadb/include/sync0sync.h
inaam 8a3ea85c92 branches/innodb+: Merge revisions 5144:5524 from branches/zip
------------------------------------------------------------------------
  r5147 | marko | 2009-05-27 06:55:14 -0400 (Wed, 27 May 2009) | 1 line
  
  branches/zip: ibuf0ibuf.c: Improve a comment.
  ------------------------------------------------------------------------
  r5149 | marko | 2009-05-27 07:46:42 -0400 (Wed, 27 May 2009) | 34 lines
  
  branches/zip: Merge revisions 4994:5148 from branches/5.1:
  
    ------------------------------------------------------------------------
    r5126 | vasil | 2009-05-26 16:57:12 +0300 (Tue, 26 May 2009) | 9 lines
  
    branches/5.1:
  
    Preparation for the fix of
    Bug#45097 Hang during recovery, redo logs for doublewrite buffer pages
  
    Non-functional change: move FSP_* macros from fsp0fsp.h to a new file
    fsp0types.h. This is needed in order to be able to use FSP_EXTENT_SIZE
    in mtr0log.ic.
    ------------------------------------------------------------------------
    r5127 | vasil | 2009-05-26 17:05:43 +0300 (Tue, 26 May 2009) | 9 lines
  
    branches/5.1:
  
    Preparation for the fix of
    Bug#45097 Hang during recovery, redo logs for doublewrite buffer pages
  
    Do not include unnecessary headers mtr0log.h and fut0lst.h in trx0sys.h
    and include fsp0fsp.h just before it is needed. This is needed in order
    to be able to use TRX_SYS_SPACE in mtr0log.ic.
    ------------------------------------------------------------------------
    r5128 | vasil | 2009-05-26 17:26:37 +0300 (Tue, 26 May 2009) | 7 lines
  
    branches/5.1:
  
    Fix Bug#45097 Hang during recovery, redo logs for doublewrite buffer pages
  
    Do not write redo log for the pages in the doublewrite buffer. Also, do not
    make a dummy change to the page because this is not needed.
    ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r5169 | marko | 2009-05-28 03:21:55 -0400 (Thu, 28 May 2009) | 1 line
  
  branches/zip: mtr0mtr.h: Add Doxygen comments for the redo log entry types.
  ------------------------------------------------------------------------
  r5176 | marko | 2009-05-28 07:14:02 -0400 (Thu, 28 May 2009) | 1 line
  
  branches/zip: Correct a debug assertion that was added in r5125.
  ------------------------------------------------------------------------
  r5201 | marko | 2009-06-01 06:35:25 -0400 (Mon, 01 Jun 2009) | 2 lines
  
  branches/zip: Clean up some comments.
  Make the rec parameter of mlog_open_and_write_index() const.
  ------------------------------------------------------------------------
  r5234 | marko | 2009-06-03 08:26:41 -0400 (Wed, 03 Jun 2009) | 44 lines
  
  branches/zip: Merge revisions 5148:5233 from branches/5.1:
  
    ------------------------------------------------------------------------
    r5150 | vasil | 2009-05-27 18:56:03 +0300 (Wed, 27 May 2009) | 4 lines
  
    branches/5.1:
  
    Whitespace fixup.
    ------------------------------------------------------------------------
    r5191 | vasil | 2009-05-30 17:46:05 +0300 (Sat, 30 May 2009) | 19 lines
  
    branches/5.1:
  
    Merge a change from MySQL (this fixes the failing innodb_mysql test):
  
      ------------------------------------------------------------
      revno: 1810.3894.10
      committer: Sergey Glukhov <Sergey.Glukhov@sun.com>
      branch nick: mysql-5.0-bugteam
      timestamp: Tue 2009-05-19 11:32:21 +0500
      message:
        Bug#39793 Foreign keys not constructed when column has a '#' in a comment or default value
        Internal InnoDN FK parser does not recognize '\'' as quotation symbol.
        Suggested fix is to add '\'' symbol check for quotation condition
        (dict_strip_comments() function).
      modified:
        innobase/dict/dict0dict.c
        mysql-test/r/innodb_mysql.result
        mysql-test/t/innodb_mysql.test
    ------------------------------------------------------------------------
    r5233 | marko | 2009-06-03 15:12:44 +0300 (Wed, 03 Jun 2009) | 11 lines
  
    branches/5.1: Merge the test case from r5232 from branches/5.0:
      ------------------------------------------------------------------------
      r5232 | marko | 2009-06-03 14:31:04 +0300 (Wed, 03 Jun 2009) | 21 lines
  
      branches/5.0: Merge r3590 from branches/5.1 in order to fix Bug #40565
      (Update Query Results in "1 Row Affected" But Should Be "Zero Rows").
  
      Also, add a test case for Bug #40565.
  
      rb://128 approved by Heikki Tuuri
      ------------------------------------------------------------------------
    ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r5250 | marko | 2009-06-04 02:58:23 -0400 (Thu, 04 Jun 2009) | 1 line
  
  branches/zip: Add Doxygen comments to the rest of buf0*.
  ------------------------------------------------------------------------
  r5251 | marko | 2009-06-04 02:59:51 -0400 (Thu, 04 Jun 2009) | 1 line
  
  branches/zip: Replace <= in a function comment.
  ------------------------------------------------------------------------
  r5253 | marko | 2009-06-04 06:37:35 -0400 (Thu, 04 Jun 2009) | 1 line
  
  branches/zip: Add missing Doxygen comments for page0zip.
  ------------------------------------------------------------------------
  r5261 | vasil | 2009-06-05 11:13:31 -0400 (Fri, 05 Jun 2009) | 15 lines
  
  branches/zip:
  
  Fix Mantis Issue#244 fix bug in linear read ahead (no check on access pattern)
  
  The changes are:
  
  1) Take into account access pattern when deciding whether or not to do linear
    read ahead.
  2) Expose a knob innodb_read_ahead_factor = [0-64] default (8), dynamic,
    global to control linear read ahead behvior
  3) Disable random read ahead. Keep the code for now.
  
  Submitted by:	Inaam (rb://122)
  Approved by:	Heikki (rb://122)
  
  ------------------------------------------------------------------------
  r5262 | vasil | 2009-06-05 12:04:25 -0400 (Fri, 05 Jun 2009) | 22 lines
  
  branches/zip:
  
  Enable functionality to have multiple background io helper threads.
  This patch is based on percona contributions.
  
  More details about this patch will be written at:
  https://svn.innodb.com/innobase/MultipleBackgroundThreads
  
  The patch essentially does the following:
  
  expose following knobs:
  innodb_read_io_threads = [1 - 64] default 1
  innodb_write_io_threads = [1 - 64] default 1
  
  deprecate innodb_file_io_threads (this parameter was relevant only on windows)
  
  Internally it allows multiple segments for read and write IO request arrays
  where one thread works on one segement.
  
  Submitted by:	Inaam (rb://124)
  Approved by:	Heikki (rb://124)
  
  ------------------------------------------------------------------------
  r5263 | vasil | 2009-06-05 12:19:37 -0400 (Fri, 05 Jun 2009) | 4 lines
  
  branches/zip:
  
  Whitespace cleanup.
  
  ------------------------------------------------------------------------
  r5264 | vasil | 2009-06-05 12:26:58 -0400 (Fri, 05 Jun 2009) | 4 lines
  
  branches/zip:
  
  Add ChangeLog entry for r5261.
  
  ------------------------------------------------------------------------
  r5265 | vasil | 2009-06-05 12:34:11 -0400 (Fri, 05 Jun 2009) | 4 lines
  
  branches/zip:
  
  Add ChangeLog entry for r5262.
  
  ------------------------------------------------------------------------
  r5268 | inaam | 2009-06-08 12:18:21 -0400 (Mon, 08 Jun 2009) | 7 lines
  
  branches/zip
  
  Non functional change:
  
  Added legal notices acknowledging percona contribution to the multiple
  IO helper threads patch i.e.: r5262
  
  ------------------------------------------------------------------------
  r5283 | inaam | 2009-06-09 13:46:29 -0400 (Tue, 09 Jun 2009) | 9 lines
  
  branches/zip
  
  rb://130
  
  Enable Group Commit functionality that was broken in 5.0 when
  distributed transactions were introduced.
  
  Reviewed by: Heikki
  
  ------------------------------------------------------------------------
  r5319 | marko | 2009-06-11 04:40:33 -0400 (Thu, 11 Jun 2009) | 3 lines
  
  branches/zip: Declare os_thread_id_t as unsigned long,
  because ulint is wrong on Win64.
  Pointed out by Vladislav Vaintroub <wlad@sun.com>.
  ------------------------------------------------------------------------
  r5320 | inaam | 2009-06-11 09:15:41 -0400 (Thu, 11 Jun 2009) | 14 lines
  
  branches/zip	rb://131
  
  This patch changes the following defaults:
  
  max_dirty_pages_pct: default from 90 to 75. max allowed from 100 to 99
  additional_mem_pool_size: default from 1 to 8 MB
  buffer_pool_size: default from 8 to 128 MB
  log_buffer_size: default from 1 to 8 MB
  read_io_threads/write_io_threads: default from 1 to 4
  
  The log file sizes are untouched because of upgrade issues
  
  Reviewed by: Heikki
  
  ------------------------------------------------------------------------
  r5330 | marko | 2009-06-16 04:08:59 -0400 (Tue, 16 Jun 2009) | 2 lines
  
  branches/zip: buf_page_get_gen(): Reduce mutex holding time by adjusting
  buf_pool->n_pend_unzip while only holding buf_pool_mutex.
  ------------------------------------------------------------------------
  r5331 | marko | 2009-06-16 05:00:48 -0400 (Tue, 16 Jun 2009) | 2 lines
  
  branches/zip: buf_page_get_zip(): Eliminate a buf_page_get_mutex() call.
  The function must switch on the block state anyway.
  ------------------------------------------------------------------------
  r5332 | vasil | 2009-06-16 05:03:27 -0400 (Tue, 16 Jun 2009) | 4 lines
  
  branches/zip:
  
  Add ChangeLog entries for r5283 and r5320.
  
  ------------------------------------------------------------------------
  r5333 | marko | 2009-06-16 05:27:46 -0400 (Tue, 16 Jun 2009) | 1 line
  
  branches/zip: buf_page_io_query(): Remove unused function.
  ------------------------------------------------------------------------
  r5335 | marko | 2009-06-16 09:23:10 -0400 (Tue, 16 Jun 2009) | 2 lines
  
  branches/zip: innodb.test: Adjust the tolerance of
  innodb_buffer_pool_pages_total for r5320.
  ------------------------------------------------------------------------
  r5342 | marko | 2009-06-17 06:15:32 -0400 (Wed, 17 Jun 2009) | 60 lines
  
  branches/zip: Merge revisions 5233:5341 from branches/5.1:
  
    ------------------------------------------------------------------------
    r5233 | marko | 2009-06-03 15:12:44 +0300 (Wed, 03 Jun 2009) | 11 lines
  
    branches/5.1: Merge the test case from r5232 from branches/5.0:
      ------------------------------------------------------------------------
      r5232 | marko | 2009-06-03 14:31:04 +0300 (Wed, 03 Jun 2009) | 21 lines
  
      branches/5.0: Merge r3590 from branches/5.1 in order to fix Bug #40565
      (Update Query Results in "1 Row Affected" But Should Be "Zero Rows").
  
      Also, add a test case for Bug #40565.
  
      rb://128 approved by Heikki Tuuri
      ------------------------------------------------------------------------
    ------------------------------------------------------------------------
    r5243 | sunny | 2009-06-04 03:17:14 +0300 (Thu, 04 Jun 2009) | 14 lines
  
    branches/5.1: When the InnoDB and MySQL data dictionaries go out of sync, before
    the bug fix we would assert on missing autoinc columns. With this fix we allow
    MySQL to open the table but set the next autoinc value for the column to the
    MAX value. This effectively disables the next value generation. INSERTs will
    fail with a generic AUTOINC failure. However, the user should be able to
    read/dump the table, set the column values explicitly, use ALTER TABLE to
    set the next autoinc value and/or sync the two data dictionaries to resume
    normal operations.
  
    Fix Bug#44030 Error: (1500) Couldn't read the MAX(ID) autoinc value from the
    index (PRIMARY)
  
    rb://118
    ------------------------------------------------------------------------
    r5252 | sunny | 2009-06-04 10:16:24 +0300 (Thu, 04 Jun 2009) | 2 lines
  
    branches/5.1: The version of the result file checked in was broken in r5243.
    ------------------------------------------------------------------------
    r5259 | vasil | 2009-06-05 10:29:16 +0300 (Fri, 05 Jun 2009) | 7 lines
  
    branches/5.1:
  
    Remove the word "Error" from the printout because the mysqltest suite
    interprets it as an error and thus the innodb-autoinc test fails.
  
    Approved by:	Sunny (via IM)
    ------------------------------------------------------------------------
    r5339 | marko | 2009-06-17 11:01:37 +0300 (Wed, 17 Jun 2009) | 2 lines
  
    branches/5.1: Add missing #include "mtr0log.h" so that the code compiles
    with -DUNIV_MUST_NOT_INLINE.
  
    (null merge; this had already been committed in branches/zip)
    ------------------------------------------------------------------------
    r5340 | marko | 2009-06-17 12:11:49 +0300 (Wed, 17 Jun 2009) | 4 lines
  
    branches/5.1: row_unlock_for_mysql(): When the clustered index is unknown,
    refuse to unlock the record.
    (Bug #45357, caused by the fix of Bug #39320).
    rb://132 approved by Sunny Bains.
    ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r5343 | vasil | 2009-06-17 08:56:12 -0400 (Wed, 17 Jun 2009) | 4 lines
  
  branches/zip:
  
  Add ChangeLog entry for r5342.
  
  ------------------------------------------------------------------------
  r5344 | marko | 2009-06-17 09:03:45 -0400 (Wed, 17 Jun 2009) | 1 line
  
  branches/zip: row_merge_read_rec(): Fix a UNIV_DEBUG bug (Bug #45426)
  ------------------------------------------------------------------------
  r5391 | marko | 2009-06-22 05:31:35 -0400 (Mon, 22 Jun 2009) | 2 lines
  
  branches/zip: buf_page_get_zip(): Fix a bogus warning about
  block_mutex being possibly uninitialized.
  ------------------------------------------------------------------------
  r5392 | marko | 2009-06-22 07:58:20 -0400 (Mon, 22 Jun 2009) | 4 lines
  
  branches/zip: ha_innobase::check_if_incompatible_data(): When
  ROW_FORMAT=DEFAULT, do not compare to get_row_type().
  Without this change, fast index creation will be disabled
  in recent versions of MySQL 5.1.
  ------------------------------------------------------------------------
  r5393 | pekka | 2009-06-22 09:27:55 -0400 (Mon, 22 Jun 2009) | 4 lines
  
  branches/zip: Minor changes for Hot Backup to build correctly. (The
  code bracketed between #ifdef UNIV_HOTBACKUP and #endif /* UNIV_HOTBACKUP */).
  This change should not affect !UNIV_HOTBACKUP build.
  
  ------------------------------------------------------------------------
  r5394 | pekka | 2009-06-22 09:46:34 -0400 (Mon, 22 Jun 2009) | 4 lines
  
  branches/zip: Add functions for checking the format of tablespaces 
  for Hot Backup build (UNIV_HOTBACKUP defined).
  This change should not affect !UNIV_HOTBACKUP build.
  
  ------------------------------------------------------------------------
  r5397 | calvin | 2009-06-23 16:59:42 -0400 (Tue, 23 Jun 2009) | 7 lines
  
  branches/zip: change the header file path.
  
  Change the header file path from ../storage/innobase/include/
  to ../include/. In the planned 5.1 + plugin release, the source
  directory of the plugin will not be in storage/innobase.
  
  Approved by: Heikki (IM)
  ------------------------------------------------------------------------
  r5407 | calvin | 2009-06-24 09:51:08 -0400 (Wed, 24 Jun 2009) | 4 lines
  
  branches/zip: remove relative path of header files.
  
  Suggested by Marko.
  
  ------------------------------------------------------------------------
  r5412 | marko | 2009-06-25 06:27:08 -0400 (Thu, 25 Jun 2009) | 1 line
  
  branches/zip: Replace a DBUG_ASSERT with ut_a to track down Issue #290.
  ------------------------------------------------------------------------
  r5415 | marko | 2009-06-25 06:45:57 -0400 (Thu, 25 Jun 2009) | 3 lines
  
  branches/zip: dict_index_find_cols(): Print diagnostic on name mismatch.
  This addresses Bug #44571 but does not fix it.
  rb://135 approved by Sunny Bains.
  ------------------------------------------------------------------------
  r5417 | marko | 2009-06-25 08:20:56 -0400 (Thu, 25 Jun 2009) | 1 line
  
  branches/zip: ha_innodb.cc: Move the misplaced Doxygen @file comment.
  ------------------------------------------------------------------------
  r5418 | marko | 2009-06-25 08:55:52 -0400 (Thu, 25 Jun 2009) | 5 lines
  
  branches/zip: Fix a race condition caused by
  SET GLOBAL innodb_commit_concurrency=DEFAULT. (Bug #45749)
  When innodb_commit_concurrency is initially set nonzero,
  DEFAULT would change it back to 0, triggering Bug #42101.
  rb://139 approved by Heikki Tuuri.
  ------------------------------------------------------------------------
  r5423 | calvin | 2009-06-26 16:52:52 -0400 (Fri, 26 Jun 2009) | 2 lines
  
  branches/zip: Fix typos.
  
  ------------------------------------------------------------------------
  r5425 | marko | 2009-06-29 04:52:30 -0400 (Mon, 29 Jun 2009) | 4 lines
  
  branches/zip: ha_innobase::add_index(), ha_innobase::final_drop_index():
  Start prebuilt->trx before locking the table.  This should fix Issue #293
  and could fix Issue #229.
  Approved by Sunny (over IM).
  ------------------------------------------------------------------------
  r5426 | marko | 2009-06-29 05:24:27 -0400 (Mon, 29 Jun 2009) | 3 lines
  
  branches/zip: buf_page_get_gen(): Fix a race condition when reading
  buf_fix_count.  This could explain Issue #156.
  Tested by Michael.
  ------------------------------------------------------------------------
  r5427 | marko | 2009-06-29 05:54:53 -0400 (Mon, 29 Jun 2009) | 5 lines
  
  branches/zip: lock_print_info_all_transactions(), buf_read_recv_pages():
  Tolerate missing tablespaces (zip_size==ULINT_UNDEFINED).
  buf_page_get_gen(): Add ut_ad(ut_is_2pow(zip_size)).
  
  Issue #289, rb://136 approved by Sunny Bains
  ------------------------------------------------------------------------
  r5428 | marko | 2009-06-29 07:06:29 -0400 (Mon, 29 Jun 2009) | 2 lines
  
  branches/zip: row_sel_store_mysql_rec(): Add missing pointer cast.
  Do not do arithmetics on void pointers.
  ------------------------------------------------------------------------
  r5429 | marko | 2009-06-29 09:49:54 -0400 (Mon, 29 Jun 2009) | 13 lines
  
  branches/zip: Do not crash on SET GLOBAL innodb_file_format=DEFAULT
  or SET GLOBAL innodb_file_format_check=DEFAULT.
  
  innodb_file_format.test: New test for innodb_file_format and
  innodb_file_format_check.
  
  innodb_file_format_name_validate(): Store the string in *save.
  innodb_file_format_name_update(): Check the string again.
  
  innodb_file_format_check_validate(): Store the string in *save.
  innodb_file_format_check_update(): Check the string again.
  
  Issue #282, rb://140 approved by Heikki Tuuri
  ------------------------------------------------------------------------
  r5430 | marko | 2009-06-29 09:58:07 -0400 (Mon, 29 Jun 2009) | 2 lines
  
  branches/zip: lock_rec_validate_page(): Add another assertion
  to track down Issue #289.
  ------------------------------------------------------------------------
  r5431 | marko | 2009-06-29 09:58:40 -0400 (Mon, 29 Jun 2009) | 1 line
  
  branches/zip: Revert an accidentally made change in r5430 to univ.i.
  ------------------------------------------------------------------------
  r5437 | marko | 2009-06-30 05:10:01 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: ibuf_dummy_index_free(): Beautify the comment.
  ------------------------------------------------------------------------
  r5438 | marko | 2009-06-30 05:10:32 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: fseg_free(): Remove this unused function.
  ------------------------------------------------------------------------
  r5439 | marko | 2009-06-30 05:15:22 -0400 (Tue, 30 Jun 2009) | 2 lines
  
  branches/zip: fseg_validate(): Enclose in #ifdef UNIV_DEBUG.
  This function is unused, but it could turn out to be a useful debugging aid.
  ------------------------------------------------------------------------
  r5441 | marko | 2009-06-30 06:30:14 -0400 (Tue, 30 Jun 2009) | 2 lines
  
  branches/zip: ha_delete(): Remove this unused function that was
  very similar to ha_search_and_delete_if_found().
  ------------------------------------------------------------------------
  r5442 | marko | 2009-06-30 06:45:41 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: lock_is_on_table(), lock_table_unlock(): Unused, remove.
  ------------------------------------------------------------------------
  r5443 | marko | 2009-06-30 07:03:00 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: os_event_create_auto(): Unused, remove.
  ------------------------------------------------------------------------
  r5444 | marko | 2009-06-30 07:19:49 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: que_graph_try_free(): Unused, remove.
  ------------------------------------------------------------------------
  r5445 | marko | 2009-06-30 07:28:11 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: row_build_row_ref_from_row(): Unused, remove.
  ------------------------------------------------------------------------
  r5446 | marko | 2009-06-30 07:35:45 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: srv_que_round_robin(), srv_que_task_enqueue(): Unused, remove.
  ------------------------------------------------------------------------
  r5447 | marko | 2009-06-30 07:37:58 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: srv_que_task_queue_check(): Unused, remove.
  ------------------------------------------------------------------------
  r5448 | marko | 2009-06-30 07:56:36 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: mem_heap_cat(): Unused, remove.
  ------------------------------------------------------------------------
  r5449 | marko | 2009-06-30 08:00:50 -0400 (Tue, 30 Jun 2009) | 2 lines
  
  branches/zip: innobase_start_or_create_for_mysql():
  Invoke os_get_os_version() at most once.
  ------------------------------------------------------------------------
  r5450 | marko | 2009-06-30 08:02:20 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: os_file_close_no_error_handling(): Unused, remove.
  ------------------------------------------------------------------------
  r5451 | marko | 2009-06-30 08:09:49 -0400 (Tue, 30 Jun 2009) | 2 lines
  
  branches/zip: page_set_max_trx_id(): Make the code compile
  with UNIV_HOTBACKUP.
  ------------------------------------------------------------------------
  r5452 | marko | 2009-06-30 08:10:26 -0400 (Tue, 30 Jun 2009) | 2 lines
  
  branches/zip: os_file_close_no_error_handling(): Restore,
  as this function is used within InnoDB Hot Backup.
  ------------------------------------------------------------------------
  r5453 | marko | 2009-06-30 08:14:01 -0400 (Tue, 30 Jun 2009) | 1 line
  
  branches/zip: os_process_set_priority_boost(): Unused, remove.
  ------------------------------------------------------------------------
  r5454 | marko | 2009-06-30 08:42:52 -0400 (Tue, 30 Jun 2009) | 2 lines
  
  branches/zip: Replace a non-ASCII character
  (ISO 8859-1 encoded U+00AD SOFT HYPHEN) with a cheap ASCII substitute.
  ------------------------------------------------------------------------
  r5456 | inaam | 2009-06-30 14:21:09 -0400 (Tue, 30 Jun 2009) | 4 lines
  
  branches/zip
  
  Non functional change. s/Percona/Percona Inc./
  
  ------------------------------------------------------------------------
  r5470 | vasil | 2009-07-02 09:12:36 -0400 (Thu, 02 Jul 2009) | 16 lines
  
  branches/zip:
  
  Use PAUSE instruction inside spinloop if it is available.
  
  The patch was originally developed by Mikael Ronstrom <mikael@mysql.com>
  and can be found here:
  http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2768
  http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2771
  http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2772
  http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2774
  http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2777
  http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2799
  http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2800
  
  Approved by:	Heikki (rb://137)
  
  ------------------------------------------------------------------------
  r5481 | vasil | 2009-07-06 13:16:32 -0400 (Mon, 06 Jul 2009) | 4 lines
  
  branches/zip:
  
  Remove unnecessary quotes and simplify plug.in.
  
  ------------------------------------------------------------------------
  r5482 | calvin | 2009-07-06 18:36:35 -0400 (Mon, 06 Jul 2009) | 5 lines
  
  branches/zip: add COPYING files for Percona and Sun Micro.
  
  1.0.4 contains patches based on contributions from Percona
  and Sun Microsystems.
  
  ------------------------------------------------------------------------
  r5483 | calvin | 2009-07-07 05:36:43 -0400 (Tue, 07 Jul 2009) | 3 lines
  
  branches/zip: add IB_HAVE_PAUSE_INSTRUCTION to CMake.
  
  Windows will support PAUSE instruction by default.
  ------------------------------------------------------------------------
  r5484 | inaam | 2009-07-07 18:57:14 -0400 (Tue, 07 Jul 2009) | 13 lines
  
  branches/zip  rb://126
  
  Based on contribution from Google Inc.
  This patch introduces a new parameter innodb_io_capacity to control the
  rate at which master threads performs various tasks. The default value
  is 200 and higher values imply more aggressive flushing and ibuf merges
  from within the master thread.
  This patch also changes the ibuf merge from synchronous to asynchronous.
  Another minor change is not to force the master thread to wait for a
  log flush to complete every second.
  
  Approved by: Heikki
  
  ------------------------------------------------------------------------
  r5485 | inaam | 2009-07-07 19:00:49 -0400 (Tue, 07 Jul 2009) | 18 lines
  
  branches/zip  rb://138
  
  The current implementation is to try to flush the neighbors of every
  page that we flush. This patch makes the following distinction:
  
  1) If the flush is from flush_list AND
  2) If the flush is intended to move the oldest_modification LSN ahead
  (this happens when a user thread sees little space in the log file and
  attempts to flush pages from the buffer pool so that a checkpoint can
  be made)
  
  THEN
  
  Do not try to flush the neighbors. Just focus on flushing dirty pages at
  the end of flush_list
  
  Approved by: Heikki
  
  ------------------------------------------------------------------------
  r5486 | inaam | 2009-07-08 12:11:40 -0400 (Wed, 08 Jul 2009) | 29 lines
  
  branches/zip  rb://133
  
  This patch introduces heuristics based flushing rate of dirty pages to
  avoid IO bursts at checkpoint.
  
  1) log_capacity / log_generated per second gives us number of seconds
  in which ALL dirty pages need to be flushed. Based on this rough
  assumption we can say that
  n_dirty_pages / (log_capacity / log_generation_rate) = desired_flush_rate
  
  2) We use weighted averages (hard coded to 20 seconds) of
  log_generation_rate to avoid resonance.
  
  3) From the desired_flush_rate we subtract the number of pages that have
  been flushed due to LRU flushing. That gives us pages that we should
  flush as part of flush_list cleanup. And that is the number (capped by
  maximum io_capacity) that we try to flush from the master thread.
  
  Knobs:
  ======
  
  innodb_adaptive_flushing: boolean, global, dynamic, default TRUE.
  Since this heuristic is very experimental and has the potential to
  dramatically change the IO pattern I think it is a good idea to leave a
  knob to turn it off.
  
  Approved by: Heikki
  
  
  ------------------------------------------------------------------------
  r5487 | calvin | 2009-07-08 12:42:28 -0400 (Wed, 08 Jul 2009) | 7 lines
  
  branches/zip: fix PAUSE instruction patch on Windows
  
  The original PAUSE instruction patch (r5470) does not
  compile on Windows. Also, there is an elegant way of
  doing it on Windows - YieldProcessor().
  
  Approved by: Heikki (on IM)
  ------------------------------------------------------------------------
  r5489 | vasil | 2009-07-10 05:02:22 -0400 (Fri, 10 Jul 2009) | 9 lines
  
  branches/zip:
  
  Change the defaults for
  innodb_sync_spin_loops: 20 -> 30
  innodb_spin_wait_delay: 5 -> 6
  
  This change was proposed by Sun/MySQL based on their performance testing,
  see https://svn.innodb.com/innobase/Release_tasks_for_InnoDB_Plugin_V1.0.4
  
  ------------------------------------------------------------------------
  r5490 | vasil | 2009-07-10 05:04:20 -0400 (Fri, 10 Jul 2009) | 4 lines
  
  branches/zip:
  
  Add ChangeLog entry for 5489.
  
  ------------------------------------------------------------------------
  r5491 | calvin | 2009-07-10 12:19:17 -0400 (Fri, 10 Jul 2009) | 6 lines
  
  branches/zip: add copyright info to files related to PAUSE
  instruction patch, contributed by Sun Microsystems.
  
  
  
  
  ------------------------------------------------------------------------
  r5492 | calvin | 2009-07-10 17:47:34 -0400 (Fri, 10 Jul 2009) | 5 lines
  
  branches/zip: add ChangeLog entries for r5484-r5486.
  
  
  
  
  ------------------------------------------------------------------------
  r5494 | vasil | 2009-07-13 03:37:35 -0400 (Mon, 13 Jul 2009) | 6 lines
  
  branches/zip:
  
  Restore the original value of innodb_sync_spin_loops at the end, previously
  the test assumed that setting it to 20 will do this, but now the default is
  30 and MTR's internal check failed.
  
  ------------------------------------------------------------------------
  r5495 | inaam | 2009-07-13 11:48:45 -0400 (Mon, 13 Jul 2009) | 5 lines
  
  branches/zip rb://138 (REVERT)
  
  Revert the flush neighbors patch as it shows regression in
  the benchmarks run by Michael.
  
  ------------------------------------------------------------------------
  r5496 | inaam | 2009-07-13 14:04:57 -0400 (Mon, 13 Jul 2009) | 4 lines
  
  branches/zip
  
  Fixed warnings on windows where ulint != ib_uint64_t
  
  ------------------------------------------------------------------------
  r5497 | calvin | 2009-07-13 15:01:00 -0400 (Mon, 13 Jul 2009) | 9 lines
  
  branches/zip: fix run-time symbols clash on Solaris.
  
  This patch is from Sergey Vojtovich of Sun Microsystems,
  to fix run-time symbols clash on Solaris with older C++
  compiler:
  - when finding out a way to hide symbols, make decision basing
    on compiler, not operating system.
  - Sun Studio supports __hidden declaration specifier for this
    purpose.
  ------------------------------------------------------------------------
  r5498 | vasil | 2009-07-14 03:16:18 -0400 (Tue, 14 Jul 2009) | 92 lines
  
  branches/zip: Merge r5341:5497 from branches/5.1, skipping:
  c5419 because it is merge from branches/zip into branches/5.1
  c5466 because the source code has been adjusted to match the MySQL
    behavior and the innodb-autoinc test does not fail in branches/zip,
    if c5466 is merged, then innodb-autoinc starts failing, Sunny suggested
    not to merge c5466.
  and resolving conflicts in c5410, c5440, c5488:
  
    ------------------------------------------------------------------------
    r5410 | marko | 2009-06-24 22:26:34 +0300 (Wed, 24 Jun 2009) | 2 lines
    Changed paths:
       M /branches/5.1/include/trx0sys.ic
       M /branches/5.1/trx/trx0purge.c
       M /branches/5.1/trx/trx0sys.c
       M /branches/5.1/trx/trx0undo.c
    
    branches/5.1: Add missing #include "mtr0log.h" to avoid warnings
    when compiling with -DUNIV_MUST_NOT_INLINE.
    ------------------------------------------------------------------------
    r5419 | marko | 2009-06-25 16:11:57 +0300 (Thu, 25 Jun 2009) | 18 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc
       M /branches/5.1/mysql-test/innodb_bug42101-nonzero.result
       M /branches/5.1/mysql-test/innodb_bug42101-nonzero.test
       M /branches/5.1/mysql-test/innodb_bug42101.result
       M /branches/5.1/mysql-test/innodb_bug42101.test
    
    branches/5.1: Merge r5418 from branches/zip:
    
      ------------------------------------------------------------------------
      r5418 | marko | 2009-06-25 15:55:52 +0300 (Thu, 25 Jun 2009) | 5 lines
      Changed paths:
         M /branches/zip/ChangeLog
         M /branches/zip/handler/ha_innodb.cc
         M /branches/zip/mysql-test/innodb_bug42101-nonzero.result
         M /branches/zip/mysql-test/innodb_bug42101-nonzero.test
         M /branches/zip/mysql-test/innodb_bug42101.result
         M /branches/zip/mysql-test/innodb_bug42101.test
      
      branches/zip: Fix a race condition caused by
      SET GLOBAL innodb_commit_concurrency=DEFAULT. (Bug #45749)
      When innodb_commit_concurrency is initially set nonzero,
      DEFAULT would change it back to 0, triggering Bug #42101.
      rb://139 approved by Heikki Tuuri.
      ------------------------------------------------------------------------
    ------------------------------------------------------------------------
    r5440 | vasil | 2009-06-30 13:04:29 +0300 (Tue, 30 Jun 2009) | 8 lines
    Changed paths:
       M /branches/5.1/fil/fil0fil.c
    
    branches/5.1:
    
    Fix Bug#45814 URL reference in InnoDB server errors needs adjusting to match documentation
    
    by changing the URL from
    http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html to
    http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting-datadict.html
    
    ------------------------------------------------------------------------
    r5466 | vasil | 2009-07-02 10:46:45 +0300 (Thu, 02 Jul 2009) | 6 lines
    Changed paths:
       M /branches/5.1/mysql-test/innodb-autoinc.result
       M /branches/5.1/mysql-test/innodb-autoinc.test
    
    branches/5.1:
    
    Adjust the failing innodb-autoinc test to conform to the latest behavior
    of the MySQL code. The idea and the comment in innodb-autoinc.test come
    from Sunny.
    
    ------------------------------------------------------------------------
    r5488 | vasil | 2009-07-09 19:16:44 +0300 (Thu, 09 Jul 2009) | 13 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc
       A /branches/5.1/mysql-test/innodb_bug21704.result
       A /branches/5.1/mysql-test/innodb_bug21704.test
    
    branches/5.1:
    
    Fix Bug#21704 Renaming column does not update FK definition
    
    by checking whether a column that participates in a FK definition is being
    renamed and denying the ALTER in this case.
    
    The patch was originally developed by Davi Arnaut <Davi.Arnaut@Sun.COM>:
    http://lists.mysql.com/commits/77714
    and was later adjusted to conform to InnoDB coding style by me (Vasil),
    I also added some more comments and moved the bug specific mysql-test to
    a separate file to make it more manageable and flexible.
    
    ------------------------------------------------------------------------
  
  ------------------------------------------------------------------------
  r5499 | calvin | 2009-07-14 12:55:10 -0400 (Tue, 14 Jul 2009) | 3 lines
  
  branches/zip: add a missing file in Makefile.am
  
  This change was suggested by MySQL.
  ------------------------------------------------------------------------
  r5500 | calvin | 2009-07-14 13:03:26 -0400 (Tue, 14 Jul 2009) | 3 lines
  
  branches/zip: minor change
  
  Remove an extra "with".
  ------------------------------------------------------------------------
  r5501 | vasil | 2009-07-14 13:58:15 -0400 (Tue, 14 Jul 2009) | 5 lines
  
  branches/zip:
  
  Add @ZLIB_INCLUDES@ so that the InnoDB Plugin picks up the same zlib.h
  header file that is eventually used by mysqld.
  
  ------------------------------------------------------------------------
  r5502 | vasil | 2009-07-14 13:59:59 -0400 (Tue, 14 Jul 2009) | 4 lines
  
  branches/zip:
  
  Add include/ut0auxconf.h to noinst_HEADERS
  
  ------------------------------------------------------------------------
  r5503 | vasil | 2009-07-14 14:16:11 -0400 (Tue, 14 Jul 2009) | 8 lines
  
  branches/zip:
  
  Non-functional change:
  put files in noinst_HEADERS and libinnobase_a_SOURCES one per line and sort
  alphabetically, so it is easier to find if a file is there or not and
  also diffs show exactly the added or removed file instead of surrounding
  lines too.
  
  ------------------------------------------------------------------------
  r5504 | calvin | 2009-07-15 04:58:44 -0400 (Wed, 15 Jul 2009) | 6 lines
  
  branches/zip: fix compile errors on Win64
  
  Both srv_read_ahead_factor and srv_io_capacity should
  be defined as ulong.
  
  Approved by: Sunny
  ------------------------------------------------------------------------
  r5508 | calvin | 2009-07-16 09:40:47 -0400 (Thu, 16 Jul 2009) | 16 lines
  
  branches/zip: Support inlining of functions and prefetch with
  Sun Studio
  
  Those changes are contributed by Sun/MySQL. Two sets of changes
  in this patch when Sun Studio is used:
  - Explicit inlining of functions
  - Prefetch Support
  
  This patch has been tested by Sunny with the plugin statically
  built in. Since we've never built the plugin as a dynamically
  loaded module on Solaris, it is a separate task to change
  plug.in.
  
  rb://142
  Approved by: Heikki
  
  ------------------------------------------------------------------------
  r5509 | calvin | 2009-07-16 09:45:28 -0400 (Thu, 16 Jul 2009) | 2 lines
  
  branches/zip: add ChangeLog entry for r5508.
  
  ------------------------------------------------------------------------
  r5512 | sunny | 2009-07-19 19:52:48 -0400 (Sun, 19 Jul 2009) | 2 lines
  
  branches/zip: Remove unused extern ref to timed_mutexes.
  
  ------------------------------------------------------------------------
  r5513 | sunny | 2009-07-19 19:58:43 -0400 (Sun, 19 Jul 2009) | 2 lines
  
  branches/zip: Undo r5512
  
  ------------------------------------------------------------------------
  r5514 | sunny | 2009-07-19 20:08:49 -0400 (Sun, 19 Jul 2009) | 2 lines
  
  branches/zip: Only use my_bool when UNIV_HOTBACKUP is not defined.
  
  ------------------------------------------------------------------------
  r5515 | sunny | 2009-07-20 03:29:14 -0400 (Mon, 20 Jul 2009) | 2 lines
  
  branches/zip: The dict_table_t::autoinc_mutex field is not used in HotBackup.
  
  ------------------------------------------------------------------------
  r5516 | sunny | 2009-07-20 03:46:05 -0400 (Mon, 20 Jul 2009) | 4 lines
  
  branches/zip: Make this file usable from within HotBackup. A new file has
  been introduced called hb_univ.i. This file should have all the HotBackup
  specific configuration.
  
  ------------------------------------------------------------------------
  r5517 | sunny | 2009-07-20 03:55:11 -0400 (Mon, 20 Jul 2009) | 2 lines
  
  Add /* UNIV_HOTBACK */
  
  ------------------------------------------------------------------------
  r5519 | vasil | 2009-07-20 04:45:18 -0400 (Mon, 20 Jul 2009) | 31 lines
  
  branches/zip: Merge r5497:5518 from branches/5.1:
  
    ------------------------------------------------------------------------
    r5518 | vasil | 2009-07-20 11:29:47 +0300 (Mon, 20 Jul 2009) | 22 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc
    
    branches/5.1:
    
    Merge a change from MySQL:
    
      ------------------------------------------------------------
      revno: 2874.2.1
      committer: Anurag Shekhar <anurag.shekhar@sun.com>
      branch nick: mysql-5.1-bugteam-windows-warning
      timestamp: Wed 2009-05-13 15:41:24 +0530
      message:
        Bug #39802 On Windows, 32-bit time_t should be enforced
        
        This patch fixes compilation warning, "conversion from 'time_t' to 'ulong', 
        possible loss of data". 
        The fix is to typecast time_t to ulong before assigning it to ulong. 
        Backported this from 6.0-bugteam tree.
      modified:
        storage/archive/ha_archive.cc
        storage/federated/ha_federated.cc
        storage/innobase/handler/ha_innodb.cc
        storage/myisam/ha_myisam.cc
    
    ------------------------------------------------------------------------
  
  ------------------------------------------------------------------------
  r5520 | vasil | 2009-07-20 04:51:47 -0400 (Mon, 20 Jul 2009) | 4 lines
  
  branches/zip:
  
  Add ChangeLog entries for r5498 and r5519.
  
  ------------------------------------------------------------------------
  r5524 | inaam | 2009-07-20 12:23:15 -0400 (Mon, 20 Jul 2009) | 9 lines
  
  branches/zip
  
  Change the read ahead parameter name to innodb_read_ahead_threshold.
  Change the meaning of this parameter to signify the number of pages
  that must be sequentially accessed for InnoDB to trigger a readahead
  request.
  
  Suggested by: Ken
  
  ------------------------------------------------------------------------
2009-07-21 00:09:29 +00:00

578 lines
20 KiB
C

/*****************************************************************************
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
Copyright (c) 2008, Google Inc.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
briefly in the InnoDB documentation. The contributions by Google are
incorporated with their permission, and subject to the conditions contained in
the file COPYING.Google.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
*****************************************************************************/
/**************************************************//**
@file include/sync0sync.h
Mutex, the basic synchronization primitive
Created 9/5/1995 Heikki Tuuri
*******************************************************/
#ifndef sync0sync_h
#define sync0sync_h
#include "univ.i"
#include "sync0types.h"
#include "ut0lst.h"
#include "ut0mem.h"
#include "os0thread.h"
#include "os0sync.h"
#include "sync0arr.h"
#if defined(UNIV_DEBUG) && !defined(UNIV_HOTBACKUP)
extern my_bool timed_mutexes;
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
#ifdef HAVE_WINDOWS_ATOMICS
typedef LONG lock_word_t; /*!< On Windows, InterlockedExchange operates
on LONG variable */
#else
typedef byte lock_word_t;
#endif
/******************************************************************//**
Initializes the synchronization data structures. */
UNIV_INTERN
void
sync_init(void);
/*===========*/
/******************************************************************//**
Frees the resources in synchronization data structures. */
UNIV_INTERN
void
sync_close(void);
/*===========*/
/******************************************************************//**
Creates, or rather, initializes a mutex object to a specified memory
location (which must be appropriately aligned). The mutex is initialized
in the reset state. Explicit freeing of the mutex with mutex_free is
necessary only if the memory block containing it is freed. */
#ifdef UNIV_DEBUG
# ifdef UNIV_SYNC_DEBUG
# define mutex_create(M, level) \
mutex_create_func((M), #M, (level), __FILE__, __LINE__)
# else
# define mutex_create(M, level) \
mutex_create_func((M), #M, __FILE__, __LINE__)
# endif
#else
# define mutex_create(M, level) \
mutex_create_func((M), __FILE__, __LINE__)
#endif
/******************************************************************//**
Creates, or rather, initializes a mutex object in a specified memory
location (which must be appropriately aligned). The mutex is initialized
in the reset state. Explicit freeing of the mutex with mutex_free is
necessary only if the memory block containing it is freed. */
UNIV_INTERN
void
mutex_create_func(
/*==============*/
mutex_t* mutex, /*!< in: pointer to memory */
#ifdef UNIV_DEBUG
const char* cmutex_name, /*!< in: mutex name */
# ifdef UNIV_SYNC_DEBUG
ulint level, /*!< in: level */
# endif /* UNIV_SYNC_DEBUG */
#endif /* UNIV_DEBUG */
const char* cfile_name, /*!< in: file name where created */
ulint cline); /*!< in: file line where created */
#undef mutex_free /* Fix for MacOS X */
/******************************************************************//**
Calling this function is obligatory only if the memory buffer containing
the mutex is freed. Removes a mutex object from the mutex list. The mutex
is checked to be in the reset state. */
UNIV_INTERN
void
mutex_free(
/*=======*/
mutex_t* mutex); /*!< in: mutex */
/**************************************************************//**
NOTE! The following macro should be used in mutex locking, not the
corresponding function. */
#define mutex_enter(M) mutex_enter_func((M), __FILE__, __LINE__)
/**************************************************************//**
NOTE! The following macro should be used in mutex locking, not the
corresponding function. */
/* NOTE! currently same as mutex_enter! */
#define mutex_enter_fast(M) mutex_enter_func((M), __FILE__, __LINE__)
/******************************************************************//**
NOTE! Use the corresponding macro in the header file, not this function
directly. Locks a mutex for the current thread. If the mutex is reserved
the function spins a preset time (controlled by SYNC_SPIN_ROUNDS) waiting
for the mutex before suspending the thread. */
UNIV_INLINE
void
mutex_enter_func(
/*=============*/
mutex_t* mutex, /*!< in: pointer to mutex */
const char* file_name, /*!< in: file name where locked */
ulint line); /*!< in: line where locked */
/**************************************************************//**
NOTE! The following macro should be used in mutex locking, not the
corresponding function. */
#define mutex_enter_nowait(M) \
mutex_enter_nowait_func((M), __FILE__, __LINE__)
/********************************************************************//**
NOTE! Use the corresponding macro in the header file, not this function
directly. Tries to lock the mutex for the current thread. If the lock is not
acquired immediately, returns with return value 1.
@return 0 if succeed, 1 if not */
UNIV_INTERN
ulint
mutex_enter_nowait_func(
/*====================*/
mutex_t* mutex, /*!< in: pointer to mutex */
const char* file_name, /*!< in: file name where mutex
requested */
ulint line); /*!< in: line where requested */
/******************************************************************//**
Unlocks a mutex owned by the current thread. */
UNIV_INLINE
void
mutex_exit(
/*=======*/
mutex_t* mutex); /*!< in: pointer to mutex */
#ifdef UNIV_SYNC_DEBUG
/******************************************************************//**
Returns TRUE if no mutex or rw-lock is currently locked.
Works only in the debug version.
@return TRUE if no mutexes and rw-locks reserved */
UNIV_INTERN
ibool
sync_all_freed(void);
/*================*/
#endif /* UNIV_SYNC_DEBUG */
/*#####################################################################
FUNCTION PROTOTYPES FOR DEBUGGING */
/*******************************************************************//**
Prints wait info of the sync system. */
UNIV_INTERN
void
sync_print_wait_info(
/*=================*/
FILE* file); /*!< in: file where to print */
/*******************************************************************//**
Prints info of the sync system. */
UNIV_INTERN
void
sync_print(
/*=======*/
FILE* file); /*!< in: file where to print */
#ifdef UNIV_DEBUG
/******************************************************************//**
Checks that the mutex has been initialized.
@return TRUE */
UNIV_INTERN
ibool
mutex_validate(
/*===========*/
const mutex_t* mutex); /*!< in: mutex */
/******************************************************************//**
Checks that the current thread owns the mutex. Works only
in the debug version.
@return TRUE if owns */
UNIV_INTERN
ibool
mutex_own(
/*======*/
const mutex_t* mutex); /*!< in: mutex */
#endif /* UNIV_DEBUG */
#ifdef UNIV_SYNC_DEBUG
/******************************************************************//**
Adds a latch and its level in the thread level array. Allocates the memory
for the array if called first time for this OS thread. Makes the checks
against other latch levels stored in the array for this thread. */
UNIV_INTERN
void
sync_thread_add_level(
/*==================*/
void* latch, /*!< in: pointer to a mutex or an rw-lock */
ulint level); /*!< in: level in the latching order; if
SYNC_LEVEL_VARYING, nothing is done */
/******************************************************************//**
Removes a latch from the thread level array if it is found there.
@return TRUE if found in the array; it is no error if the latch is
not found, as we presently are not able to determine the level for
every latch reservation the program does */
UNIV_INTERN
ibool
sync_thread_reset_level(
/*====================*/
void* latch); /*!< in: pointer to a mutex or an rw-lock */
/******************************************************************//**
Checks that the level array for the current thread is empty.
@return TRUE if empty */
UNIV_INTERN
ibool
sync_thread_levels_empty(void);
/*==========================*/
/******************************************************************//**
Checks that the level array for the current thread is empty.
@return TRUE if empty except the exceptions specified below */
UNIV_INTERN
ibool
sync_thread_levels_empty_gen(
/*=========================*/
ibool dict_mutex_allowed); /*!< in: TRUE if dictionary mutex is
allowed to be owned by the thread,
also purge_is_running mutex is
allowed */
/******************************************************************//**
Gets the debug information for a reserved mutex. */
UNIV_INTERN
void
mutex_get_debug_info(
/*=================*/
mutex_t* mutex, /*!< in: mutex */
const char** file_name, /*!< out: file where requested */
ulint* line, /*!< out: line where requested */
os_thread_id_t* thread_id); /*!< out: id of the thread which owns
the mutex */
/******************************************************************//**
Counts currently reserved mutexes. Works only in the debug version.
@return number of reserved mutexes */
UNIV_INTERN
ulint
mutex_n_reserved(void);
/*==================*/
#endif /* UNIV_SYNC_DEBUG */
/******************************************************************//**
NOT to be used outside this module except in debugging! Gets the value
of the lock word. */
UNIV_INLINE
lock_word_t
mutex_get_lock_word(
/*================*/
const mutex_t* mutex); /*!< in: mutex */
#ifdef UNIV_SYNC_DEBUG
/******************************************************************//**
NOT to be used outside this module except in debugging! Gets the waiters
field in a mutex.
@return value to set */
UNIV_INLINE
ulint
mutex_get_waiters(
/*==============*/
const mutex_t* mutex); /*!< in: mutex */
#endif /* UNIV_SYNC_DEBUG */
/*
LATCHING ORDER WITHIN THE DATABASE
==================================
The mutex or latch in the central memory object, for instance, a rollback
segment object, must be acquired before acquiring the latch or latches to
the corresponding file data structure. In the latching order below, these
file page object latches are placed immediately below the corresponding
central memory object latch or mutex.
Synchronization object Notes
---------------------- -----
Dictionary mutex If we have a pointer to a dictionary
| object, e.g., a table, it can be
| accessed without reserving the
| dictionary mutex. We must have a
| reservation, a memoryfix, to the
| appropriate table object in this case,
| and the table must be explicitly
| released later.
V
Dictionary header
|
V
Secondary index tree latch The tree latch protects also all
| the B-tree non-leaf pages. These
V can be read with the page only
Secondary index non-leaf bufferfixed to save CPU time,
| no s-latch is needed on the page.
| Modification of a page requires an
| x-latch on the page, however. If a
| thread owns an x-latch to the tree,
| it is allowed to latch non-leaf pages
| even after it has acquired the fsp
| latch.
V
Secondary index leaf The latch on the secondary index leaf
| can be kept while accessing the
| clustered index, to save CPU time.
V
Clustered index tree latch To increase concurrency, the tree
| latch is usually released when the
| leaf page latch has been acquired.
V
Clustered index non-leaf
|
V
Clustered index leaf
|
V
Transaction system header
|
V
Transaction undo mutex The undo log entry must be written
| before any index page is modified.
| Transaction undo mutex is for the undo
| logs the analogue of the tree latch
| for a B-tree. If a thread has the
| trx undo mutex reserved, it is allowed
| to latch the undo log pages in any
| order, and also after it has acquired
| the fsp latch.
V
Rollback segment mutex The rollback segment mutex must be
| reserved, if, e.g., a new page must
| be added to an undo log. The rollback
| segment and the undo logs in its
| history list can be seen as an
| analogue of a B-tree, and the latches
| reserved similarly, using a version of
| lock-coupling. If an undo log must be
| extended by a page when inserting an
| undo log record, this corresponds to
| a pessimistic insert in a B-tree.
V
Rollback segment header
|
V
Purge system latch
|
V
Undo log pages If a thread owns the trx undo mutex,
| or for a log in the history list, the
| rseg mutex, it is allowed to latch
| undo log pages in any order, and even
| after it has acquired the fsp latch.
| If a thread does not have the
| appropriate mutex, it is allowed to
| latch only a single undo log page in
| a mini-transaction.
V
File space management latch If a mini-transaction must allocate
| several file pages, it can do that,
| because it keeps the x-latch to the
| file space management in its memo.
V
File system pages
|
V
Kernel mutex If a kernel operation needs a file
| page allocation, it must reserve the
| fsp x-latch before acquiring the kernel
| mutex.
V
Search system mutex
|
V
Buffer pool mutex
|
V
Log mutex
|
Any other latch
|
V
Memory pool mutex */
/* Latching order levels */
/* User transaction locks are higher than any of the latch levels below:
no latches are allowed when a thread goes to wait for a normal table
or row lock! */
#define SYNC_USER_TRX_LOCK 9999
#define SYNC_NO_ORDER_CHECK 3000 /* this can be used to suppress
latching order checking */
#define SYNC_LEVEL_VARYING 2000 /* Level is varying. Only used with
buffer pool page locks, which do not
have a fixed level, but instead have
their level set after the page is
locked; see e.g.
ibuf_bitmap_get_map_page(). */
#define SYNC_TRX_I_S_RWLOCK 1910 /* Used for
trx_i_s_cache_t::rw_lock */
#define SYNC_TRX_I_S_LAST_READ 1900 /* Used for
trx_i_s_cache_t::last_read_mutex */
#define SYNC_FILE_FORMAT_TAG 1200 /* Used to serialize access to the
file format tag */
#define SYNC_DICT_OPERATION 1001 /* table create, drop, etc. reserve
this in X-mode, implicit or backround
operations purge, rollback, foreign
key checks reserve this in S-mode */
#define SYNC_DICT 1000
#define SYNC_DICT_AUTOINC_MUTEX 999
#define SYNC_DICT_HEADER 995
#define SYNC_IBUF_HEADER 914
#define SYNC_IBUF_PESS_INSERT_MUTEX 912
#define SYNC_IBUF_MUTEX 910 /* ibuf mutex is really below
SYNC_FSP_PAGE: we assign a value this
high only to make the program to pass
the debug checks */
/*-------------------------------*/
#define SYNC_INDEX_TREE 900
#define SYNC_TREE_NODE_NEW 892
#define SYNC_TREE_NODE_FROM_HASH 891
#define SYNC_TREE_NODE 890
#define SYNC_PURGE_SYS 810
#define SYNC_PURGE_LATCH 800
#define SYNC_TRX_UNDO 700
#define SYNC_RSEG 600
#define SYNC_RSEG_HEADER_NEW 591
#define SYNC_RSEG_HEADER 590
#define SYNC_TRX_UNDO_PAGE 570
#define SYNC_EXTERN_STORAGE 500
#define SYNC_FSP 400
#define SYNC_FSP_PAGE 395
/*------------------------------------- Insert buffer headers */
/*------------------------------------- ibuf_mutex */
/*------------------------------------- Insert buffer tree */
#define SYNC_IBUF_BITMAP_MUTEX 351
#define SYNC_IBUF_BITMAP 350
/*------------------------------------- MySQL query cache mutex */
/*------------------------------------- MySQL binlog mutex */
/*-------------------------------*/
#define SYNC_KERNEL 300
#define SYNC_REC_LOCK 299
#define SYNC_TRX_LOCK_HEAP 298
#define SYNC_TRX_SYS_HEADER 290
#define SYNC_LOG 170
#define SYNC_RECV 168
#define SYNC_WORK_QUEUE 162
#define SYNC_SEARCH_SYS_CONF 161 /* for assigning btr_search_enabled */
#define SYNC_SEARCH_SYS 160 /* NOTE that if we have a memory
heap that can be extended to the
buffer pool, its logical level is
SYNC_SEARCH_SYS, as memory allocation
can call routines there! Otherwise
the level is SYNC_MEM_HASH. */
#define SYNC_BUF_POOL 150
#define SYNC_BUF_BLOCK 149
#define SYNC_DOUBLEWRITE 140
#define SYNC_ANY_LATCH 135
#define SYNC_THR_LOCAL 133
#define SYNC_MEM_HASH 131
#define SYNC_MEM_POOL 130
/* Codes used to designate lock operations */
#define RW_LOCK_NOT_LOCKED 350
#define RW_LOCK_EX 351
#define RW_LOCK_EXCLUSIVE 351
#define RW_LOCK_SHARED 352
#define RW_LOCK_WAIT_EX 353
#define SYNC_MUTEX 354
/* NOTE! The structure appears here only for the compiler to know its size.
Do not use its fields directly! The structure used in the spin lock
implementation of a mutual exclusion semaphore. */
/** InnoDB mutex */
struct mutex_struct {
os_event_t event; /*!< Used by sync0arr.c for the wait queue */
volatile lock_word_t lock_word; /*!< lock_word is the target
of the atomic test-and-set instruction when
atomic operations are enabled. */
#if !defined(HAVE_ATOMIC_BUILTINS)
os_fast_mutex_t
os_fast_mutex; /*!< We use this OS mutex in place of lock_word
when atomic operations are not enabled */
#endif
ulint waiters; /*!< This ulint is set to 1 if there are (or
may be) threads waiting in the global wait
array for this mutex to be released.
Otherwise, this is 0. */
UT_LIST_NODE_T(mutex_t) list; /*!< All allocated mutexes are put into
a list. Pointers to the next and prev. */
#ifdef UNIV_SYNC_DEBUG
const char* file_name; /*!< File where the mutex was locked */
ulint line; /*!< Line where the mutex was locked */
ulint level; /*!< Level in the global latching order */
#endif /* UNIV_SYNC_DEBUG */
const char* cfile_name;/*!< File name where mutex created */
ulint cline; /*!< Line where created */
#ifdef UNIV_DEBUG
os_thread_id_t thread_id; /*!< The thread id of the thread
which locked the mutex. */
ulint magic_n; /*!< MUTEX_MAGIC_N */
/** Value of mutex_struct::magic_n */
# define MUTEX_MAGIC_N (ulint)979585
#endif /* UNIV_DEBUG */
ulong count_os_wait; /*!< count of os_wait */
#ifdef UNIV_DEBUG
ulong count_using; /*!< count of times mutex used */
ulong count_spin_loop; /*!< count of spin loops */
ulong count_spin_rounds;/*!< count of spin rounds */
ulong count_os_yield; /*!< count of os_wait */
ulonglong lspent_time; /*!< mutex os_wait timer msec */
ulonglong lmax_spent_time;/*!< mutex os_wait timer msec */
const char* cmutex_name; /*!< mutex name */
ulint mutex_type; /*!< 0=usual mutex, 1=rw_lock mutex */
#endif /* UNIV_DEBUG */
};
/** The global array of wait cells for implementation of the databases own
mutexes and read-write locks. */
extern sync_array_t* sync_primary_wait_array;/* Appears here for
debugging purposes only! */
/** Constant determining how long spin wait is continued before suspending
the thread. A value 600 rounds on a 1995 100 MHz Pentium seems to correspond
to 20 microseconds. */
#define SYNC_SPIN_ROUNDS srv_n_spin_wait_rounds
/** The number of mutex_exit calls. Intended for performance monitoring. */
extern ib_int64_t mutex_exit_count;
#ifdef UNIV_SYNC_DEBUG
/** Latching order checks start when this is set TRUE */
extern ibool sync_order_checks_on;
#endif /* UNIV_SYNC_DEBUG */
/** This variable is set to TRUE when sync_init is called */
extern ibool sync_initialized;
/** Global list of database mutexes (not OS mutexes) created. */
typedef UT_LIST_BASE_NODE_T(mutex_t) ut_list_base_node_t;
/** Global list of database mutexes (not OS mutexes) created. */
extern ut_list_base_node_t mutex_list;
/** Mutex protecting the mutex_list variable */
extern mutex_t mutex_list_mutex;
#ifndef UNIV_NONINL
#include "sync0sync.ic"
#endif
#endif