diff options
author | Vasil Dimov <vasil.dimov@oracle.com> | 2010-04-12 18:20:41 +0300 |
---|---|---|
committer | Vasil Dimov <vasil.dimov@oracle.com> | 2010-04-12 18:20:41 +0300 |
commit | c877ff39bceb4df96acf3e54f7c98a2bed12b8ee (patch) | |
tree | 04211a3e5734b73e9f94cff511a4a74ff87075f0 /storage/innobase/include/sync0rw.ic | |
parent | fe0828b3b8193e086abe740572c9b0cb2b7da671 (diff) | |
parent | 410e23a6af8b597cdda0890d6ed9008355edee7a (diff) | |
download | mariadb-git-c877ff39bceb4df96acf3e54f7c98a2bed12b8ee.tar.gz |
Import branches/innodb+ from SVN on top of storage/innobase.
Diffstat (limited to 'storage/innobase/include/sync0rw.ic')
-rw-r--r-- | storage/innobase/include/sync0rw.ic | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/storage/innobase/include/sync0rw.ic b/storage/innobase/include/sync0rw.ic index 7116f1b7c9b..73405759bce 100644 --- a/storage/innobase/include/sync0rw.ic +++ b/storage/innobase/include/sync0rw.ic @@ -622,3 +622,265 @@ rw_lock_x_unlock_direct( rw_x_exit_count++; #endif } + +#ifdef UNIV_PFS_RWLOCK + +/******************************************************************//** +Performance schema instrumented wrap function for rw_lock_create_func(). +NOTE! Please use the corresponding macro rw_lock_create(), not directly +this function! */ +UNIV_INLINE +void +pfs_rw_lock_create_func( +/*====================*/ + mysql_pfs_key_t key, /*!< in: key registered with + performance schema */ + rw_lock_t* lock, /*!< in: pointer to memory */ +# ifdef UNIV_DEBUG +# ifdef UNIV_SYNC_DEBUG + ulint level, /*!< in: level */ +# endif /* UNIV_SYNC_DEBUG */ + const char* cmutex_name, /*!< in: mutex name */ +# endif /* UNIV_DEBUG */ + const char* cfile_name, /*!< in: file name where created */ + ulint cline) /*!< in: file line where created */ +{ + /* Initialize the rwlock for performance schema */ + lock->pfs_psi = (PSI_server && PFS_IS_INSTRUMENTED(key)) + ? PSI_server->init_rwlock(key, lock) + : NULL; + + /* The actual function to initialize an rwlock */ + rw_lock_create_func(lock, +# ifdef UNIV_DEBUG +# ifdef UNIV_SYNC_DEBUG + level, +# endif /* UNIV_SYNC_DEBUG */ + cmutex_name, +# endif /* UNIV_DEBUG */ + cfile_name, + cline); +} +/******************************************************************//** +Performance schema instrumented wrap function for rw_lock_x_lock_func() +NOTE! Please use the corresponding macro rw_lock_x_lock(), not directly +this function! */ +UNIV_INLINE +void +pfs_rw_lock_x_lock_func( +/*====================*/ + rw_lock_t* lock, /*!< in: pointer to rw-lock */ + ulint pass, /*!< in: pass value; != 0, if the lock will + be passed to another thread to unlock */ + const char* file_name,/*!< in: file name where lock requested */ + ulint line) /*!< in: line where requested */ +{ + struct PSI_rwlock_locker* locker = NULL; + + /* Record the entry of rw x lock request in performance schema */ + if (UNIV_LIKELY(PSI_server && lock->pfs_psi)) { + locker = PSI_server->get_thread_rwlock_locker( + lock->pfs_psi, PSI_RWLOCK_WRITELOCK); + + if (locker) { + PSI_server->start_rwlock_wrwait(locker, + file_name, line); + } + } + + rw_lock_x_lock_func(lock, pass, file_name, line); + + if (locker) { + PSI_server->end_rwlock_wrwait(locker, 0); + } +} +/******************************************************************//** +Performance schema instrumented wrap function for +rw_lock_x_lock_func_nowait() +NOTE! Please use the corresponding macro rw_lock_x_lock_func(), +not directly this function! +@return TRUE if success */ +UNIV_INLINE +ibool +pfs_rw_lock_x_lock_func_nowait( +/*===========================*/ + rw_lock_t* lock, /*!< in: pointer to rw-lock */ + const char* file_name,/*!< in: file name where lock + requested */ + ulint line) /*!< in: line where requested */ +{ + struct PSI_rwlock_locker* locker = NULL; + ibool ret; + + /* Record the entry of rw x lock request in performance schema */ + if (UNIV_LIKELY(PSI_server && lock->pfs_psi)) { + locker = PSI_server->get_thread_rwlock_locker( + lock->pfs_psi, PSI_RWLOCK_WRITELOCK); + + if (locker) { + PSI_server->start_rwlock_wrwait(locker, + file_name, line); + } + } + + ret = rw_lock_x_lock_func_nowait(lock, file_name, line); + + if (locker) { + PSI_server->end_rwlock_wrwait(locker, 0); + } + + return(ret); +} +/******************************************************************//** +Performance schema instrumented wrap function for rw_lock_free_func() +NOTE! Please use the corresponding macro rw_lock_free(), not directly +this function! */ +UNIV_INLINE +void +pfs_rw_lock_free_func( +/*==================*/ + rw_lock_t* lock) /*!< in: pointer to rw-lock */ +{ + if (UNIV_LIKELY(PSI_server && lock->pfs_psi)) { + PSI_server->destroy_rwlock(lock->pfs_psi); + lock->pfs_psi = NULL; + } + + rw_lock_free_func(lock); +} +/******************************************************************//** +Performance schema instrumented wrap function for rw_lock_s_lock_func() +NOTE! Please use the corresponding macro rw_lock_s_lock(), not +directly this function! */ +UNIV_INLINE +void +pfs_rw_lock_s_lock_func( +/*====================*/ + rw_lock_t* lock, /*!< in: pointer to rw-lock */ + ulint pass, /*!< in: pass value; != 0, if the + lock will be passed to another + thread to unlock */ + const char* file_name,/*!< in: file name where lock + requested */ + ulint line) /*!< in: line where requested */ +{ + struct PSI_rwlock_locker* locker = NULL; + + /* Instrumented to inform we are aquiring a shared rwlock */ + if (UNIV_LIKELY(PSI_server && lock->pfs_psi)) { + locker = PSI_server->get_thread_rwlock_locker( + lock->pfs_psi, PSI_RWLOCK_READLOCK); + if (locker) { + PSI_server->start_rwlock_rdwait(locker, + file_name, line); + } + } + + rw_lock_s_lock_func(lock, pass, file_name, line); + + if (locker) { + PSI_server->end_rwlock_rdwait(locker, 0); + } +} +/******************************************************************//** +Performance schema instrumented wrap function for rw_lock_s_lock_func() +NOTE! Please use the corresponding macro rw_lock_s_lock(), not +directly this function! +@return TRUE if success */ +UNIV_INLINE +ibool +pfs_rw_lock_s_lock_low( +/*===================*/ + rw_lock_t* lock, /*!< in: pointer to rw-lock */ + ulint pass, /*!< in: pass value; != 0, if the + lock will be passed to another + thread to unlock */ + const char* file_name, /*!< in: file name where lock requested */ + ulint line) /*!< in: line where requested */ +{ + + struct PSI_rwlock_locker* locker = NULL; + ibool ret; + + /* Instrumented to inform we are aquiring a shared rwlock */ + if (UNIV_LIKELY(PSI_server && lock->pfs_psi)) { + locker = PSI_server->get_thread_rwlock_locker( + lock->pfs_psi, PSI_RWLOCK_READLOCK); + if (locker) { + PSI_server->start_rwlock_rdwait(locker, + file_name, line); + } + } + + ret = rw_lock_s_lock_low(lock, pass, file_name, line); + + if (locker) { + PSI_server->end_rwlock_rdwait(locker, 0); + } + + return(ret); +} + +/******************************************************************//** +Performance schema instrumented wrap function for rw_lock_x_unlock_func() +NOTE! Please use the corresponding macro rw_lock_x_unlock(), not directly +this function! */ +UNIV_INLINE +void +pfs_rw_lock_x_unlock_func( +/*======================*/ +#ifdef UNIV_SYNC_DEBUG + ulint pass, /*!< in: pass value; != 0, if the + lock may have been passed to another + thread to unlock */ +#endif + rw_lock_t* lock) /*!< in/out: rw-lock */ +{ + /* Inform performance schema we are unlocking the lock */ + if (UNIV_LIKELY(PSI_server && lock->pfs_psi)) { + struct PSI_thread* thread; + thread = PSI_server->get_thread(); + if (thread) { + PSI_server->unlock_rwlock(thread, lock->pfs_psi); + } + } + + rw_lock_x_unlock_func( +#ifdef UNIV_SYNC_DEBUG + pass, +#endif + lock); +} + +/******************************************************************//** +Performance schema instrumented wrap function for rw_lock_s_unlock_func() +NOTE! Please use the corresponding macro pfs_rw_lock_s_unlock(), not +directly this function! */ +UNIV_INLINE +void +pfs_rw_lock_s_unlock_func( +/*======================*/ +#ifdef UNIV_SYNC_DEBUG + ulint pass, /*!< in: pass value; != 0, if the + lock may have been passed to another + thread to unlock */ +#endif + rw_lock_t* lock) /*!< in/out: rw-lock */ +{ + /* Inform performance schema we are unlocking the lock */ + if (UNIV_LIKELY(PSI_server && lock->pfs_psi)) { + struct PSI_thread* thread; + thread = PSI_server->get_thread(); + if (thread) { + PSI_server->unlock_rwlock(thread, lock->pfs_psi); + } + } + + rw_lock_s_unlock_func( +#ifdef UNIV_SYNC_DEBUG + pass, +#endif + lock); + +} +#endif /* UNIV_PFS_RWLOCK */ |