mirror of
https://github.com/MariaDB/server.git
synced 2025-05-27 01:57:48 +03:00
Essentially, the problem is that safemalloc is excruciatingly slow as it checks all allocated blocks for overrun at each memory management primitive, yielding a almost exponential slowdown for the memory management functions (malloc, realloc, free). The overrun check basically consists of verifying some bytes of a block for certain magic keys, which catches some simple forms of overrun. Another minor problem is violation of aliasing rules and that its own internal list of blocks is prone to corruption. Another issue with safemalloc is rather the maintenance cost as the tool has a significant impact on the server code. Given the magnitude of memory debuggers available nowadays, especially those that are provided with the platform malloc implementation, maintenance of a in-house and largely obsolete memory debugger becomes a burden that is not worth the effort due to its slowness and lack of support for detecting more common forms of heap corruption. Since there are third-party tools that can provide the same functionality at a lower or comparable performance cost, the solution is to simply remove safemalloc. Third-party tools can provide the same functionality at a lower or comparable performance cost. The removal of safemalloc also allows a simplification of the malloc wrappers, removing quite a bit of kludge: redefinition of my_malloc, my_free and the removal of the unused second argument of my_free. Since free() always check whether the supplied pointer is null, redudant checks are also removed. Also, this patch adds unit testing for my_malloc and moves my_realloc implementation into the same file as the other memory allocation primitives. client/mysqldump.c: Pass my_free directly as its signature is compatible with the callback type -- which wasn't the case for free_table_ent.
1401 lines
38 KiB
C
1401 lines
38 KiB
C
/* Copyright (c) 2008, 2010, Oracle and/or its affiliates. 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,
|
|
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
|
|
|
|
#ifndef MYSQL_FILE_H
|
|
#define MYSQL_FILE_H
|
|
|
|
/* For strlen() */
|
|
#include <string.h>
|
|
/* For MY_STAT */
|
|
#include <my_dir.h>
|
|
/* For my_chsize */
|
|
#include <my_sys.h>
|
|
|
|
/**
|
|
@file mysql/psi/mysql_file.h
|
|
Instrumentation helpers for mysys file io.
|
|
This header file provides the necessary declarations
|
|
to use the mysys file API with the performance schema instrumentation.
|
|
In some compilers (SunStudio), 'static inline' functions, when declared
|
|
but not used, are not optimized away (because they are unused) by default,
|
|
so that including a static inline function from a header file does
|
|
create unwanted dependencies, causing unresolved symbols at link time.
|
|
Other compilers, like gcc, optimize these dependencies by default.
|
|
|
|
Since the instrumented APIs declared here are wrapper on top
|
|
of mysys file io APIs, including mysql/psi/mysql_file.h assumes that
|
|
the dependency on my_sys already exists.
|
|
*/
|
|
|
|
#include "mysql/psi/psi.h"
|
|
|
|
/**
|
|
@defgroup File_instrumentation File Instrumentation
|
|
@ingroup Instrumentation_interface
|
|
@{
|
|
*/
|
|
|
|
/**
|
|
@def mysql_file_fgets(P1, P2, F)
|
|
Instrumented fgets.
|
|
@c mysql_file_fgets is a replacement for @c fgets.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fgets(P1, P2, F) \
|
|
inline_mysql_file_fgets(__FILE__, __LINE__, P1, P2, F)
|
|
#else
|
|
#define mysql_file_fgets(P1, P2, F) \
|
|
inline_mysql_file_fgets(P1, P2, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fgetc(F)
|
|
Instrumented fgetc.
|
|
@c mysql_file_fgetc is a replacement for @c fgetc.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fgetc(F) inline_mysql_file_fgetc(__FILE__, __LINE__, F)
|
|
#else
|
|
#define mysql_file_fgetc(F) inline_mysql_file_fgetc(F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fputs(P1, F)
|
|
Instrumented fputs.
|
|
@c mysql_file_fputs is a replacement for @c fputs.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fputs(P1, F) \
|
|
inline_mysql_file_fputs(__FILE__, __LINE__, P1, F)
|
|
#else
|
|
#define mysql_file_fputs(P1, F)\
|
|
inline_mysql_file_fputs(P1, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fputc(P1, F)
|
|
Instrumented fputc.
|
|
@c mysql_file_fputc is a replacement for @c fputc.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fputc(P1, F) \
|
|
inline_mysql_file_fputc(__FILE__, __LINE__, P1, F)
|
|
#else
|
|
#define mysql_file_fputc(P1, F) \
|
|
inline_mysql_file_fputc(P1, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fprintf
|
|
Instrumented fprintf.
|
|
@c mysql_file_fprintf is a replacement for @c fprintf.
|
|
*/
|
|
#define mysql_file_fprintf inline_mysql_file_fprintf
|
|
|
|
/**
|
|
@def mysql_file_vfprintf(F, P1, P2)
|
|
Instrumented vfprintf.
|
|
@c mysql_file_vfprintf is a replacement for @c vfprintf.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_vfprintf(F, P1, P2) \
|
|
inline_mysql_file_vfprintf(__FILE__, __LINE__, F, P1, P2)
|
|
#else
|
|
#define mysql_file_vfprintf(F, P1, P2) \
|
|
inline_mysql_file_vfprintf(F, P1, P2)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fflush(F, P1, P2)
|
|
Instrumented fflush.
|
|
@c mysql_file_fflush is a replacement for @c fflush.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fflush(F) \
|
|
inline_mysql_file_fflush(__FILE__, __LINE__, F)
|
|
#else
|
|
#define mysql_file_fflush(F) \
|
|
inline_mysql_file_fflush(F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_feof(F)
|
|
Instrumented feof.
|
|
@c mysql_file_feof is a replacement for @c feof.
|
|
*/
|
|
#define mysql_file_feof(F) inline_mysql_file_feof(F)
|
|
|
|
/**
|
|
@def mysql_file_fstat(FN, S, FL)
|
|
Instrumented fstat.
|
|
@c mysql_file_fstat is a replacement for @c my_fstat.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fstat(FN, S, FL) \
|
|
inline_mysql_file_fstat(__FILE__, __LINE__, FN, S, FL)
|
|
#else
|
|
#define mysql_file_fstat(FN, S, FL) \
|
|
inline_mysql_file_fstat(FN, S, FL)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_stat(K, FN, S, FL)
|
|
Instrumented stat.
|
|
@c mysql_file_stat is a replacement for @c my_stat.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_stat(K, FN, S, FL) \
|
|
inline_mysql_file_stat(K, __FILE__, __LINE__, FN, S, FL)
|
|
#else
|
|
#define mysql_file_stat(K, FN, S, FL) \
|
|
inline_mysql_file_stat(FN, S, FL)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_chsize(F, P1, P2, P3)
|
|
Instrumented chsize.
|
|
@c mysql_file_chsize is a replacement for @c my_chsize.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_chsize(F, P1, P2, P3) \
|
|
inline_mysql_file_chsize(__FILE__, __LINE__, F, P1, P2, P3)
|
|
#else
|
|
#define mysql_file_chsize(F, P1, P2, P3) \
|
|
inline_mysql_file_chsize(F, P1, P2, P3)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fopen(K, N, F1, F2)
|
|
Instrumented fopen.
|
|
@c mysql_file_fopen is a replacement for @c my_fopen.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fopen(K, N, F1, F2) \
|
|
inline_mysql_file_fopen(K, __FILE__, __LINE__, N, F1, F2)
|
|
#else
|
|
#define mysql_file_fopen(K, N, F1, F2) \
|
|
inline_mysql_file_fopen(N, F1, F2)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fclose(FD, FL)
|
|
Instrumented fclose.
|
|
@c mysql_file_fclose is a replacement for @c my_fclose.
|
|
Without the instrumentation, this call will have the same behavior as the
|
|
undocumented and possibly platform specific my_fclose(NULL, ...) behavior.
|
|
With the instrumentation, mysql_fclose(NULL, ...) will safely return 0,
|
|
which is an extension compared to my_fclose and is therefore compliant.
|
|
mysql_fclose is on purpose *not* implementing
|
|
@code DBUG_ASSERT(file != NULL) @endcode,
|
|
since doing so could introduce regressions.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fclose(FD, FL) \
|
|
inline_mysql_file_fclose(__FILE__, __LINE__, FD, FL)
|
|
#else
|
|
#define mysql_file_fclose(FD, FL) \
|
|
inline_mysql_file_fclose(FD, FL)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fread(FD, P1, P2, P3)
|
|
Instrumented fread.
|
|
@c mysql_file_fread is a replacement for @c my_fread.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fread(FD, P1, P2, P3) \
|
|
inline_mysql_file_fread(__FILE__, __LINE__, FD, P1, P2, P3)
|
|
#else
|
|
#define mysql_file_fread(FD, P1, P2, P3) \
|
|
inline_mysql_file_fread(FD, P1, P2, P3)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fwrite(FD, P1, P2, P3)
|
|
Instrumented fwrite.
|
|
@c mysql_file_fwrite is a replacement for @c my_fwrite.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fwrite(FD, P1, P2, P3) \
|
|
inline_mysql_file_fwrite(__FILE__, __LINE__, FD, P1, P2, P3)
|
|
#else
|
|
#define mysql_file_fwrite(FD, P1, P2, P3) \
|
|
inline_mysql_file_fwrite(FD, P1, P2, P3)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_fseek(FD, P, W, F)
|
|
Instrumented fseek.
|
|
@c mysql_file_fseek is a replacement for @c my_fseek.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_fseek(FD, P, W, F) \
|
|
inline_mysql_file_fseek(__FILE__, __LINE__, FD, P, W, F)
|
|
#else
|
|
#define mysql_file_fseek(FD, P, W, F) \
|
|
inline_mysql_file_fseek(FD, P, W, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_ftell(FD, F)
|
|
Instrumented ftell.
|
|
@c mysql_file_ftell is a replacement for @c my_ftell.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_ftell(FD, F) \
|
|
inline_mysql_file_ftell(__FILE__, __LINE__, FD, F)
|
|
#else
|
|
#define mysql_file_ftell(FD, F) \
|
|
inline_mysql_file_ftell(FD, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_create(K, N, F1, F2, F3)
|
|
Instrumented create.
|
|
@c mysql_file_create is a replacement for @c my_create.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_create(K, N, F1, F2, F3) \
|
|
inline_mysql_file_create(K, __FILE__, __LINE__, N, F1, F2, F3)
|
|
#else
|
|
#define mysql_file_create(K, N, F1, F2, F3) \
|
|
inline_mysql_file_create(N, F1, F2, F3)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_create_temp(K, T, D, P, M, F)
|
|
Instrumented create_temp_file.
|
|
@c mysql_file_create_temp is a replacement for @c create_temp_file.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_create_temp(K, T, D, P, M, F) \
|
|
inline_mysql_file_create_temp(K, T, D, P, M, F)
|
|
#else
|
|
#define mysql_file_create_temp(K, T, D, P, M, F) \
|
|
inline_mysql_file_create_temp(T, D, P, M, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_open(K, N, F1, F2)
|
|
Instrumented open.
|
|
@c mysql_file_open is a replacement for @c my_open.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_open(K, N, F1, F2) \
|
|
inline_mysql_file_open(K, __FILE__, __LINE__, N, F1, F2)
|
|
#else
|
|
#define mysql_file_open(K, N, F1, F2) \
|
|
inline_mysql_file_open(N, F1, F2)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_close(FD, F)
|
|
Instrumented close.
|
|
@c mysql_file_close is a replacement for @c my_close.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_close(FD, F) \
|
|
inline_mysql_file_close(__FILE__, __LINE__, FD, F)
|
|
#else
|
|
#define mysql_file_close(FD, F) \
|
|
inline_mysql_file_close(FD, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_read(FD, B, S, F)
|
|
Instrumented read.
|
|
@c mysql_read is a replacement for @c my_read.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_read(FD, B, S, F) \
|
|
inline_mysql_file_read(__FILE__, __LINE__, FD, B, S, F)
|
|
#else
|
|
#define mysql_file_read(FD, B, S, F) \
|
|
inline_mysql_file_read(FD, B, S, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_write(FD, B, S, F)
|
|
Instrumented write.
|
|
@c mysql_file_write is a replacement for @c my_write.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_write(FD, B, S, F) \
|
|
inline_mysql_file_write(__FILE__, __LINE__, FD, B, S, F)
|
|
#else
|
|
#define mysql_file_write(FD, B, S, F) \
|
|
inline_mysql_file_write(FD, B, S, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_pread(FD, B, S, O, F)
|
|
Instrumented pread.
|
|
@c mysql_pread is a replacement for @c my_pread.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_pread(FD, B, S, O, F) \
|
|
inline_mysql_file_pread(__FILE__, __LINE__, FD, B, S, O, F)
|
|
#else
|
|
#define mysql_file_pread(FD, B, S, O, F) \
|
|
inline_mysql_file_pread(FD, B, S, O, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_pwrite(FD, B, S, O, F)
|
|
Instrumented pwrite.
|
|
@c mysql_file_pwrite is a replacement for @c my_pwrite.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_pwrite(FD, B, S, O, F) \
|
|
inline_mysql_file_pwrite(__FILE__, __LINE__, FD, B, S, O, F)
|
|
#else
|
|
#define mysql_file_pwrite(FD, B, S, O, F) \
|
|
inline_mysql_file_pwrite(FD, B, S, O, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_seek(FD, P, W, F)
|
|
Instrumented seek.
|
|
@c mysql_file_seek is a replacement for @c my_seek.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_seek(FD, P, W, F) \
|
|
inline_mysql_file_seek(__FILE__, __LINE__, FD, P, W, F)
|
|
#else
|
|
#define mysql_file_seek(FD, P, W, F) \
|
|
inline_mysql_file_seek(FD, P, W, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_tell(FD, F)
|
|
Instrumented tell.
|
|
@c mysql_file_tell is a replacement for @c my_tell.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_tell(FD, F) \
|
|
inline_mysql_file_tell(__FILE__, __LINE__, FD, F)
|
|
#else
|
|
#define mysql_file_tell(FD, F) \
|
|
inline_mysql_file_tell(FD, F)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_delete(K, P1, P2)
|
|
Instrumented delete.
|
|
@c mysql_file_delete is a replacement for @c my_delete.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_delete(K, P1, P2) \
|
|
inline_mysql_file_delete(K, __FILE__, __LINE__, P1, P2)
|
|
#else
|
|
#define mysql_file_delete(K, P1, P2) \
|
|
inline_mysql_file_delete(P1, P2)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_rename(K, P1, P2, P3)
|
|
Instrumented rename.
|
|
@c mysql_file_rename is a replacement for @c my_rename.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_rename(K, P1, P2, P3) \
|
|
inline_mysql_file_rename(K, __FILE__, __LINE__, P1, P2, P3)
|
|
#else
|
|
#define mysql_file_rename(K, P1, P2, P3) \
|
|
inline_mysql_file_rename(P1, P2, P3)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5)
|
|
Instrumented create with symbolic link.
|
|
@c mysql_file_create_with_symlink is a replacement
|
|
for @c my_create_with_symlink.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5) \
|
|
inline_mysql_file_create_with_symlink(K, __FILE__, __LINE__, \
|
|
P1, P2, P3, P4, P5)
|
|
#else
|
|
#define mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5) \
|
|
inline_mysql_file_create_with_symlink(P1, P2, P3, P4, P5)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_delete_with_symlink(K, P1, P2)
|
|
Instrumented delete with symbolic link.
|
|
@c mysql_file_delete_with_symlink is a replacement
|
|
for @c my_delete_with_symlink.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_delete_with_symlink(K, P1, P2) \
|
|
inline_mysql_file_delete_with_symlink(K, __FILE__, __LINE__, P1, P2)
|
|
#else
|
|
#define mysql_file_delete_with_symlink(K, P1, P2) \
|
|
inline_mysql_file_delete_with_symlink(P1, P2)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_rename_with_symlink(K, P1, P2, P3)
|
|
Instrumented rename with symbolic link.
|
|
@c mysql_file_rename_with_symlink is a replacement
|
|
for @c my_rename_with_symlink.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_rename_with_symlink(K, P1, P2, P3) \
|
|
inline_mysql_file_rename_with_symlink(K, __FILE__, __LINE__, P1, P2, P3)
|
|
#else
|
|
#define mysql_file_rename_with_symlink(K, P1, P2, P3) \
|
|
inline_mysql_file_rename_with_symlink(P1, P2, P3)
|
|
#endif
|
|
|
|
/**
|
|
@def mysql_file_sync(P1, P2)
|
|
Instrumented file sync.
|
|
@c mysql_file_sync is a replacement for @c my_sync.
|
|
*/
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
#define mysql_file_sync(P1, P2) \
|
|
inline_mysql_file_sync(__FILE__, __LINE__, P1, P2)
|
|
#else
|
|
#define mysql_file_sync(P1, P2) \
|
|
inline_mysql_file_sync(P1, P2)
|
|
#endif
|
|
|
|
/**
|
|
An instrumented FILE structure.
|
|
@sa MYSQL_FILE
|
|
*/
|
|
struct st_mysql_file
|
|
{
|
|
/** The real file. */
|
|
FILE *m_file;
|
|
/**
|
|
The instrumentation hook.
|
|
Note that this hook is not conditionally defined,
|
|
for binary compatibility of the @c MYSQL_FILE interface.
|
|
*/
|
|
struct PSI_file *m_psi;
|
|
};
|
|
|
|
/**
|
|
Type of an instrumented file.
|
|
@c MYSQL_FILE is a drop-in replacement for @c FILE.
|
|
@sa mysql_file_open
|
|
*/
|
|
typedef struct st_mysql_file MYSQL_FILE;
|
|
|
|
static inline char *
|
|
inline_mysql_file_fgets(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
char *str, int size, MYSQL_FILE *file)
|
|
{
|
|
char *result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_READ);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) size, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= fgets(str, size, file->m_file);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, result ? strlen(result) : 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_fgetc(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
MYSQL_FILE *file)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_READ);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 1, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= fgetc(file->m_file);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 1);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_fputs(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
const char *str, MYSQL_FILE *file)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
size_t bytes= 0;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_WRITE);
|
|
if (likely(locker != NULL))
|
|
{
|
|
bytes= str ? strlen(str) : 0;
|
|
PSI_server->start_file_wait(locker, bytes, src_file, src_line);
|
|
}
|
|
}
|
|
#endif
|
|
result= fputs(str, file->m_file);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, bytes);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_fputc(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
char c, MYSQL_FILE *file)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_WRITE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 1, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= fputc(c, file->m_file);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 1);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_fprintf(MYSQL_FILE *file, const char *format, ...)
|
|
{
|
|
/*
|
|
TODO: figure out how to pass src_file and src_line from the caller.
|
|
*/
|
|
int result;
|
|
va_list args;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_WRITE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, __FILE__, __LINE__);
|
|
}
|
|
#endif
|
|
va_start(args, format);
|
|
result= vfprintf(file->m_file, format, args);
|
|
va_end(args);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) result);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_vfprintf(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
MYSQL_FILE *file, const char *format, va_list args)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_WRITE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= vfprintf(file->m_file, format, args);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) result);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_fflush(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
MYSQL_FILE *file)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_FLUSH);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= fflush(file->m_file);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int inline_mysql_file_feof(MYSQL_FILE *file)
|
|
{
|
|
/* Not instrumented, there is no wait involved */
|
|
return feof(file->m_file);
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_fstat(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
int filenr, MY_STAT *stat_area, myf flags)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(filenr,
|
|
PSI_FILE_FSTAT);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_fstat(filenr, stat_area, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline MY_STAT *
|
|
inline_mysql_file_stat(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *path, MY_STAT *stat_area, myf flags)
|
|
{
|
|
MY_STAT *result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker(key, PSI_FILE_STAT,
|
|
path, &locker);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_open_wait(locker, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_stat(path, stat_area, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_chsize(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File file, my_off_t newlength, int filler, myf flags)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(file,
|
|
PSI_FILE_CHSIZE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) newlength, src_file,
|
|
src_line);
|
|
}
|
|
#endif
|
|
result= my_chsize(file, newlength, filler, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) newlength);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline MYSQL_FILE*
|
|
inline_mysql_file_fopen(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *filename, int flags, myf myFlags)
|
|
{
|
|
MYSQL_FILE *that;
|
|
that= (MYSQL_FILE*) my_malloc(sizeof(MYSQL_FILE), MYF(MY_WME));
|
|
if (likely(that != NULL))
|
|
{
|
|
that->m_psi= NULL;
|
|
{
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker
|
|
(key, PSI_FILE_STREAM_OPEN, filename, that);
|
|
if (likely(locker != NULL))
|
|
that->m_psi= PSI_server->start_file_open_wait(locker, src_file,
|
|
src_line);
|
|
}
|
|
#endif
|
|
that->m_file= my_fopen(filename, flags, myFlags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_open_wait(locker);
|
|
#endif
|
|
if (unlikely(that->m_file == NULL))
|
|
{
|
|
my_free(that);
|
|
return NULL;
|
|
}
|
|
}
|
|
}
|
|
return that;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_fclose(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
MYSQL_FILE *file, myf flags)
|
|
{
|
|
int result= 0;
|
|
if (likely(file != NULL))
|
|
{
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
DBUG_ASSERT(file != NULL);
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_STREAM_CLOSE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_fclose(file->m_file, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
my_free(file);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static inline size_t
|
|
inline_mysql_file_fread(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
MYSQL_FILE *file, uchar *buffer, size_t count, myf flags)
|
|
{
|
|
size_t result= 0;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_READ);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, count, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_fread(file->m_file, buffer, count, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
{
|
|
size_t bytes_read;
|
|
if (flags & (MY_NABP | MY_FNABP))
|
|
bytes_read= (result == 0) ? count : 0;
|
|
else
|
|
bytes_read= (result != MY_FILE_ERROR) ? result : 0;
|
|
PSI_server->end_file_wait(locker, bytes_read);
|
|
}
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline size_t
|
|
inline_mysql_file_fwrite(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
MYSQL_FILE *file, const uchar *buffer, size_t count, myf flags)
|
|
{
|
|
size_t result= 0;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_WRITE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, count, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_fwrite(file->m_file, buffer, count, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
{
|
|
size_t bytes_written;
|
|
if (flags & (MY_NABP | MY_FNABP))
|
|
bytes_written= (result == 0) ? count : 0;
|
|
else
|
|
bytes_written= (result != MY_FILE_ERROR) ? result : 0;
|
|
PSI_server->end_file_wait(locker, bytes_written);
|
|
}
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline my_off_t
|
|
inline_mysql_file_fseek(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
MYSQL_FILE *file, my_off_t pos, int whence, myf flags)
|
|
{
|
|
my_off_t result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_SEEK);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_fseek(file->m_file, pos, whence, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline my_off_t
|
|
inline_mysql_file_ftell(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
MYSQL_FILE *file, myf flags)
|
|
{
|
|
my_off_t result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server && file->m_psi))
|
|
{
|
|
locker= PSI_server->get_thread_file_stream_locker(file->m_psi,
|
|
PSI_FILE_TELL);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_ftell(file->m_file, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline File
|
|
inline_mysql_file_create(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *filename, int create_flags, int access_flags, myf myFlags)
|
|
{
|
|
File file;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker(key, PSI_FILE_CREATE,
|
|
filename, &locker);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_open_wait(locker, src_file, src_line);
|
|
}
|
|
#endif
|
|
file= my_create(filename, create_flags, access_flags, myFlags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_open_wait_and_bind_to_descriptor(locker, file);
|
|
#endif
|
|
return file;
|
|
}
|
|
|
|
static inline File
|
|
inline_mysql_file_create_temp(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key,
|
|
#endif
|
|
char *to, const char *dir, const char *pfx, int mode, myf myFlags)
|
|
{
|
|
File file;
|
|
/*
|
|
TODO: This event is instrumented, but not timed.
|
|
The problem is that the file name is now known
|
|
before the create_temp_file call.
|
|
*/
|
|
file= create_temp_file(to, dir, pfx, mode, myFlags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(PSI_server != NULL))
|
|
PSI_server->create_file(key, to, file);
|
|
#endif
|
|
return file;
|
|
}
|
|
|
|
static inline File
|
|
inline_mysql_file_open(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *filename, int flags, myf myFlags)
|
|
{
|
|
File file;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker(key, PSI_FILE_OPEN,
|
|
filename, &locker);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_open_wait(locker, src_file, src_line);
|
|
}
|
|
#endif
|
|
file= my_open(filename, flags, myFlags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_open_wait_and_bind_to_descriptor(locker, file);
|
|
#endif
|
|
return file;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_close(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File file, myf flags)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(file,
|
|
PSI_FILE_CLOSE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_close(file, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline size_t
|
|
inline_mysql_file_read(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File file, uchar *buffer, size_t count, myf flags)
|
|
{
|
|
size_t result= 0;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(file,
|
|
PSI_FILE_READ);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, count, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_read(file, buffer, count, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
{
|
|
size_t bytes_read;
|
|
if (flags & (MY_NABP | MY_FNABP))
|
|
bytes_read= (result == 0) ? count : 0;
|
|
else
|
|
bytes_read= (result != MY_FILE_ERROR) ? result : 0;
|
|
PSI_server->end_file_wait(locker, bytes_read);
|
|
}
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline size_t
|
|
inline_mysql_file_write(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File file, const uchar *buffer, size_t count, myf flags)
|
|
{
|
|
size_t result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(file,
|
|
PSI_FILE_WRITE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, count, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_write(file, buffer, count, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
{
|
|
size_t bytes_written;
|
|
if (flags & (MY_NABP | MY_FNABP))
|
|
bytes_written= (result == 0) ? count : 0;
|
|
else
|
|
bytes_written= (result != MY_FILE_ERROR) ? result : 0;
|
|
PSI_server->end_file_wait(locker, bytes_written);
|
|
}
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline size_t
|
|
inline_mysql_file_pread(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File file, uchar *buffer, size_t count, my_off_t offset, myf flags)
|
|
{
|
|
size_t result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(file, PSI_FILE_READ);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, count, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_pread(file, buffer, count, offset, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
{
|
|
size_t bytes_read;
|
|
if (flags & (MY_NABP | MY_FNABP))
|
|
bytes_read= (result == 0) ? count : 0;
|
|
else
|
|
bytes_read= (result != MY_FILE_ERROR) ? result : 0;
|
|
PSI_server->end_file_wait(locker, bytes_read);
|
|
}
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline size_t
|
|
inline_mysql_file_pwrite(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File file, const uchar *buffer, size_t count, my_off_t offset, myf flags)
|
|
{
|
|
size_t result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(file,
|
|
PSI_FILE_WRITE);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, count, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_pwrite(file, buffer, count, offset, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
{
|
|
size_t bytes_written;
|
|
if (flags & (MY_NABP | MY_FNABP))
|
|
bytes_written= (result == 0) ? count : 0;
|
|
else
|
|
bytes_written= (result != MY_FILE_ERROR) ? result : 0;
|
|
PSI_server->end_file_wait(locker, bytes_written);
|
|
}
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline my_off_t
|
|
inline_mysql_file_seek(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File file, my_off_t pos, int whence, myf flags)
|
|
{
|
|
my_off_t result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(file, PSI_FILE_SEEK);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_seek(file, pos, whence, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline my_off_t
|
|
inline_mysql_file_tell(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File file, myf flags)
|
|
{
|
|
my_off_t result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(file, PSI_FILE_TELL);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_tell(file, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_delete(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *name, myf flags)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker(key, PSI_FILE_DELETE,
|
|
name, &locker);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_delete(name, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_rename(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *from, const char *to, myf flags)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker(key, PSI_FILE_RENAME,
|
|
to, &locker);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_rename(from, to, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline File
|
|
inline_mysql_file_create_with_symlink(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *linkname, const char *filename, int create_flags,
|
|
int access_flags, myf flags)
|
|
{
|
|
File file;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker(key, PSI_FILE_CREATE,
|
|
filename, &locker);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_open_wait(locker, src_file, src_line);
|
|
}
|
|
#endif
|
|
file= my_create_with_symlink(linkname, filename, create_flags, access_flags,
|
|
flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_open_wait_and_bind_to_descriptor(locker, file);
|
|
#endif
|
|
return file;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_delete_with_symlink(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *name, myf flags)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker(key, PSI_FILE_DELETE,
|
|
name, &locker);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_delete_with_symlink(name, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_rename_with_symlink(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
PSI_file_key key, const char *src_file, uint src_line,
|
|
#endif
|
|
const char *from, const char *to, myf flags)
|
|
{
|
|
int result;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_name_locker(key, PSI_FILE_RENAME,
|
|
to, &locker);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_rename_with_symlink(from, to, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static inline int
|
|
inline_mysql_file_sync(
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
const char *src_file, uint src_line,
|
|
#endif
|
|
File fd, myf flags)
|
|
{
|
|
int result= 0;
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
struct PSI_file_locker *locker= NULL;
|
|
if (likely(PSI_server != NULL))
|
|
{
|
|
locker= PSI_server->get_thread_file_descriptor_locker(fd, PSI_FILE_SYNC);
|
|
if (likely(locker != NULL))
|
|
PSI_server->start_file_wait(locker, (size_t) 0, src_file, src_line);
|
|
}
|
|
#endif
|
|
result= my_sync(fd, flags);
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
if (likely(locker != NULL))
|
|
PSI_server->end_file_wait(locker, (size_t) 0);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
/** @} (end of group File_instrumentation) */
|
|
|
|
#endif
|
|
|