mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
840fe316d4
Partial commit of the greater MDEV-34348 scope. MDEV-34348: MariaDB is violating clang-16 -Wcast-function-type-strict Change the type of my_hash_get_key to: 1) Return const 2) Change the context parameter to be const void* Also fix casting in hash adjacent areas. Reviewed By: ============ Marko Mäkelä <marko.makela@mariadb.com>
174 lines
4.5 KiB
C
174 lines
4.5 KiB
C
/* Copyright (c) 2018, MariaDB Corporation Ab.
|
|
|
|
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
|
|
|
/*
|
|
Checks that my_likely/my_unlikely is correctly used
|
|
|
|
Note that we can't use mysql_mutex or my_malloc here as these
|
|
uses likely() macros and the likely_mutex would be used twice
|
|
*/
|
|
|
|
#include "mysys_priv.h"
|
|
#include <hash.h>
|
|
#include <m_ctype.h>
|
|
|
|
#ifndef CHECK_UNLIKEY
|
|
my_bool likely_inited= 0;
|
|
|
|
typedef struct st_likely_entry
|
|
{
|
|
const char *key;
|
|
size_t key_length;
|
|
uint line;
|
|
ulonglong ok,fail;
|
|
} LIKELY_ENTRY;
|
|
|
|
static const uchar *get_likely_key(const void *part_, size_t *length,
|
|
my_bool not_used __attribute__((unused)))
|
|
{
|
|
const LIKELY_ENTRY *part= (const LIKELY_ENTRY *) part_;
|
|
*length= part->key_length;
|
|
return (const uchar *) part->key;
|
|
}
|
|
|
|
pthread_mutex_t likely_mutex;
|
|
HASH likely_hash;
|
|
|
|
void init_my_likely()
|
|
{
|
|
/* Allocate big enough to avoid malloc calls */
|
|
my_hash_init2(PSI_NOT_INSTRUMENTED, &likely_hash, 10000, &my_charset_bin,
|
|
1024, 0, 0, get_likely_key, 0, free, HASH_UNIQUE);
|
|
likely_inited= 1;
|
|
pthread_mutex_init(&likely_mutex, MY_MUTEX_INIT_FAST);
|
|
}
|
|
|
|
static int likely_cmp(const void *a_, const void *b_)
|
|
{
|
|
const LIKELY_ENTRY *const *a= a_;
|
|
const LIKELY_ENTRY *const *b= b_;
|
|
int cmp;
|
|
if ((cmp= strcmp((*a)->key, (*b)->key)))
|
|
return cmp;
|
|
return (int) ((*a)->line - (*b)->line);
|
|
}
|
|
|
|
|
|
void end_my_likely(FILE *out)
|
|
{
|
|
uint i;
|
|
FILE *likely_file;
|
|
my_bool do_close= 0;
|
|
LIKELY_ENTRY **sort_ptr= 0;
|
|
|
|
likely_inited= 0;
|
|
|
|
if (!(likely_file= out))
|
|
{
|
|
char name[80];
|
|
snprintf(name, sizeof(name), "/tmp/unlikely-%lu.out", (ulong) getpid());
|
|
if ((likely_file= my_fopen(name, O_TRUNC | O_WRONLY, MYF(MY_WME))))
|
|
do_close= 1;
|
|
else
|
|
likely_file= stderr;
|
|
}
|
|
fflush(likely_file);
|
|
fputs("Wrong likely/unlikely usage:\n", likely_file);
|
|
if (!(sort_ptr= (LIKELY_ENTRY**)
|
|
malloc(sizeof(LIKELY_ENTRY*) *likely_hash.records)))
|
|
{
|
|
fprintf(stderr, "ERROR: Out of memory in end_my_likely\n");
|
|
goto err;
|
|
}
|
|
|
|
for (i=0 ; i < likely_hash.records ; i++)
|
|
sort_ptr[i]= (LIKELY_ENTRY *) my_hash_element(&likely_hash, i);
|
|
|
|
my_qsort(sort_ptr, likely_hash.records, sizeof(LIKELY_ENTRY*),
|
|
(qsort_cmp) likely_cmp);
|
|
|
|
for (i=0 ; i < likely_hash.records ; i++)
|
|
{
|
|
LIKELY_ENTRY *entry= sort_ptr[i];
|
|
if (entry->fail > entry->ok)
|
|
fprintf(likely_file,
|
|
"%50s line: %6u ok: %8lld fail: %8lld\n",
|
|
entry->key, entry->line, entry->ok, entry->fail);
|
|
}
|
|
fputs("\n", likely_file);
|
|
fflush(likely_file);
|
|
err:
|
|
free((void*) sort_ptr);
|
|
if (do_close)
|
|
my_fclose(likely_file, MYF(MY_WME));
|
|
pthread_mutex_destroy(&likely_mutex);
|
|
my_hash_free(&likely_hash);
|
|
}
|
|
|
|
|
|
static LIKELY_ENTRY *my_likely_find(const char *file_name, uint line)
|
|
{
|
|
char key[80], *pos;
|
|
LIKELY_ENTRY *entry;
|
|
size_t length;
|
|
|
|
if (!likely_inited)
|
|
return 0;
|
|
|
|
pos= strnmov(key, file_name, sizeof(key)-4);
|
|
int3store(pos+1, line);
|
|
length= (size_t) (pos-key)+4;
|
|
|
|
pthread_mutex_lock(&likely_mutex);
|
|
if (!(entry= (LIKELY_ENTRY*) my_hash_search(&likely_hash, (uchar*) key,
|
|
length)))
|
|
{
|
|
if (!(entry= (LIKELY_ENTRY *) malloc(sizeof(*entry) + length)))
|
|
return 0;
|
|
entry->key= (char*) (entry+1);
|
|
memcpy((void*) entry->key, key, length);
|
|
entry->key_length= length;
|
|
entry->line= line;
|
|
entry->ok= entry->fail= 0;
|
|
|
|
if (my_hash_insert(&likely_hash, (void*) entry))
|
|
{
|
|
pthread_mutex_unlock(&likely_mutex);
|
|
free(entry);
|
|
return 0;
|
|
}
|
|
}
|
|
pthread_mutex_unlock(&likely_mutex);
|
|
return entry;
|
|
}
|
|
|
|
|
|
int my_likely_ok(const char *file_name, uint line)
|
|
{
|
|
LIKELY_ENTRY *entry= my_likely_find(file_name, line);
|
|
if (entry)
|
|
entry->ok++;
|
|
return 0;
|
|
}
|
|
|
|
|
|
int my_likely_fail(const char *file_name, uint line)
|
|
{
|
|
LIKELY_ENTRY *entry= my_likely_find(file_name, line);
|
|
if (entry)
|
|
entry->fail++;
|
|
return 0;
|
|
}
|
|
#endif /* CHECK_UNLIKEY */
|