mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
locking issues,
test for LONGLONG_MIN in decimal.c
This commit is contained in:
@ -72,7 +72,6 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||||||
}
|
}
|
||||||
LINT_INIT(dfile);
|
LINT_INIT(dfile);
|
||||||
LINT_INIT(file);
|
LINT_INIT(file);
|
||||||
pthread_mutex_lock(&THR_LOCK_myisam);
|
|
||||||
errpos=0;
|
errpos=0;
|
||||||
options=0;
|
options=0;
|
||||||
bzero((byte*) &share,sizeof(share));
|
bzero((byte*) &share,sizeof(share));
|
||||||
@ -135,7 +134,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||||||
pack_reclength++;
|
pack_reclength++;
|
||||||
min_pack_length++;
|
min_pack_length++;
|
||||||
/* We must test for 257 as length includes pack-length */
|
/* We must test for 257 as length includes pack-length */
|
||||||
if (test(rec->length >= 257))
|
if (test(rec->length >= 257))
|
||||||
{
|
{
|
||||||
long_varchar_count++;
|
long_varchar_count++;
|
||||||
pack_reclength+= 2; /* May be packed on 3 bytes */
|
pack_reclength+= 2; /* May be packed on 3 bytes */
|
||||||
@ -542,6 +541,8 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||||||
if (! (flags & HA_DONT_TOUCH_DATA))
|
if (! (flags & HA_DONT_TOUCH_DATA))
|
||||||
share.state.create_time= (long) time((time_t*) 0);
|
share.state.create_time= (long) time((time_t*) 0);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&THR_LOCK_myisam);
|
||||||
|
|
||||||
if (ci->index_file_name)
|
if (ci->index_file_name)
|
||||||
{
|
{
|
||||||
fn_format(filename, ci->index_file_name,"",MI_NAME_IEXT,4);
|
fn_format(filename, ci->index_file_name,"",MI_NAME_IEXT,4);
|
||||||
|
@ -401,7 +401,7 @@ void end_thr_alarm(my_bool free_structures)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("end_thr_alarm");
|
DBUG_ENTER("end_thr_alarm");
|
||||||
if (alarm_aborted != 1) /* If memory not freed */
|
if (alarm_aborted != 1) /* If memory not freed */
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_alarm);
|
pthread_mutex_lock(&LOCK_alarm);
|
||||||
DBUG_PRINT("info",("Resheduling %d waiting alarms",alarm_queue.elements));
|
DBUG_PRINT("info",("Resheduling %d waiting alarms",alarm_queue.elements));
|
||||||
alarm_aborted= -1; /* mark aborted */
|
alarm_aborted= -1; /* mark aborted */
|
||||||
@ -415,13 +415,10 @@ void end_thr_alarm(my_bool free_structures)
|
|||||||
if (free_structures)
|
if (free_structures)
|
||||||
{
|
{
|
||||||
struct timespec abstime;
|
struct timespec abstime;
|
||||||
/*
|
|
||||||
The following test is just for safety, the caller should not
|
|
||||||
depend on this
|
|
||||||
*/
|
|
||||||
DBUG_ASSERT(!alarm_queue.elements);
|
|
||||||
/* Wait until alarm thread dies */
|
|
||||||
|
|
||||||
|
DBUG_ASSERT(!alarm_queue.elements);
|
||||||
|
|
||||||
|
/* Wait until alarm thread dies */
|
||||||
set_timespec(abstime, 10); /* Wait up to 10 seconds */
|
set_timespec(abstime, 10); /* Wait up to 10 seconds */
|
||||||
while (alarm_thread_running)
|
while (alarm_thread_running)
|
||||||
{
|
{
|
||||||
@ -429,16 +426,13 @@ void end_thr_alarm(my_bool free_structures)
|
|||||||
if (error == ETIME || error == ETIMEDOUT)
|
if (error == ETIME || error == ETIMEDOUT)
|
||||||
break; /* Don't wait forever */
|
break; /* Don't wait forever */
|
||||||
}
|
}
|
||||||
if (!alarm_queue.elements)
|
delete_queue(&alarm_queue);
|
||||||
|
alarm_aborted= 1;
|
||||||
|
pthread_mutex_unlock(&LOCK_alarm);
|
||||||
|
if (!alarm_thread_running) /* Safety */
|
||||||
{
|
{
|
||||||
delete_queue(&alarm_queue);
|
pthread_mutex_destroy(&LOCK_alarm);
|
||||||
alarm_aborted= 1;
|
pthread_cond_destroy(&COND_alarm);
|
||||||
pthread_mutex_unlock(&LOCK_alarm);
|
|
||||||
if (!alarm_thread_running) /* Safety */
|
|
||||||
{
|
|
||||||
pthread_mutex_destroy(&LOCK_alarm);
|
|
||||||
pthread_cond_destroy(&COND_alarm);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -255,7 +255,10 @@ static void start_and_monitor_instance(Instance_options *old_instance_options,
|
|||||||
log_info("starting instance %s", instance_name_buff);
|
log_info("starting instance %s", instance_name_buff);
|
||||||
|
|
||||||
if (start_process(old_instance_options, &process_info))
|
if (start_process(old_instance_options, &process_info))
|
||||||
|
{
|
||||||
|
instance_map->unlock();
|
||||||
return; /* error is logged */
|
return; /* error is logged */
|
||||||
|
}
|
||||||
|
|
||||||
/* allow users to delete instances */
|
/* allow users to delete instances */
|
||||||
instance_map->unlock();
|
instance_map->unlock();
|
||||||
|
@ -1069,9 +1069,9 @@ int decimal2longlong(decimal_t *from, longlong *to)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* boundary case: 9223372036854775808 */
|
/* boundary case: 9223372036854775808 */
|
||||||
if (unlikely(from->sign==0 && x < 0 && -x < 0))
|
if (unlikely(from->sign==0 && x == LONGLONG_MIN))
|
||||||
{
|
{
|
||||||
*to= -1-x;
|
*to= LONGLONG_MAX;
|
||||||
return E_DEC_OVERFLOW;
|
return E_DEC_OVERFLOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2675,7 +2675,8 @@ void test_pr(const char *s1, int prec, int dec, char filler, const char *orig,
|
|||||||
int slen= sizeof(s2);
|
int slen= sizeof(s2);
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
sprintf(s, "'%s', %d, %d, '%c'", s1, prec, dec, filler);
|
sprintf(s, filler ? "'%s', %d, %d, '%c'" : "'%s', %d, %d, '\\0'",
|
||||||
|
s1, prec, dec, filler);
|
||||||
end= strend(s1);
|
end= strend(s1);
|
||||||
string2decimal(s1, &a, &end);
|
string2decimal(s1, &a, &end);
|
||||||
res= decimal2string(&a, s2, &slen, prec, dec, filler);
|
res= decimal2string(&a, s2, &slen, prec, dec, filler);
|
||||||
|
Reference in New Issue
Block a user