diff options
author | unknown <monty@mashka.mysql.fi> | 2002-07-25 22:46:28 +0300 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2002-07-25 22:46:28 +0300 |
commit | 6ba1aefe909df2651fcace1fe184e3f093d07ab4 (patch) | |
tree | f38c137c73206e3d059517b2bcab6a4a43c957f9 /innobase/sync | |
parent | 29cec51551b7a6be66ebf2048f9045eeb0f59d94 (diff) | |
parent | 714e9c881e5af8bbb54c336d0327bae8e4559019 (diff) | |
download | mariadb-git-6ba1aefe909df2651fcace1fe184e3f093d07ab4.tar.gz |
Merge with 3.23.51
Fixed wrong usage of sprintf() in ha_innodb.cc
BitKeeper/etc/logging_ok:
auto-union
BitKeeper/deleted/.del-global.h~e80d28157acfdcb5:
Auto merged
Docs/manual.ja.texi:
Auto merged
include/config-os2.h:
Auto merged
innobase/btr/btr0btr.c:
Auto merged
innobase/btr/btr0cur.c:
Auto merged
innobase/btr/btr0sea.c:
Auto merged
innobase/buf/buf0buf.c:
Auto merged
innobase/data/data0data.c:
Auto merged
innobase/dict/dict0crea.c:
Auto merged
innobase/dict/dict0dict.c:
Auto merged
innobase/fil/fil0fil.c:
Auto merged
innobase/fsp/fsp0fsp.c:
Auto merged
innobase/ibuf/ibuf0ibuf.c:
Auto merged
innobase/include/buf0buf.ic:
Auto merged
innobase/include/srv0srv.h:
Auto merged
innobase/lock/lock0lock.c:
Auto merged
innobase/log/log0log.c:
Auto merged
innobase/mtr/mtr0mtr.c:
Auto merged
innobase/os/os0file.c:
Auto merged
innobase/page/page0cur.c:
Auto merged
innobase/page/page0page.c:
Auto merged
innobase/rem/rem0cmp.c:
Auto merged
innobase/row/row0ins.c:
Auto merged
innobase/row/row0purge.c:
Auto merged
innobase/row/row0umod.c:
Auto merged
innobase/row/row0upd.c:
Auto merged
innobase/sync/sync0arr.c:
Auto merged
innobase/sync/sync0sync.c:
Auto merged
innobase/trx/trx0roll.c:
Auto merged
innobase/trx/trx0trx.c:
Auto merged
innobase/trx/trx0undo.c:
Auto merged
innobase/ut/ut0ut.c:
Auto merged
isam/pack_isam.c:
Auto merged
mysys/Makefile.am:
Auto merged
sql/ha_innodb.h:
Auto merged
sql/key.cc:
Auto merged
sql/mini_client.cc:
Auto merged
sql/sql_delete.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_table.cc:
Auto merged
sql/sql_update.cc:
Auto merged
sql/table.cc:
Auto merged
support-files/my-huge.cnf.sh:
Auto merged
support-files/my-large.cnf.sh:
Auto merged
support-files/my-medium.cnf.sh:
Auto merged
support-files/my-small.cnf.sh:
Auto merged
Docs/manual.texi:
Merge with 3.23.51
configure.in:
Merge with 3.23.51
include/Makefile.am:
Merge with 3.23.51
innobase/dict/dict0load.c:
Merge with 3.23.51
innobase/include/univ.i:
Merge with 3.23.51
innobase/row/row0mysql.c:
Merge with 3.23.51
innobase/srv/srv0srv.c:
Merge with 3.23.51
innobase/srv/srv0start.c:
Merge with 3.23.51
myisam/mi_cache.c:
Merge with 3.23.51
myisammrg/myrg_rnext.c:
Merge with 3.23.51
myisammrg/myrg_rprev.c:
Merge with 3.23.51
sql/ha_innodb.cc:
Merge with 3.23.51
Changed used of sprintf() to make code portable.
sql/handler.cc:
Indentation change
sql/lex.h:
Comment cleanup
sql/log.cc:
Merge with 3.23.51
sql/log_event.h:
Merge with 3.23.51
sql/mysql_priv.h:
Merge with 3.23.51
sql/mysqld.cc:
Merge with 3.23.51
Cleaned up handling of innodb_flush_log_at_trx_commit
sql/share/portuguese/errmsg.txt:
Merge with 3.23.51
sql/slave.cc:
Not merged as this affects many files; Will be fixed in next changeset
sql/slave.h:
Merge with 3.23.51
sql/sql_acl.cc:
Merge with 3.23.51 (no changes)
sql/sql_db.cc:
Merge with 3.23.51
sql/sql_parse.cc:
Merge with 3.23.51
sql/sql_yacc.yy:
Merge with 3.23.51
(Renamed NO_FOREIGN_KEY_CHECKS and RELAXED_UNIQUE_CHECKS)
support-files/mysql.spec.sh:
Merge with 3.23.51
Diffstat (limited to 'innobase/sync')
-rw-r--r-- | innobase/sync/sync0arr.c | 78 | ||||
-rw-r--r-- | innobase/sync/sync0sync.c | 33 |
2 files changed, 76 insertions, 35 deletions
diff --git a/innobase/sync/sync0arr.c b/innobase/sync/sync0arr.c index 4487fa72995..36dd8a7d80c 100644 --- a/innobase/sync/sync0arr.c +++ b/innobase/sync/sync0arr.c @@ -441,7 +441,8 @@ static void sync_array_cell_print( /*==================*/ - FILE* file, /* in: file where to print */ + char* buf, /* in: buffer where to print, must be + at least 400 characters */ sync_cell_t* cell) /* in: sync cell */ { mutex_t* mutex; @@ -451,7 +452,7 @@ sync_array_cell_print( type = cell->request_type; - fprintf(file, + buf += sprintf(buf, "--Thread %lu has waited at %s line %lu for %.2f seconds the semaphore:\n", (ulint)cell->thread, cell->file, cell->line, difftime(time(NULL), cell->reservation_time)); @@ -461,54 +462,58 @@ sync_array_cell_print( been freed meanwhile */ mutex = cell->old_wait_mutex; - fprintf(file, + buf += sprintf(buf, "Mutex at %lx created file %s line %lu, lock var %lu\n", (ulint)mutex, mutex->cfile_name, mutex->cline, mutex->lock_word); - fprintf(file, + buf += sprintf(buf, "Last time reserved in file %s line %lu, waiters flag %lu\n", mutex->file_name, mutex->line, mutex->waiters); } else if (type == RW_LOCK_EX || type == RW_LOCK_SHARED) { if (type == RW_LOCK_EX) { - fprintf(file, "X-lock on"); + buf += sprintf(buf, "X-lock on"); } else { - fprintf(file, "S-lock on"); + buf += sprintf(buf, "S-lock on"); } rwlock = cell->old_wait_rw_lock; - fprintf(file, " RW-latch at %lx created in file %s line %lu\n", + buf += sprintf(buf, + " RW-latch at %lx created in file %s line %lu\n", (ulint)rwlock, rwlock->cfile_name, rwlock->cline); if (rwlock->writer != RW_LOCK_NOT_LOCKED) { - fprintf(file, + buf += sprintf(buf, "a writer (thread id %lu) has reserved it in mode", (ulint)rwlock->writer_thread); if (rwlock->writer == RW_LOCK_EX) { - fprintf(file, " exclusive\n"); + buf += sprintf(buf, " exclusive\n"); } else { - fprintf(file, " wait exclusive\n"); + buf += sprintf(buf, " wait exclusive\n"); } } - fprintf(file, "number of readers %lu, waiters flag %lu\n", + buf += sprintf(buf, + "number of readers %lu, waiters flag %lu\n", rwlock->reader_count, rwlock->waiters); - fprintf(file, "Last time read locked in file %s line %lu\n", + buf += sprintf(buf, + "Last time read locked in file %s line %lu\n", rwlock->last_s_file_name, rwlock->last_s_line); - fprintf(file, "Last time write locked in file %s line %lu\n", + buf += sprintf(buf, + "Last time write locked in file %s line %lu\n", rwlock->last_x_file_name, rwlock->last_x_line); } else { ut_error; } if (!cell->waiting) { - fprintf(file, "wait has ended\n"); + buf += sprintf(buf, "wait has ended\n"); } if (cell->event_set) { - fprintf(file, "wait is ending\n"); + buf += sprintf(buf, "wait is ending\n"); } } @@ -610,6 +615,7 @@ sync_array_detect_deadlock( os_thread_id_t thread; ibool ret; rw_lock_debug_t* debug; + char buf[500]; ut_a(arr && start && cell); ut_ad(cell->wait_object); @@ -642,11 +648,12 @@ sync_array_detect_deadlock( ret = sync_array_deadlock_step(arr, start, thread, 0, depth); if (ret) { + sync_array_cell_print(buf, cell); printf( - "Mutex %lx owned by thread %lu file %s line %lu\n", + "Mutex %lx owned by thread %lu file %s line %lu\n%s", (ulint)mutex, mutex->thread_id, - mutex->file_name, mutex->line); - sync_array_cell_print(stdout, cell); + mutex->file_name, mutex->line, + buf); return(TRUE); } } @@ -678,9 +685,9 @@ sync_array_detect_deadlock( debug->pass, depth); if (ret) { - printf("rw-lock %lx ", (ulint) lock); + sync_array_cell_print(buf, cell); + printf("rw-lock %lx %s ", (ulint) lock, buf); rw_lock_debug_print(debug); - sync_array_cell_print(stdout, cell); return(TRUE); } @@ -711,9 +718,9 @@ sync_array_detect_deadlock( debug->pass, depth); if (ret) { - printf("rw-lock %lx ", (ulint) lock); + sync_array_cell_print(buf, cell); + printf("rw-lock %lx %s ", (ulint) lock, buf); rw_lock_debug_print(debug); - sync_array_cell_print(stdout, cell); return(TRUE); } @@ -898,6 +905,7 @@ sync_array_print_long_waits(void) sync_cell_t* cell; ibool old_val; ibool noticed = FALSE; + char buf[500]; ulint i; for (i = 0; i < sync_primary_wait_array->n_cells; i++) { @@ -907,9 +915,10 @@ sync_array_print_long_waits(void) if (cell->wait_object != NULL && difftime(time(NULL), cell->reservation_time) > 240) { + sync_array_cell_print(buf, cell); + fprintf(stderr, - "InnoDB: Warning: a long semaphore wait:\n"); - sync_array_cell_print(stderr, cell); + "InnoDB: Warning: a long semaphore wait:\n%s", buf); noticed = TRUE; } @@ -948,6 +957,8 @@ static void sync_array_output_info( /*===================*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end,/* in: buffer end */ sync_array_t* arr) /* in: wait array; NOTE! caller must own the mutex */ { @@ -955,18 +966,29 @@ sync_array_output_info( ulint count; ulint i; - printf("OS WAIT ARRAY INFO: reservation count %ld, signal count %ld\n", + if (buf_end - buf < 500) { + return; + } + + buf += sprintf(buf, + "OS WAIT ARRAY INFO: reservation count %ld, signal count %ld\n", arr->res_count, arr->sg_count); i = 0; count = 0; while (count < arr->n_reserved) { + if (buf_end - buf < 500) { + return; + } + cell = sync_array_get_nth_cell(arr, i); if (cell->wait_object != NULL) { count++; - sync_array_cell_print(stdout, cell); + sync_array_cell_print(buf, cell); + + buf = buf + strlen(buf); } i++; @@ -979,11 +1001,13 @@ Prints info of the wait array. */ void sync_array_print_info( /*==================*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end,/* in: buffer end */ sync_array_t* arr) /* in: wait array */ { sync_array_enter(arr); - sync_array_output_info(arr); + sync_array_output_info(buf, buf_end, arr); sync_array_exit(arr); } diff --git a/innobase/sync/sync0sync.c b/innobase/sync/sync0sync.c index 144ed263db9..14a2a6f8cc1 100644 --- a/innobase/sync/sync0sync.c +++ b/innobase/sync/sync0sync.c @@ -874,6 +874,7 @@ sync_thread_levels_empty_gen( sync_level_t* slot; rw_lock_t* lock; mutex_t* mutex; + char* buf; ulint i; if (!sync_order_checks_on) { @@ -907,7 +908,9 @@ sync_thread_levels_empty_gen( mutex = slot->latch; mutex_exit(&sync_thread_mutex); - sync_print(); + buf = mem_alloc(20000); + + sync_print(buf, buf + 18000); ut_error; return(FALSE); @@ -1243,14 +1246,21 @@ sync_close(void) Prints wait info of the sync system. */ void -sync_print_wait_info(void) -/*======================*/ +sync_print_wait_info( +/*=================*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end) /* in: buffer end */ { #ifdef UNIV_SYNC_DEBUG printf("Mutex exits %lu, rws exits %lu, rwx exits %lu\n", mutex_exit_count, rw_s_exit_count, rw_x_exit_count); #endif - printf( + if (buf_end - buf < 500) { + + return; + } + + sprintf(buf, "Mutex spin waits %lu, rounds %lu, OS waits %lu\n" "RW-shared spins %lu, OS waits %lu; RW-excl spins %lu, OS waits %lu\n", mutex_spin_wait_count, mutex_spin_round_count, @@ -1263,11 +1273,18 @@ sync_print_wait_info(void) Prints info of the sync system. */ void -sync_print(void) -/*============*/ +sync_print( +/*=======*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end) /* in: buffer end */ { mutex_list_print_info(); + rw_lock_list_print_info(); - sync_array_print_info(sync_primary_wait_array); - sync_print_wait_info(); + + sync_array_print_info(buf, buf_end, sync_primary_wait_array); + + buf = buf + strlen(buf); + + sync_print_wait_info(buf, buf_end); } |