Commit 28cb0417 authored by Eugene Kosov's avatar Eugene Kosov Committed by Marko Mäkelä

MDEV-18662 ib_wqueue_t has a data race

ib_wqueue_is_empty(): protect ib_list_is_empty() call

Closes #1202
parent b88a8034
/***************************************************************************** /*****************************************************************************
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( ...@@ -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.
......
/***************************************************************************** /*****************************************************************************
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( ...@@ -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;
} }
/******************************************************************** /********************************************************************
......
/***************************************************************************** /*****************************************************************************
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( ...@@ -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.
......
/***************************************************************************** /*****************************************************************************
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( ...@@ -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;
} }
/******************************************************************** /********************************************************************
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment