diff options
author | heikki@hundin.mysql.fi <> | 2002-07-08 19:34:49 +0300 |
---|---|---|
committer | heikki@hundin.mysql.fi <> | 2002-07-08 19:34:49 +0300 |
commit | 7390d81f43c5c02004039a27bff27e558639aab0 (patch) | |
tree | b4e7fbd4d1817aa205132578bc6b11e6dd0fad86 /innobase/sync | |
parent | 3135924745a221a579f5a49aaee4b112a3a1bb4c (diff) | |
download | mariadb-git-7390d81f43c5c02004039a27bff27e558639aab0.tar.gz |
Many files:
Merge InnoDB-3.23.52b
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 7788b104120..81b5b7de195 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 f5b4e35e8d2..c070e97f692 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); } |