diff options
author | monty@narttu.mysql.fi <> | 2003-08-25 17:19:44 +0300 |
---|---|---|
committer | monty@narttu.mysql.fi <> | 2003-08-25 17:19:44 +0300 |
commit | 2c1f1206c3062a877e3fe00c4860bd48e55d4fca (patch) | |
tree | 28a19e92b8ac6f4ca2691bb1c3ae3056a65b006c /myisam/mi_locking.c | |
parent | f83e876065e4fe7c8214f418b9febe5be4d00cad (diff) | |
download | mariadb-git-2c1f1206c3062a877e3fe00c4860bd48e55d4fca.tar.gz |
Better fix for myisamchk --sort-index on windows
Fixed deadlock bug when doing resize of key buffer while key buffer was in active use
Diffstat (limited to 'myisam/mi_locking.c')
-rw-r--r-- | myisam/mi_locking.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/myisam/mi_locking.c b/myisam/mi_locking.c index 19fd99779ba..18daebffa85 100644 --- a/myisam/mi_locking.c +++ b/myisam/mi_locking.c @@ -57,10 +57,8 @@ int mi_lock_database(MI_INFO *info, int lock_type) DBUG_PRINT("info", ("old lock: %d", info->lock_type)); if (info->lock_type == F_RDLCK) count= --share->r_locks; - else if (info->lock_type == F_WRLCK) - count= --share->w_locks; else - count= 1; /* F_EXTRA_LCK */ + count= --share->w_locks; --share->tot_locks; if (info->lock_type == F_WRLCK && !share->w_locks && !share->delay_key_write && flush_key_blocks(share->kfile,FLUSH_KEEP)) @@ -110,19 +108,22 @@ int mi_lock_database(MI_INFO *info, int lock_type) if (error) mi_mark_crashed(info); } - if (share->r_locks) - { /* Only read locks left */ - flag=1; - if (my_lock(share->kfile,F_RDLCK,0L,F_TO_EOF, - MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error) - error=my_errno; - } - else if (!share->w_locks) - { /* No more locks */ - flag=1; - if (my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF, - MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error) - error=my_errno; + if (info->lock_type != F_EXTRA_LCK) + { + if (share->r_locks) + { /* Only read locks left */ + flag=1; + if (my_lock(share->kfile,F_RDLCK,0L,F_TO_EOF, + MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error) + error=my_errno; + } + else if (!share->w_locks) + { /* No more locks */ + flag=1; + if (my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF, + MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error) + error=my_errno; + } } } info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED); |