summaryrefslogtreecommitdiff
path: root/myisam/mi_locking.c
diff options
context:
space:
mode:
authormonty@narttu.mysql.fi <>2003-08-25 17:19:44 +0300
committermonty@narttu.mysql.fi <>2003-08-25 17:19:44 +0300
commit2c1f1206c3062a877e3fe00c4860bd48e55d4fca (patch)
tree28a19e92b8ac6f4ca2691bb1c3ae3056a65b006c /myisam/mi_locking.c
parentf83e876065e4fe7c8214f418b9febe5be4d00cad (diff)
downloadmariadb-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.c33
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);