MDEV-18662 ib_wqueue_t has a data race

ib_wqueue_is_empty(): protect ib_list_is_empty() call

Closes #1202
This commit is contained in:
Eugene Kosov 2019-02-20 14:56:02 +03:00 committed by Marko Mäkelä
parent b88a803459
commit 28cb041754
4 changed files with 28 additions and 40 deletions

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2006, 2009, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2006, 2009, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@ -67,15 +67,10 @@ ib_wqueue_add(
mem_heap_t* heap); /*!< in: memory heap to use for allocating the mem_heap_t* heap); /*!< in: memory heap to use for allocating the
list node */ list node */
/******************************************************************** /** Check if queue is empty.
Check if queue is empty. */ @param wq wait queue
@return whether the queue is empty */
ibool bool ib_wqueue_is_empty(ib_wqueue_t* wq);
ib_wqueue_is_empty(
/*===============*/
/* out: TRUE if queue empty
else FALSE */
const ib_wqueue_t* wq); /* in: work queue */
/****************************************************************//** /****************************************************************//**
Wait for a work item to appear in the queue. Wait for a work item to appear in the queue.

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2006, 2011, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2006, 2011, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@ -193,17 +194,15 @@ ib_wqueue_nowait(
return (node ? node->data : NULL); return (node ? node->data : NULL);
} }
/******************************************************************** /** Check if queue is empty.
Check if queue is empty. */ @param wq wait queue
@return whether the queue is empty */
ibool bool ib_wqueue_is_empty(ib_wqueue_t* wq)
ib_wqueue_is_empty(
/*===============*/
/* out: TRUE if queue empty
else FALSE */
const ib_wqueue_t* wq) /* in: work queue */
{ {
return(ib_list_is_empty(wq->items)); mutex_enter(&wq->mutex);
bool is_empty = ib_list_is_empty(wq->items);
mutex_exit(&wq->mutex);
return is_empty;
} }
/******************************************************************** /********************************************************************

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2006, 2009, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2006, 2009, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@ -67,15 +67,10 @@ ib_wqueue_add(
mem_heap_t* heap); /*!< in: memory heap to use for allocating the mem_heap_t* heap); /*!< in: memory heap to use for allocating the
list node */ list node */
/******************************************************************** /** Check if queue is empty.
Check if queue is empty. */ @param wq wait queue
@return whether the queue is empty */
ibool bool ib_wqueue_is_empty(ib_wqueue_t* wq);
ib_wqueue_is_empty(
/*===============*/
/* out: TRUE if queue empty
else FALSE */
const ib_wqueue_t* wq); /* in: work queue */
/****************************************************************//** /****************************************************************//**
Wait for a work item to appear in the queue. Wait for a work item to appear in the queue.

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2006, 2011, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2006, 2011, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@ -193,17 +194,15 @@ ib_wqueue_nowait(
return (node ? node->data : NULL); return (node ? node->data : NULL);
} }
/******************************************************************** /** Check if queue is empty.
Check if queue is empty. */ @param wq wait queue
@return whether the queue is empty */
ibool bool ib_wqueue_is_empty(ib_wqueue_t* wq)
ib_wqueue_is_empty(
/*===============*/
/* out: TRUE if queue empty
else FALSE */
const ib_wqueue_t* wq) /* in: work queue */
{ {
return(ib_list_is_empty(wq->items)); mutex_enter(&wq->mutex);
bool is_empty = ib_list_is_empty(wq->items);
mutex_exit(&wq->mutex);
return is_empty;
} }
/******************************************************************** /********************************************************************