mirror of
https://github.com/MariaDB/server.git
synced 2025-12-16 22:03:23 +03:00
innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Fixes: - Bug #21409: Incorrect result returned when in READ-COMMITTED with query_cache ON At low transaction isolation levels we let each consistent read set its own snapshot. - Bug #23666: strange Innodb_row_lock_time_% values in show status; also millisecs wrong On Windows ut_usectime returns secs and usecs relative to the UNIX epoch (which is Jan, 1 1970). - Bug #25494: LATEST DEADLOCK INFORMATION is not always cleared lock_deadlock_recursive(): When the search depth or length is exceeded, rewind lock_latest_err_file and display the two transactions at the point of aborting the search. - Bug #25927: Foreign key with ON DELETE SET NULL on NOT NULL can crash server Prevent ALTER TABLE ... MODIFY ... NOT NULL on columns for which there is a foreign key constraint ON ... SET NULL. - Bug #26835: Repeatable corruption of utf8-enabled tables inside InnoDB The bug could be reproduced as follows: Define a table so that the first column of the clustered index is a VARCHAR or a UTF-8 CHAR in a collation where sequences of bytes of differing length are considered equivalent. Insert and delete a record. Before the delete-marked record is purged, insert another record whose first column is of different length but equivalent to the first record. Under certain conditions, the insertion can be incorrectly performed as update-in-place. Likewise, an operation that could be done as update-in-place can unnecessarily be performed as delete and insert, but that would not cause corruption but merely degraded performance. mysql-test/r/innodb.result: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1284: Merge changes from MySQL AB: ChangeSet 2007/01/24 14:49:36+04:00 holyfoot@mysql.com bug 22682 Test fails --without-geometry geometry dependent parts moved to proper .test files mysql-test/r/innodb.result 2007/01/24 14:49:34+04:00 holyfoot@mysql.com +0 -2 result fixed mysql-test/r/innodb_gis.result 2007/01/24 14:49:34+04:00 holyfoot@mysql.com +2 -0 result fixed mysql-test/t/innodb.test 2007/01/24 14:49:34+04:00 holyfoot@mysql.com +0 -6 HAVE_GEOMETRY dependent part moved to innodb_gis.test mysql-test/t/innodb_gis.test 2007/01/24 14:49:35+04:00 holyfoot@mysql.com +6 -0 HAVE_GEOMETRY dependent part moved here from innodb.test Revision r1186: dict_load_foreign(): Use a local variable instead of the 10-bit field foreign->n_fields in order to preserve ON UPDATE CASCADE and ON DELETE CASCADE flags. For some reason, gcc does not warn about shifting a 10-bit field to right by 24 bits. (Bug 24741) This bug was introduced while reducing the memory footprint of the InnoDB data dictionary (Bug 20877). innodb.test, innodb.result: Add a test case. Revision r1318: Add a test case for r1316 (Bug #25927). Revision r1340: innodb.test, innodb.result: Add test case for Bug #26835. The bug could be reproduced as follows: Define a table so that the first column of the clustered index is a VARCHAR or a UTF-8 CHAR in a collation where sequences of bytes of differing length are considered equivalent. Insert and delete a record. Before the delete-marked record is purged, insert another record whose first column is of different length but equivalent to the first record. Under certain conditions, the insertion can be incorrectly performed as update-in-place. Likewise, an operation that could be done as update-in-place can unnecessarily be performed as delete and insert, but that would not cause corruption but merely degraded performance. mysql-test/t/innodb.test: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1284: Merge changes from MySQL AB: ChangeSet 2007/01/24 14:49:36+04:00 holyfoot@mysql.com bug 22682 Test fails --without-geometry geometry dependent parts moved to proper .test files mysql-test/r/innodb.result 2007/01/24 14:49:34+04:00 holyfoot@mysql.com +0 -2 result fixed mysql-test/r/innodb_gis.result 2007/01/24 14:49:34+04:00 holyfoot@mysql.com +2 -0 result fixed mysql-test/t/innodb.test 2007/01/24 14:49:34+04:00 holyfoot@mysql.com +0 -6 HAVE_GEOMETRY dependent part moved to innodb_gis.test mysql-test/t/innodb_gis.test 2007/01/24 14:49:35+04:00 holyfoot@mysql.com +6 -0 HAVE_GEOMETRY dependent part moved here from innodb.test Revision r1283: Merge changes from MySQL AB: ChangeSet 2007/01/22 18:42:52+02:00 monty@mysql.com Give warnings for unused objects Changed error message to be compatible with old error file Added new error message for new DUP_ENTRY syntax mysql-test/t/innodb.test 2007/01/22 18:42:49+02:00 monty@mysql.com +14 -14 Changed to use new error message Revision r1186: dict_load_foreign(): Use a local variable instead of the 10-bit field foreign->n_fields in order to preserve ON UPDATE CASCADE and ON DELETE CASCADE flags. For some reason, gcc does not warn about shifting a 10-bit field to right by 24 bits. (Bug 24741) This bug was introduced while reducing the memory footprint of the InnoDB data dictionary (Bug 20877). innodb.test, innodb.result: Add a test case. Revision r1318: Add a test case for r1316 (Bug #25927). Revision r1329: Merge changes from MySQL AB to mysql-test directives. The results are not affected. Revision r1340: innodb.test, innodb.result: Add test case for Bug #26835. The bug could be reproduced as follows: Define a table so that the first column of the clustered index is a VARCHAR or a UTF-8 CHAR in a collation where sequences of bytes of differing length are considered equivalent. Insert and delete a record. Before the delete-marked record is purged, insert another record whose first column is of different length but equivalent to the first record. Under certain conditions, the insertion can be incorrectly performed as update-in-place. Likewise, an operation that could be done as update-in-place can unnecessarily be performed as delete and insert, but that would not cause corruption but merely degraded performance. storage/innobase/buf/buf0buf.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/buf/buf0flu.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/buf/buf0lru.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/dict/dict0boot.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/dict/dict0crea.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1324: Merge changes from MySQL AB: ChangeSet@1.2452, 2007-02-23 13:13:55+02:00, monty@mysql.com +177 -0 Fixed compiler warnings ... Fixed compiler warnings detected on windows64 storage/innobase/dict/dict0dict.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1316: Prevent ALTER TABLE ... MODIFY ... NOT NULL on columns for which there is a foreign key constraint ON ... SET NULL. (Bug #25927) dict_foreign_find_index(): Add paramettter check_null. dict_foreign_add_to_cache(): Do not allow ON DELETE SET NULL or ON UPDATE SET NULL if any of the referencing columns are declared NOT NULL. Revision r1324: Merge changes from MySQL AB: ChangeSet@1.2452, 2007-02-23 13:13:55+02:00, monty@mysql.com +177 -0 Fixed compiler warnings ... Fixed compiler warnings detected on windows64 storage/innobase/dict/dict0load.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1186: dict_load_foreign(): Use a local variable instead of the 10-bit field foreign->n_fields in order to preserve ON UPDATE CASCADE and ON DELETE CASCADE flags. For some reason, gcc does not warn about shifting a 10-bit field to right by 24 bits. (Bug 24741) This bug was introduced while reducing the memory footprint of the InnoDB data dictionary (Bug 20877). innodb.test, innodb.result: Add a test case. Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1324: Merge changes from MySQL AB: ChangeSet@1.2452, 2007-02-23 13:13:55+02:00, monty@mysql.com +177 -0 Fixed compiler warnings ... Fixed compiler warnings detected on windows64 storage/innobase/fil/fil0fil.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/fsp/fsp0fsp.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/ha/ha0ha.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/handler/ha_innodb.cc: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1204: Change this in ha_innobase: void* innobase_prebuilt; to this: row_prebuilt_t* prebuilt; by introducing the typedef in ha_innodb.h, and remove all the now needless local variables and casts in ha_innodb.cc. Revision r1298: ha_innodb.cc: Remove all references to thd->ha_data[hton->slot]. thd_to_trx(thd, hton): Accessor for getting the InnoDB trx object of a MySQL thread object and an InnoDB handlerton. Revision r1292: Remove the declarations of some global functions in ha_innodb.h and declare them static in ha_innodb.cc. These functions are invoked via function pointers in handlerton. Revision r1300: ha_innodb.cc: Replace thd->tablespace_op with thd_tablespace_op(thd). Plugins must treat class THD as an opaque type. Revision r1198: Merge a change from MySQL AB: ChangeSet@1.2372, 2006-12-31 02:29:11+01:00, kent@mysql.com +79 -0 Many files: Removed "MySQL Finland AB & TCX DataKonsult AB" from copyright header Adjusted year(s) in copyright header Added GPL copyright text Revision r1271: Merge changes from MySQL AB: Rename some FIELD_TYPE_ constants to MYSQL_TYPE_. Change the scope of a type cast of two dividends. Revision r1299: ha_innodb.cc: Replace thd->in_lock_tables with thd_in_lock_tables(thd). Plugins must treat class THD as an opaque type. Revision r1201: Apply patch from MySQL: ChangeSet@1.2353, 2006-12-19 16:57:51-07:00, tsmith@siva.hindu.god +13 -0 Added innodb_rollback_on_timeout option to restore the 4.1 InnoDB timeout behavior (Bug 24200) Revision r1322: ha_innodb.cc: Remove the unused innobase_repl_ variables. Revision r1324: Merge changes from MySQL AB: ChangeSet@1.2452, 2007-02-23 13:13:55+02:00, monty@mysql.com +177 -0 Fixed compiler warnings ... Fixed compiler warnings detected on windows64 Revision r1334: Fix for Bug# 21409. At low transaction isolation levels we let each consistent read set its own snapshot storage/innobase/handler/ha_innodb.h: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1204: Change this in ha_innobase: void* innobase_prebuilt; to this: row_prebuilt_t* prebuilt; by introducing the typedef in ha_innodb.h, and remove all the now needless local variables and casts in ha_innodb.cc. Revision r1292: Remove the declarations of some global functions in ha_innodb.h and declare them static in ha_innodb.cc. These functions are invoked via function pointers in handlerton. Revision r1198: Merge a change from MySQL AB: ChangeSet@1.2372, 2006-12-31 02:29:11+01:00, kent@mysql.com +79 -0 Many files: Removed "MySQL Finland AB & TCX DataKonsult AB" from copyright header Adjusted year(s) in copyright header Added GPL copyright text Revision r1201: Apply patch from MySQL: ChangeSet@1.2353, 2006-12-19 16:57:51-07:00, tsmith@siva.hindu.god +13 -0 Added innodb_rollback_on_timeout option to restore the 4.1 InnoDB timeout behavior (Bug 24200) storage/innobase/ibuf/ibuf0ibuf.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/buf0buf.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/buf0flu.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/dict0dict.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/ha0ha.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/lock0lock.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/log0log.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/mem0mem.h: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1241: Remove the unused function mem_strdupq(). storage/innobase/include/mem0mem.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1241: Remove the unused function mem_strdupq(). storage/innobase/include/rem0rec.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1338: rec_offs_nth_size(): Treat n==0 as a special case. (Bug #26835) storage/innobase/include/sync0rw.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/sync0sync.h: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1247: Rename mutex_enter_nowait to mutex_enter_nowait_func and add macro mutex_enter_nowait that supplies the default __FILE__ and __LINE__ arguments. Adjust callers. storage/innobase/include/sync0sync.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1294: Fixed inline asm code, it didn't work with GCC > ver 3.x. Revision r1244: Add ut_ad() debug assertions. UT_LIST_ADD_FIRST(), UT_LIST_ADD_LAST(), UT_LIST_INSERT_AFTER(): Assert against some trivial cases of cyclic lists. mutex_enter_func(): Assert that the current thread is not holding the mutex. Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/trx0sys.ic: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/include/univ.i: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1285: Merge a change from MySQL AB: ChangeSet 2006/10/26 15:41:47-04:00 iggy@amd64. Post Merge Cleanup storage/innobase/include/univ.i 2006/10/26 15:38:50-04:00 iggy@amd64. +9 -0 Post Merge Cleanup storage/innobase/include/ut0lst.h: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1244: Add ut_ad() debug assertions. UT_LIST_ADD_FIRST(), UT_LIST_ADD_LAST(), UT_LIST_INSERT_AFTER(): Assert against some trivial cases of cyclic lists. mutex_enter_func(): Assert that the current thread is not holding the mutex. storage/innobase/lock/lock0lock.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1330: lock_deadlock_recursive(): When the search depth or length is exceeded, rewind lock_latest_err_file and display the two transactions at the point of aborting the search. (Bug #25494) Revision r1332: lock_deadlock_recursive(): When aborting the search, display a note regardless of start->undo_no. Otherwise, aborted searches may show up as genuine deadlocks. This mistake was made in r1330. storage/innobase/log/log0log.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1247: Rename mutex_enter_nowait to mutex_enter_nowait_func and add macro mutex_enter_nowait that supplies the default __FILE__ and __LINE__ arguments. Adjust callers. storage/innobase/log/log0recv.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/mem/mem0pool.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/pars/pars0pars.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/que/que0que.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/read/read0read.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/row/row0mysql.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1201: Apply patch from MySQL: ChangeSet@1.2353, 2006-12-19 16:57:51-07:00, tsmith@siva.hindu.god +13 -0 Added innodb_rollback_on_timeout option to restore the 4.1 InnoDB timeout behavior (Bug 24200) Revision r1324: Merge changes from MySQL AB: ChangeSet@1.2452, 2007-02-23 13:13:55+02:00, monty@mysql.com +177 -0 Fixed compiler warnings ... Fixed compiler warnings detected on windows64 storage/innobase/row/row0vers.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/srv/srv0que.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/srv/srv0srv.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1262: Fix for Bug# 23666. On Windows ut_usectime returns secs and usecs relative to the UNIX epoch (which is Jan, 1 1970). Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/sync/sync0rw.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1247: Rename mutex_enter_nowait to mutex_enter_nowait_func and add macro mutex_enter_nowait that supplies the default __FILE__ and __LINE__ arguments. Adjust callers. Revision r1324: Merge changes from MySQL AB: ChangeSet@1.2452, 2007-02-23 13:13:55+02:00, monty@mysql.com +177 -0 Fixed compiler warnings ... Fixed compiler warnings detected on windows64 storage/innobase/sync/sync0sync.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1247: Rename mutex_enter_nowait to mutex_enter_nowait_func and add macro mutex_enter_nowait that supplies the default __FILE__ and __LINE__ arguments. Adjust callers. storage/innobase/thr/thr0loc.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/trx/trx0purge.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/trx/trx0roll.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/trx/trx0rseg.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/trx/trx0sys.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/trx/trx0trx.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. Revision r1324: Merge changes from MySQL AB: ChangeSet@1.2452, 2007-02-23 13:13:55+02:00, monty@mysql.com +177 -0 Fixed compiler warnings ... Fixed compiler warnings detected on windows64 storage/innobase/trx/trx0undo.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/usr/usr0sess.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1242: Merge r1239 from branches/zip: Make mutex_own() work with UNIV_DEBUG, without UNIV_SYNC_DEBUG. storage/innobase/ut/ut0ut.c: Apply the following InnoDB snapshots: innodb-5.1-ss1318 innodb-5.1-ss1330 innodb-5.1-ss1332 innodb-5.1-ss1340 Revision r1262: Fix for Bug# 23666. On Windows ut_usectime returns secs and usecs relative to the UNIX epoch (which is Jan, 1 1970).
413 lines
15 KiB
C
413 lines
15 KiB
C
/******************************************************
|
|
The memory management
|
|
|
|
(c) 1994, 1995 Innobase Oy
|
|
|
|
Created 6/9/1994 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#ifndef mem0mem_h
|
|
#define mem0mem_h
|
|
|
|
#include "univ.i"
|
|
#include "ut0mem.h"
|
|
#include "ut0byte.h"
|
|
#include "ut0ut.h"
|
|
#include "ut0rnd.h"
|
|
#include "sync0sync.h"
|
|
#include "ut0lst.h"
|
|
#include "mach0data.h"
|
|
|
|
/* -------------------- MEMORY HEAPS ----------------------------- */
|
|
|
|
/* The info structure stored at the beginning of a heap block */
|
|
typedef struct mem_block_info_struct mem_block_info_t;
|
|
|
|
/* A block of a memory heap consists of the info structure
|
|
followed by an area of memory */
|
|
typedef mem_block_info_t mem_block_t;
|
|
|
|
/* A memory heap is a nonempty linear list of memory blocks */
|
|
typedef mem_block_t mem_heap_t;
|
|
|
|
/* Types of allocation for memory heaps: DYNAMIC means allocation from the
|
|
dynamic memory pool of the C compiler, BUFFER means allocation from the
|
|
buffer pool; the latter method is used for very big heaps */
|
|
|
|
#define MEM_HEAP_DYNAMIC 0 /* the most common type */
|
|
#define MEM_HEAP_BUFFER 1
|
|
#define MEM_HEAP_BTR_SEARCH 2 /* this flag can optionally be
|
|
ORed to MEM_HEAP_BUFFER, in which
|
|
case heap->free_block is used in
|
|
some cases for memory allocations,
|
|
and if it's NULL, the memory
|
|
allocation functions can return
|
|
NULL. */
|
|
|
|
/* The following start size is used for the first block in the memory heap if
|
|
the size is not specified, i.e., 0 is given as the parameter in the call of
|
|
create. The standard size is the maximum (payload) size of the blocks used for
|
|
allocations of small buffers. */
|
|
|
|
#define MEM_BLOCK_START_SIZE 64
|
|
#define MEM_BLOCK_STANDARD_SIZE 8000
|
|
|
|
/* If a memory heap is allowed to grow into the buffer pool, the following
|
|
is the maximum size for a single allocated buffer: */
|
|
#define MEM_MAX_ALLOC_IN_BUF (UNIV_PAGE_SIZE - 200)
|
|
|
|
/**********************************************************************
|
|
Initializes the memory system. */
|
|
|
|
void
|
|
mem_init(
|
|
/*=====*/
|
|
ulint size); /* in: common pool size in bytes */
|
|
/******************************************************************
|
|
Use this macro instead of the corresponding function! Macro for memory
|
|
heap creation. */
|
|
|
|
#define mem_heap_create(N) mem_heap_create_func(\
|
|
(N), NULL, MEM_HEAP_DYNAMIC, __FILE__, __LINE__)
|
|
/******************************************************************
|
|
Use this macro instead of the corresponding function! Macro for memory
|
|
heap creation. */
|
|
|
|
#define mem_heap_create_in_buffer(N) mem_heap_create_func(\
|
|
(N), NULL, MEM_HEAP_BUFFER, __FILE__, __LINE__)
|
|
/******************************************************************
|
|
Use this macro instead of the corresponding function! Macro for memory
|
|
heap creation. */
|
|
|
|
#define mem_heap_create_in_btr_search(N) mem_heap_create_func(\
|
|
(N), NULL, MEM_HEAP_BTR_SEARCH | MEM_HEAP_BUFFER,\
|
|
__FILE__, __LINE__)
|
|
/******************************************************************
|
|
Use this macro instead of the corresponding function! Macro for fast
|
|
memory heap creation. An initial block of memory B is given by the
|
|
caller, N is its size, and this memory block is not freed by
|
|
mem_heap_free. See the parameter comment in mem_heap_create_func below. */
|
|
|
|
#define mem_heap_fast_create(N, B) mem_heap_create_func(\
|
|
(N), (B), MEM_HEAP_DYNAMIC, __FILE__, __LINE__)
|
|
|
|
/******************************************************************
|
|
Use this macro instead of the corresponding function! Macro for memory
|
|
heap freeing. */
|
|
|
|
#define mem_heap_free(heap) mem_heap_free_func(\
|
|
(heap), __FILE__, __LINE__)
|
|
/*********************************************************************
|
|
NOTE: Use the corresponding macros instead of this function. Creates a
|
|
memory heap. For debugging purposes, takes also the file name and line as
|
|
arguments. */
|
|
UNIV_INLINE
|
|
mem_heap_t*
|
|
mem_heap_create_func(
|
|
/*=================*/
|
|
/* out, own: memory heap, NULL if
|
|
did not succeed (only possible for
|
|
MEM_HEAP_BTR_SEARCH type heaps)*/
|
|
ulint n, /* in: desired start block size,
|
|
this means that a single user buffer
|
|
of size n will fit in the block,
|
|
0 creates a default size block;
|
|
if init_block is not NULL, n tells
|
|
its size in bytes */
|
|
void* init_block, /* in: if very fast creation is
|
|
wanted, the caller can reserve some
|
|
memory from its stack, for example,
|
|
and pass it as the the initial block
|
|
to the heap: then no OS call of malloc
|
|
is needed at the creation. CAUTION:
|
|
the caller must make sure the initial
|
|
block is not unintentionally erased
|
|
(if allocated in the stack), before
|
|
the memory heap is explicitly freed. */
|
|
ulint type, /* in: heap type */
|
|
const char* file_name, /* in: file name where created */
|
|
ulint line); /* in: line where created */
|
|
/*********************************************************************
|
|
NOTE: Use the corresponding macro instead of this function. Frees the space
|
|
occupied by a memory heap. In the debug version erases the heap memory
|
|
blocks. */
|
|
UNIV_INLINE
|
|
void
|
|
mem_heap_free_func(
|
|
/*===============*/
|
|
mem_heap_t* heap, /* in, own: heap to be freed */
|
|
const char* file_name, /* in: file name where freed */
|
|
ulint line); /* in: line where freed */
|
|
/*******************************************************************
|
|
Allocates n bytes of memory from a memory heap. */
|
|
UNIV_INLINE
|
|
void*
|
|
mem_heap_alloc(
|
|
/*===========*/
|
|
/* out: allocated storage, NULL if did not
|
|
succeed (only possible for
|
|
MEM_HEAP_BTR_SEARCH type heaps) */
|
|
mem_heap_t* heap, /* in: memory heap */
|
|
ulint n); /* in: number of bytes; if the heap is allowed
|
|
to grow into the buffer pool, this must be
|
|
<= MEM_MAX_ALLOC_IN_BUF */
|
|
/*********************************************************************
|
|
Returns a pointer to the heap top. */
|
|
UNIV_INLINE
|
|
byte*
|
|
mem_heap_get_heap_top(
|
|
/*==================*/
|
|
/* out: pointer to the heap top */
|
|
mem_heap_t* heap); /* in: memory heap */
|
|
/*********************************************************************
|
|
Frees the space in a memory heap exceeding the pointer given. The
|
|
pointer must have been acquired from mem_heap_get_heap_top. The first
|
|
memory block of the heap is not freed. */
|
|
UNIV_INLINE
|
|
void
|
|
mem_heap_free_heap_top(
|
|
/*===================*/
|
|
mem_heap_t* heap, /* in: heap from which to free */
|
|
byte* old_top);/* in: pointer to old top of heap */
|
|
/*********************************************************************
|
|
Empties a memory heap. The first memory block of the heap is not freed. */
|
|
UNIV_INLINE
|
|
void
|
|
mem_heap_empty(
|
|
/*===========*/
|
|
mem_heap_t* heap); /* in: heap to empty */
|
|
/*********************************************************************
|
|
Returns a pointer to the topmost element in a memory heap.
|
|
The size of the element must be given. */
|
|
UNIV_INLINE
|
|
void*
|
|
mem_heap_get_top(
|
|
/*=============*/
|
|
/* out: pointer to the topmost element */
|
|
mem_heap_t* heap, /* in: memory heap */
|
|
ulint n); /* in: size of the topmost element */
|
|
/*********************************************************************
|
|
Frees the topmost element in a memory heap.
|
|
The size of the element must be given. */
|
|
UNIV_INLINE
|
|
void
|
|
mem_heap_free_top(
|
|
/*==============*/
|
|
mem_heap_t* heap, /* in: memory heap */
|
|
ulint n); /* in: size of the topmost element */
|
|
/*********************************************************************
|
|
Returns the space in bytes occupied by a memory heap. */
|
|
UNIV_INLINE
|
|
ulint
|
|
mem_heap_get_size(
|
|
/*==============*/
|
|
mem_heap_t* heap); /* in: heap */
|
|
/******************************************************************
|
|
Use this macro instead of the corresponding function!
|
|
Macro for memory buffer allocation */
|
|
|
|
#define mem_alloc(N) mem_alloc_func((N), __FILE__, __LINE__)
|
|
/******************************************************************
|
|
Use this macro instead of the corresponding function!
|
|
Macro for memory buffer allocation */
|
|
|
|
#define mem_alloc_noninline(N) mem_alloc_func_noninline(\
|
|
(N), __FILE__, __LINE__)
|
|
/*******************************************************************
|
|
NOTE: Use the corresponding macro instead of this function.
|
|
Allocates a single buffer of memory from the dynamic memory of
|
|
the C compiler. Is like malloc of C. The buffer must be freed
|
|
with mem_free. */
|
|
UNIV_INLINE
|
|
void*
|
|
mem_alloc_func(
|
|
/*===========*/
|
|
/* out, own: free storage */
|
|
ulint n, /* in: desired number of bytes */
|
|
const char* file_name, /* in: file name where created */
|
|
ulint line /* in: line where created */
|
|
);
|
|
/*******************************************************************
|
|
NOTE: Use the corresponding macro instead of this function.
|
|
Allocates a single buffer of memory from the dynamic memory of
|
|
the C compiler. Is like malloc of C. The buffer must be freed
|
|
with mem_free. */
|
|
|
|
void*
|
|
mem_alloc_func_noninline(
|
|
/*=====================*/
|
|
/* out, own: free storage */
|
|
ulint n, /* in: desired number of bytes */
|
|
const char* file_name, /* in: file name where created */
|
|
ulint line /* in: line where created */
|
|
);
|
|
/******************************************************************
|
|
Use this macro instead of the corresponding function!
|
|
Macro for memory buffer freeing */
|
|
|
|
#define mem_free(PTR) mem_free_func((PTR), __FILE__, __LINE__)
|
|
/*******************************************************************
|
|
NOTE: Use the corresponding macro instead of this function.
|
|
Frees a single buffer of storage from
|
|
the dynamic memory of C compiler. Similar to free of C. */
|
|
UNIV_INLINE
|
|
void
|
|
mem_free_func(
|
|
/*==========*/
|
|
void* ptr, /* in, own: buffer to be freed */
|
|
const char* file_name, /* in: file name where created */
|
|
ulint line /* in: line where created */
|
|
);
|
|
|
|
/**************************************************************************
|
|
Duplicates a NUL-terminated string. */
|
|
UNIV_INLINE
|
|
char*
|
|
mem_strdup(
|
|
/*=======*/
|
|
/* out, own: a copy of the string,
|
|
must be deallocated with mem_free */
|
|
const char* str); /* in: string to be copied */
|
|
/**************************************************************************
|
|
Makes a NUL-terminated copy of a nonterminated string. */
|
|
UNIV_INLINE
|
|
char*
|
|
mem_strdupl(
|
|
/*========*/
|
|
/* out, own: a copy of the string,
|
|
must be deallocated with mem_free */
|
|
const char* str, /* in: string to be copied */
|
|
ulint len); /* in: length of str, in bytes */
|
|
|
|
/**************************************************************************
|
|
Duplicates a NUL-terminated string, allocated from a memory heap. */
|
|
|
|
char*
|
|
mem_heap_strdup(
|
|
/*============*/
|
|
/* out, own: a copy of the string */
|
|
mem_heap_t* heap, /* in: memory heap where string is allocated */
|
|
const char* str); /* in: string to be copied */
|
|
/**************************************************************************
|
|
Makes a NUL-terminated copy of a nonterminated string,
|
|
allocated from a memory heap. */
|
|
UNIV_INLINE
|
|
char*
|
|
mem_heap_strdupl(
|
|
/*=============*/
|
|
/* out, own: a copy of the string */
|
|
mem_heap_t* heap, /* in: memory heap where string is allocated */
|
|
const char* str, /* in: string to be copied */
|
|
ulint len); /* in: length of str, in bytes */
|
|
|
|
/**************************************************************************
|
|
Concatenate two strings and return the result, using a memory heap. */
|
|
|
|
char*
|
|
mem_heap_strcat(
|
|
/*============*/
|
|
/* out, own: the result */
|
|
mem_heap_t* heap, /* in: memory heap where string is allocated */
|
|
const char* s1, /* in: string 1 */
|
|
const char* s2); /* in: string 2 */
|
|
|
|
/**************************************************************************
|
|
Duplicate a block of data, allocated from a memory heap. */
|
|
|
|
void*
|
|
mem_heap_dup(
|
|
/*=========*/
|
|
/* out, own: a copy of the data */
|
|
mem_heap_t* heap, /* in: memory heap where copy is allocated */
|
|
const void* data, /* in: data to be copied */
|
|
ulint len); /* in: length of data, in bytes */
|
|
|
|
/**************************************************************************
|
|
Concatenate two memory blocks and return the result, using a memory heap. */
|
|
|
|
void*
|
|
mem_heap_cat(
|
|
/*=========*/
|
|
/* out, own: the result */
|
|
mem_heap_t* heap, /* in: memory heap where result is allocated */
|
|
const void* b1, /* in: block 1 */
|
|
ulint len1, /* in: length of b1, in bytes */
|
|
const void* b2, /* in: block 2 */
|
|
ulint len2); /* in: length of b2, in bytes */
|
|
|
|
/********************************************************************
|
|
A simple (s)printf replacement that dynamically allocates the space for the
|
|
formatted string from the given heap. This supports a very limited set of
|
|
the printf syntax: types 's' and 'u' and length modifier 'l' (which is
|
|
required for the 'u' type). */
|
|
|
|
char*
|
|
mem_heap_printf(
|
|
/*============*/
|
|
/* out: heap-allocated formatted string */
|
|
mem_heap_t* heap, /* in: memory heap */
|
|
const char* format, /* in: format string */
|
|
...) __attribute__ ((format (printf, 2, 3)));
|
|
|
|
#ifdef MEM_PERIODIC_CHECK
|
|
/**********************************************************************
|
|
Goes through the list of all allocated mem blocks, checks their magic
|
|
numbers, and reports possible corruption. */
|
|
|
|
void
|
|
mem_validate_all_blocks(void);
|
|
/*=========================*/
|
|
#endif
|
|
|
|
/*#######################################################################*/
|
|
|
|
/* The info header of a block in a memory heap */
|
|
|
|
struct mem_block_info_struct {
|
|
ulint magic_n;/* magic number for debugging */
|
|
char file_name[8];/* file name where the mem heap was created */
|
|
ulint line; /* line number where the mem heap was created */
|
|
UT_LIST_BASE_NODE_T(mem_block_t) base; /* In the first block in the
|
|
the list this is the base node of the list of blocks;
|
|
in subsequent blocks this is undefined */
|
|
UT_LIST_NODE_T(mem_block_t) list; /* This contains pointers to next
|
|
and prev in the list. The first block allocated
|
|
to the heap is also the first block in this list,
|
|
though it also contains the base node of the list. */
|
|
ulint len; /* physical length of this block in bytes */
|
|
ulint type; /* type of heap: MEM_HEAP_DYNAMIC, or
|
|
MEM_HEAP_BUF possibly ORed to MEM_HEAP_BTR_SEARCH */
|
|
ibool init_block; /* TRUE if this is the first block used in fast
|
|
creation of a heap: the memory will be freed
|
|
by the creator, not by mem_heap_free */
|
|
ulint free; /* offset in bytes of the first free position for
|
|
user data in the block */
|
|
ulint start; /* the value of the struct field 'free' at the
|
|
creation of the block */
|
|
byte* free_block;
|
|
/* if the MEM_HEAP_BTR_SEARCH bit is set in type,
|
|
and this is the heap root, this can contain an
|
|
allocated buffer frame, which can be appended as a
|
|
free block to the heap, if we need more space;
|
|
otherwise, this is NULL */
|
|
#ifdef MEM_PERIODIC_CHECK
|
|
UT_LIST_NODE_T(mem_block_t) mem_block_list;
|
|
/* List of all mem blocks allocated; protected
|
|
by the mem_comm_pool mutex */
|
|
#endif
|
|
};
|
|
|
|
#define MEM_BLOCK_MAGIC_N 764741555
|
|
#define MEM_FREED_BLOCK_MAGIC_N 547711122
|
|
|
|
/* Header size for a memory heap block */
|
|
#define MEM_BLOCK_HEADER_SIZE ut_calc_align(sizeof(mem_block_info_t),\
|
|
UNIV_MEM_ALIGNMENT)
|
|
#include "mem0dbg.h"
|
|
|
|
#ifndef UNIV_NONINL
|
|
#include "mem0mem.ic"
|
|
#endif
|
|
|
|
#endif
|