mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 11:31:51 +01:00
8610f05afe
Check in code change for implementing Performace Schema in InnoDB. Objects in four different modules in InnoDB have been performance instrumented, these modules are: 1) mutexes 2) rwlocks 3) file I/O 4) threads We mostly preserved the existing APIs, but APIs would point to instrumented function wrappers if performance schema is defined. There are 4 different defines that controls the instrumentation of each module. The feature is off by default, and will be compiled in with special build option, and requre configure option to turn it on when server boots. For more detail design and functional information, please refer to performance schema wiki page. rb://270 approved by Marko Mäkelä
123 lines
3 KiB
C
123 lines
3 KiB
C
/*****************************************************************************
|
|
|
|
Copyright (c) 2006, 2009, Innobase Oy. All Rights Reserved.
|
|
|
|
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
|
|
Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*****************************************************************************/
|
|
|
|
#include "ut0wqueue.h"
|
|
|
|
/*******************************************************************//**
|
|
@file ut/ut0wqueue.c
|
|
A work queue
|
|
|
|
Created 4/26/2006 Osku Salerma
|
|
************************************************************************/
|
|
|
|
#ifdef UNIV_PFS_MUTEX
|
|
/* Key to register wq_mutex with performance schema */
|
|
UNIV_INTERN mysql_pfs_key_t wq_mutex_key;
|
|
#endif /* UNIV_PFS_MUTEX */
|
|
|
|
/****************************************************************//**
|
|
Create a new work queue.
|
|
@return work queue */
|
|
UNIV_INTERN
|
|
ib_wqueue_t*
|
|
ib_wqueue_create(void)
|
|
/*===================*/
|
|
{
|
|
ib_wqueue_t* wq = mem_alloc(sizeof(ib_wqueue_t));
|
|
|
|
mutex_create(wq_mutex_key, &wq->mutex, SYNC_WORK_QUEUE);
|
|
|
|
wq->items = ib_list_create();
|
|
wq->event = os_event_create(NULL);
|
|
|
|
return(wq);
|
|
}
|
|
|
|
/****************************************************************//**
|
|
Free a work queue. */
|
|
UNIV_INTERN
|
|
void
|
|
ib_wqueue_free(
|
|
/*===========*/
|
|
ib_wqueue_t* wq) /*!< in: work queue */
|
|
{
|
|
ut_a(!ib_list_get_first(wq->items));
|
|
|
|
mutex_free(&wq->mutex);
|
|
ib_list_free(wq->items);
|
|
os_event_free(wq->event);
|
|
|
|
mem_free(wq);
|
|
}
|
|
|
|
/****************************************************************//**
|
|
Add a work item to the queue. */
|
|
UNIV_INTERN
|
|
void
|
|
ib_wqueue_add(
|
|
/*==========*/
|
|
ib_wqueue_t* wq, /*!< in: work queue */
|
|
void* item, /*!< in: work item */
|
|
mem_heap_t* heap) /*!< in: memory heap to use for allocating the
|
|
list node */
|
|
{
|
|
mutex_enter(&wq->mutex);
|
|
|
|
ib_list_add_last(wq->items, item, heap);
|
|
os_event_set(wq->event);
|
|
|
|
mutex_exit(&wq->mutex);
|
|
}
|
|
|
|
/****************************************************************//**
|
|
Wait for a work item to appear in the queue.
|
|
@return work item */
|
|
UNIV_INTERN
|
|
void*
|
|
ib_wqueue_wait(
|
|
/*===========*/
|
|
ib_wqueue_t* wq) /*!< in: work queue */
|
|
{
|
|
ib_list_node_t* node;
|
|
|
|
for (;;) {
|
|
os_event_wait(wq->event);
|
|
|
|
mutex_enter(&wq->mutex);
|
|
|
|
node = ib_list_get_first(wq->items);
|
|
|
|
if (node) {
|
|
ib_list_remove(wq->items, node);
|
|
|
|
if (!ib_list_get_first(wq->items)) {
|
|
/* We must reset the event when the list
|
|
gets emptied. */
|
|
os_event_reset(wq->event);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
mutex_exit(&wq->mutex);
|
|
}
|
|
|
|
mutex_exit(&wq->mutex);
|
|
|
|
return(node->data);
|
|
}
|