mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Fixed problem with BIGINT and shutdown on AIX
Moved IF(test,column,NULL) code to 4.0 Changed mysys_priv.h to include my_pthread.h or my_no_pthread.h. Removed some CR's in os2 files.
This commit is contained in:
parent
0005f28b4e
commit
b779b63862
26 changed files with 239 additions and 238 deletions
|
@ -46928,9 +46928,10 @@ not yet 100% confident in this code.
|
|||
@appendixsubsec Changes in release 3.23.52
|
||||
@itemize @bullet
|
||||
@item
|
||||
Changed behaviour that @code{IF(condition,column,NULL)} returns column type
|
||||
Fixed problem with @code{UNSIGNED BIGINT} on AIX.
|
||||
@item
|
||||
Fixed a security bug with empty db column in db table
|
||||
Fixed security bug when having an empty databasename in the @code{user.db}
|
||||
table.
|
||||
@item
|
||||
Changed initialisation of @code{RND()} to make it less predicatable.
|
||||
@item
|
||||
|
|
|
@ -104,6 +104,8 @@
|
|||
#define _H_STRINGS
|
||||
#define _SYS_STREAM_H
|
||||
#define _AIX32_CURSES
|
||||
#define longlong2double(A) my_longlong2double(A)
|
||||
double my_longlong2double(unsigned long long A);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_BROKEN_SNPRINTF /* HPUX 10.20 don't have this defined */
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
environment, easier to use.
|
||||
*/
|
||||
|
||||
#if !defined(_my_no_pthread_h) && !defined(THREADS)
|
||||
#if !defined(_my_no_pthread_h) && !defined(THREAD)
|
||||
#define _my_no_pthread_h
|
||||
|
||||
#define pthread_mutex_init(A,B)
|
||||
|
|
|
@ -57,7 +57,7 @@ mysysobjects1 = my_init.lo my_static.lo my_malloc.lo my_realloc.lo \
|
|||
thr_mutex.lo mulalloc.lo string.lo default.lo \
|
||||
my_compress.lo array.lo my_once.lo list.lo my_net.lo \
|
||||
charset.lo hash.lo mf_iocache.lo my_seek.lo \
|
||||
my_pread.lo mf_cache.lo my_gethostbyname.lo
|
||||
my_pread.lo mf_cache.lo my_gethostbyname.lo my_port.lo
|
||||
# Not needed in the minimum library
|
||||
mysysobjects2 = getopt.lo getopt1.lo getvar.lo my_lib.lo
|
||||
mysysobjects = $(mysysobjects1) $(mysysobjects2)
|
||||
|
|
|
@ -18,7 +18,7 @@ TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work
|
|||
# Program Definitions
|
||||
#--
|
||||
|
||||
PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin
|
||||
PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/bin/X11
|
||||
|
||||
# Standard functions
|
||||
|
||||
|
|
|
@ -10,4 +10,6 @@ a
|
|||
a
|
||||
18446744073709551615
|
||||
a
|
||||
18446744073709551615
|
||||
a
|
||||
18446744073709551614
|
||||
|
|
|
@ -34,4 +34,4 @@ aaa
|
|||
sum(if(num is null,0.00,num))
|
||||
144.54
|
||||
min(if(y -x > 5,y,NULL)) max(if(y - x > 5,y,NULL))
|
||||
6 56
|
||||
16 6
|
||||
|
|
|
@ -5,12 +5,18 @@ select 0,256,00000000000000065536,2147483647,-2147483648,2147483648,+4294967296;
|
|||
select 9223372036854775807,-009223372036854775808;
|
||||
select +9999999999999999999,-9999999999999999999;
|
||||
|
||||
#
|
||||
# In 3.23 we have to disable the test of column to bigint as
|
||||
# this fails on AIX powerpc (the resolution for double is not good enough)
|
||||
# This will work on 4.0 as we then have internal handling of bigint variables.
|
||||
#
|
||||
|
||||
drop table if exists t1;
|
||||
create table t1 (a bigint unsigned not null, primary key(a));
|
||||
insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE);
|
||||
select * from t1;
|
||||
select * from t1 where a=18446744073709551615;
|
||||
#select * from t1 where a='18446744073709551615';
|
||||
select * from t1 where a='18446744073709551615';
|
||||
delete from t1 where a=18446744073709551615;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
|
|
@ -49,7 +49,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\
|
|||
my_quick.c my_lockmem.c my_static.c \
|
||||
getopt.c getopt1.c getvar.c my_mkdir.c \
|
||||
default.c my_compress.c checksum.c raid.cc raid2.c \
|
||||
my_net.c \
|
||||
my_net.c my_port.c \
|
||||
my_vsnprintf.c charset.c my_bitmap.c my_gethostbyname.c
|
||||
EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
|
||||
thr_mutex.c thr_rwlock.c
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
/* Thread safe version of gethostbyname_r() */
|
||||
|
||||
#include "mysys_priv.h"
|
||||
#include "my_pthread.h"
|
||||
#include <assert.h>
|
||||
#if !defined(MSDOS) && !defined(__WIN__)
|
||||
#include <netdb.h>
|
||||
|
@ -28,11 +27,6 @@
|
|||
/* This file is not needed if my_gethostbyname_r is a macro */
|
||||
#if !defined(my_gethostbyname_r)
|
||||
|
||||
#ifndef THREAD
|
||||
#define pthread_mutex_lock(A)
|
||||
#define pthread_mutex_unlock(A)
|
||||
#endif
|
||||
|
||||
/*
|
||||
Emulate SOLARIS style calls, not because it's better, but just to make the
|
||||
usage of getbostbyname_r simpler.
|
||||
|
|
|
@ -21,9 +21,6 @@
|
|||
#include "m_ctype.h"
|
||||
#include <m_string.h>
|
||||
#include <m_ctype.h>
|
||||
#ifdef THREAD
|
||||
#include <my_pthread.h>
|
||||
#endif
|
||||
#ifdef HAVE_GETRUSAGE
|
||||
#include <sys/resource.h>
|
||||
/* extern int getrusage(int, struct rusage *); */
|
||||
|
|
|
@ -34,11 +34,6 @@
|
|||
#endif
|
||||
#endif /* !defined(MSDOS) && !defined(__WIN__) */
|
||||
|
||||
#ifndef THREAD
|
||||
#define pthread_mutex_lock(A)
|
||||
#define pthread_mutex_unlock(A)
|
||||
#endif
|
||||
|
||||
void my_inet_ntoa(struct in_addr in, char *buf)
|
||||
{
|
||||
char *ptr;
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
|
||||
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
|
||||
{
|
||||
APIRET rc = 0;
|
||||
HEV event;
|
||||
APIRET rc = 0;
|
||||
HEV event;
|
||||
cond->waiting=0;
|
||||
/* Warp3 FP29 or Warp4 FP4 or better required */
|
||||
rc = DosCreateEventSem( NULL, &cond->semaphore, 0x0800, 0);
|
||||
|
@ -61,7 +61,7 @@ int pthread_cond_destroy(pthread_cond_t *cond)
|
|||
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
APIRET rc;
|
||||
int rval;
|
||||
int rval;
|
||||
|
||||
rval = 0;
|
||||
cond->waiting++;
|
||||
|
@ -80,13 +80,13 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
|||
}
|
||||
|
||||
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
struct timespec *abstime)
|
||||
struct timespec *abstime)
|
||||
{
|
||||
struct timeb curtime;
|
||||
int result;
|
||||
long timeout;
|
||||
APIRET rc;
|
||||
int rval;
|
||||
int rval;
|
||||
|
||||
_ftime(&curtime);
|
||||
timeout= ((long) (abstime->ts_sec - curtime.time)*1000L +
|
||||
|
@ -123,13 +123,13 @@ int pthread_cond_signal(pthread_cond_t *cond)
|
|||
|
||||
int pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
APIRET rc;
|
||||
|
||||
/*
|
||||
* Enter a loop to bring all threads off the
|
||||
* condition queue:
|
||||
*/
|
||||
/*
|
||||
* Enter a loop to bring all threads off the
|
||||
* condition queue:
|
||||
*/
|
||||
i = cond->waiting;
|
||||
while (i--) rc = DosPostEventSem(cond->semaphore);
|
||||
|
||||
|
@ -176,9 +176,9 @@ struct tm *localtime_r(const time_t *timep,struct tm *tmp)
|
|||
else
|
||||
{
|
||||
struct tm *res=localtime(timep);
|
||||
if (!res) /* Wrong date */
|
||||
if (!res) /* Wrong date */
|
||||
{
|
||||
bzero(tmp,sizeof(*tmp)); /* Keep things safe */
|
||||
bzero(tmp,sizeof(*tmp)); /* Keep things safe */
|
||||
return 0;
|
||||
}
|
||||
*tmp= *res;
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
|
||||
long _findfirst( char* path, struct _finddata_t* dos_file)
|
||||
{
|
||||
HDIR hdir = HDIR_CREATE;
|
||||
APIRET rc;
|
||||
HDIR hdir = HDIR_CREATE;
|
||||
APIRET rc;
|
||||
FILEFINDBUF3 buf3;
|
||||
ULONG entries = 1;
|
||||
ULONG entries = 1;
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf( "_findfirst path %s\n", path);
|
||||
|
@ -37,13 +37,13 @@ long _findfirst( char* path, struct _finddata_t* dos_file)
|
|||
|
||||
memset( &buf3, 0, sizeof( buf3));
|
||||
rc = DosFindFirst(
|
||||
path, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */
|
||||
&hdir, /* Address of the handle associated with this DosFindFirst request. */
|
||||
FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */
|
||||
&buf3, /* Result buffer. */
|
||||
sizeof( buf3), /* The length, in bytes, of pfindbuf. */
|
||||
&entries, /* Pointer to the number of entries: */
|
||||
FIL_STANDARD); /* The level of file information required. */
|
||||
path, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */
|
||||
&hdir, /* Address of the handle associated with this DosFindFirst request. */
|
||||
FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */
|
||||
&buf3, /* Result buffer. */
|
||||
sizeof( buf3), /* The length, in bytes, of pfindbuf. */
|
||||
&entries, /* Pointer to the number of entries: */
|
||||
FIL_STANDARD); /* The level of file information required. */
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf( "_findfirst rc=%d hdir=%d entries=%d->%s\n", rc, hdir, entries, buf3.achName);
|
||||
|
@ -64,16 +64,16 @@ long _findfirst( char* path, struct _finddata_t* dos_file)
|
|||
|
||||
long _findnext( long hdir, struct _finddata_t* dos_file)
|
||||
{
|
||||
APIRET rc;
|
||||
APIRET rc;
|
||||
FILEFINDBUF3 buf3;
|
||||
ULONG entries = 1;
|
||||
ULONG entries = 1;
|
||||
|
||||
memset( &buf3, 0, sizeof( buf3));
|
||||
rc = DosFindNext(
|
||||
hdir,
|
||||
&buf3, /* Result buffer. */
|
||||
sizeof( buf3), /* The length, in bytes, of pfindbuf. */
|
||||
&entries); /* Pointer to the number of entries: */
|
||||
hdir,
|
||||
&buf3, /* Result buffer. */
|
||||
sizeof( buf3), /* The length, in bytes, of pfindbuf. */
|
||||
&entries); /* Pointer to the number of entries: */
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf( "_findnext rc=%d hdir=%d entries=%d->%s\n", rc, hdir, entries, buf3.achName);
|
||||
|
@ -93,7 +93,7 @@ long _findnext( long hdir, struct _finddata_t* dos_file)
|
|||
|
||||
void _findclose( long hdir)
|
||||
{
|
||||
APIRET rc;
|
||||
APIRET rc;
|
||||
|
||||
rc = DosFindClose( hdir);
|
||||
#ifdef _DEBUG
|
||||
|
@ -105,8 +105,8 @@ DIR* opendir( char* path)
|
|||
{
|
||||
DIR* dir = (DIR*) calloc( 1, sizeof( DIR));
|
||||
char buffer[260];
|
||||
APIRET rc;
|
||||
ULONG entries = 1;
|
||||
APIRET rc;
|
||||
ULONG entries = 1;
|
||||
|
||||
strcpy( buffer, path);
|
||||
strcat( buffer, "*.*");
|
||||
|
@ -118,13 +118,13 @@ DIR* opendir( char* path)
|
|||
dir->hdir = HDIR_CREATE;
|
||||
memset( &dir->buf3, 0, sizeof( dir->buf3));
|
||||
rc = DosFindFirst(
|
||||
buffer, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */
|
||||
&dir->hdir, /* Address of the handle associated with this DosFindFirst request. */
|
||||
FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */
|
||||
&dir->buf3, /* Result buffer. */
|
||||
sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */
|
||||
&entries, /* Pointer to the number of entries: */
|
||||
FIL_STANDARD); /* The level of file information required. */
|
||||
buffer, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */
|
||||
&dir->hdir, /* Address of the handle associated with this DosFindFirst request. */
|
||||
FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */
|
||||
&dir->buf3, /* Result buffer. */
|
||||
sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */
|
||||
&entries, /* Pointer to the number of entries: */
|
||||
FIL_STANDARD); /* The level of file information required. */
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf( "opendir rc=%d hdir=%d entries=%d->%s\n", rc, dir->hdir, entries, dir->buf3.achName);
|
||||
|
@ -138,9 +138,9 @@ DIR* opendir( char* path)
|
|||
|
||||
struct dirent* readdir( DIR* dir)
|
||||
{
|
||||
APIRET rc;
|
||||
APIRET rc;
|
||||
//FILEFINDBUF3 buf3;
|
||||
ULONG entries = 1;
|
||||
ULONG entries = 1;
|
||||
|
||||
if (!dir->buf3.achName[0]) // file not found on previous query
|
||||
return NULL;
|
||||
|
@ -151,10 +151,10 @@ struct dirent* readdir( DIR* dir)
|
|||
// query next file
|
||||
memset( &dir->buf3, 0, sizeof( dir->buf3));
|
||||
rc = DosFindNext(
|
||||
dir->hdir,
|
||||
&dir->buf3, /* Result buffer. */
|
||||
sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */
|
||||
&entries); /* Pointer to the number of entries: */
|
||||
dir->hdir,
|
||||
&dir->buf3, /* Result buffer. */
|
||||
sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */
|
||||
&entries); /* Pointer to the number of entries: */
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf( "_findnext rc=%d hdir=%d entries=%d->%s\n", rc, dir->hdir, entries, dir->buf3.achName);
|
||||
|
@ -168,7 +168,7 @@ struct dirent* readdir( DIR* dir)
|
|||
|
||||
int closedir (DIR *dir)
|
||||
{
|
||||
APIRET rc;
|
||||
APIRET rc;
|
||||
|
||||
rc = DosFindClose( dir->hdir);
|
||||
#ifdef _DEBUG
|
||||
|
|
|
@ -30,9 +30,9 @@ extern "C" {
|
|||
struct _finddata_t
|
||||
{
|
||||
unsigned attrib;
|
||||
//unsigned long time_create; /* -1 for FAT file systems */
|
||||
//unsigned long time_access; /* -1 for FAT file systems */
|
||||
//unsigned long time_write;
|
||||
//unsigned long time_create; /* -1 for FAT file systems */
|
||||
//unsigned long time_access; /* -1 for FAT file systems */
|
||||
//unsigned long time_write;
|
||||
unsigned long size;
|
||||
char name[260];
|
||||
//uint16 wr_date;
|
||||
|
@ -42,10 +42,10 @@ struct _finddata_t
|
|||
struct dirent
|
||||
{
|
||||
//unsigned attrib;
|
||||
//unsigned long time_create; /* -1 for FAT file systems */
|
||||
//unsigned long time_access; /* -1 for FAT file systems */
|
||||
//unsigned long time_write;
|
||||
//unsigned long size;
|
||||
//unsigned long time_create; /* -1 for FAT file systems */
|
||||
//unsigned long time_access; /* -1 for FAT file systems */
|
||||
//unsigned long time_write;
|
||||
//unsigned long size;
|
||||
char d_name[260];
|
||||
//uint16 wr_date;
|
||||
//uint16 wr_time;
|
||||
|
@ -66,9 +66,9 @@ int closedir (DIR *);
|
|||
//#define _A_SUBDIR FILE_DIRECTORY
|
||||
//#define _A_RDONLY FILE_READONLY
|
||||
|
||||
//long _findfirst( char*, struct _finddata_t*);
|
||||
//long _findnext( long, struct _finddata_t*);
|
||||
//void _findclose( long);
|
||||
//long _findfirst( char*, struct _finddata_t*);
|
||||
//long _findnext( long, struct _finddata_t*);
|
||||
//void _findclose( long);
|
||||
|
||||
#ifdef __cplusplus_00
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ char* dlerror( void);
|
|||
void* dlsym( void* hmod, char* fn);
|
||||
void dlclose( void* hmod);
|
||||
|
||||
char fail[ 256];
|
||||
char fail[ 256];
|
||||
|
||||
void* dlopen( char* path, int flag)
|
||||
{
|
||||
|
@ -56,7 +56,7 @@ char* dlerror( void)
|
|||
void* dlsym( void* hmod, char* fn)
|
||||
{
|
||||
APIRET rc;
|
||||
PFN addr;
|
||||
PFN addr;
|
||||
|
||||
rc = DosQueryProcAddr( (HMODULE) hmod, 0l, fn, &addr);
|
||||
if (rc)
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA */
|
||||
|
||||
void _OS2errno( APIRET rc);
|
||||
void _OS2errno( APIRET rc);
|
||||
longlong _lseek64( int fd, longlong offset, int seektype);
|
||||
int _lock64( int fd, int locktype, my_off_t start,
|
||||
my_off_t length, myf MyFlags);
|
||||
int _sopen64( const char *name, int oflag, int shflag, int mask);
|
||||
int _lock64( int fd, int locktype, my_off_t start,
|
||||
my_off_t length, myf MyFlags);
|
||||
int _sopen64( const char *name, int oflag, int shflag, int mask);
|
||||
|
||||
//
|
||||
// this class is used to define a global c++ variable, that
|
||||
|
@ -34,52 +34,52 @@ class File64bit
|
|||
File64bit(); /* default constructor */
|
||||
} initFile64bit;
|
||||
|
||||
static APIRET (* APIENTRY _DosOpenL)(PCSZ pszFileName,
|
||||
PHFILE phf,
|
||||
PULONG pulAction,
|
||||
LONGLONG cbFile,
|
||||
ULONG ulAttribute,
|
||||
ULONG fsOpenFlags,
|
||||
ULONG fsOpenMode,
|
||||
PEAOP2 peaop2);
|
||||
static APIRET (* APIENTRY _DosSetFilePtrL)(HFILE hFile,
|
||||
LONGLONG ib,
|
||||
ULONG method,
|
||||
PLONGLONG ibActual);
|
||||
static APIRET (* APIENTRY _DosSetFileLocksL)(HFILE hFile,
|
||||
PFILELOCKL pflUnlock,
|
||||
PFILELOCKL pflLock,
|
||||
ULONG timeout,
|
||||
ULONG flags);
|
||||
static APIRET (* APIENTRY _DosOpenL)(PCSZ pszFileName,
|
||||
PHFILE phf,
|
||||
PULONG pulAction,
|
||||
LONGLONG cbFile,
|
||||
ULONG ulAttribute,
|
||||
ULONG fsOpenFlags,
|
||||
ULONG fsOpenMode,
|
||||
PEAOP2 peaop2);
|
||||
static APIRET (* APIENTRY _DosSetFilePtrL)(HFILE hFile,
|
||||
LONGLONG ib,
|
||||
ULONG method,
|
||||
PLONGLONG ibActual);
|
||||
static APIRET (* APIENTRY _DosSetFileLocksL)(HFILE hFile,
|
||||
PFILELOCKL pflUnlock,
|
||||
PFILELOCKL pflLock,
|
||||
ULONG timeout,
|
||||
ULONG flags);
|
||||
|
||||
#define EIO EINVAL
|
||||
#define EIO EINVAL
|
||||
#define ESPIPE EBADSEEK
|
||||
|
||||
|
||||
static unsigned char const errno_tab[] =
|
||||
{
|
||||
0 , EINVAL, ENOENT, ENOENT, EMFILE, /* 0..4 */
|
||||
EACCES, EBADF, EIO, ENOMEM, EIO, /* 5..9 */
|
||||
0 , EINVAL, ENOENT, ENOENT, EMFILE, /* 0..4 */
|
||||
EACCES, EBADF, EIO, ENOMEM, EIO, /* 5..9 */
|
||||
EINVAL, ENOEXEC,EINVAL, EINVAL, EINVAL, /* 10..14 */
|
||||
ENOENT, EBUSY, EXDEV, ENOENT, EROFS, /* 15..19 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 20..24 */
|
||||
EIO, EIO, EIO, ENOSPC, EIO, /* 25..29 */
|
||||
EIO, EIO, EACCES, EACCES, EIO, /* 30..34 */
|
||||
EIO, EIO, EIO, EIO, ENOSPC, /* 35..39 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 40..44 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 45..49 */
|
||||
EIO, EIO, EIO, EIO, EBUSY, /* 50..54 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 55..59 */
|
||||
EIO, ENOSPC, ENOSPC, EIO, EIO, /* 60..64 */
|
||||
EACCES, EIO, EIO, EIO, EIO, /* 65..69 */
|
||||
EIO, EIO, EIO, EROFS, EIO, /* 70..74 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 75..79 */
|
||||
EEXIST, EIO, ENOENT, EIO, EIO, /* 80..84 */
|
||||
EIO, EIO, EINVAL, EIO, EAGAIN, /* 85..89 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 90..94 */
|
||||
EINTR, EIO, EIO, EIO, EACCES, /* 95..99 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 20..24 */
|
||||
EIO, EIO, EIO, ENOSPC, EIO, /* 25..29 */
|
||||
EIO, EIO, EACCES, EACCES, EIO, /* 30..34 */
|
||||
EIO, EIO, EIO, EIO, ENOSPC, /* 35..39 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 40..44 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 45..49 */
|
||||
EIO, EIO, EIO, EIO, EBUSY, /* 50..54 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 55..59 */
|
||||
EIO, ENOSPC, ENOSPC, EIO, EIO, /* 60..64 */
|
||||
EACCES, EIO, EIO, EIO, EIO, /* 65..69 */
|
||||
EIO, EIO, EIO, EROFS, EIO, /* 70..74 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 75..79 */
|
||||
EEXIST, EIO, ENOENT, EIO, EIO, /* 80..84 */
|
||||
EIO, EIO, EINVAL, EIO, EAGAIN, /* 85..89 */
|
||||
EIO, EIO, EIO, EIO, EIO, /* 90..94 */
|
||||
EINTR, EIO, EIO, EIO, EACCES, /* 95..99 */
|
||||
ENOMEM, EINVAL, EINVAL, ENOMEM, EINVAL, /* 100..104 */
|
||||
EINVAL, ENOMEM, EIO, EACCES, EPIPE, /* 105..109 */
|
||||
EINVAL, ENOMEM, EIO, EACCES, EPIPE, /* 105..109 */
|
||||
ENOENT, E2BIG, ENOSPC, ENOMEM, EBADF, /* 110..114 */
|
||||
EINVAL, EINVAL, EINVAL, EINVAL, EINVAL, /* 115..119 */
|
||||
EINVAL, EINVAL, EINVAL, ENOENT, EINVAL, /* 120..124 */
|
||||
|
@ -121,16 +121,16 @@ static unsigned char const errno_tab[] =
|
|||
EINVAL, EBUSY, EINVAL, ESRCH, EINVAL, /* 300..304 */
|
||||
ESRCH, EINVAL, EINVAL, EINVAL, ESRCH, /* 305..309 */
|
||||
EINVAL, ENOMEM, EINVAL, EINVAL, EINVAL, /* 310..314 */
|
||||
EINVAL, E2BIG, ENOENT, EIO, EIO, /* 315..319 */
|
||||
EINVAL, E2BIG, ENOENT, EIO, EIO, /* 315..319 */
|
||||
EINVAL, EINVAL, EINVAL, EINVAL, EAGAIN, /* 320..324 */
|
||||
EINVAL, EINVAL, EINVAL, EIO, ENOENT, /* 325..329 */
|
||||
EINVAL, EINVAL, EINVAL, EIO, ENOENT, /* 325..329 */
|
||||
EACCES, EACCES, EACCES, ENOENT, ENOMEM /* 330..334 */
|
||||
};
|
||||
|
||||
/*
|
||||
* Initialize 64bit file access: dynamic load of WSeB API
|
||||
*/
|
||||
File64bit :: File64bit()
|
||||
File64bit :: File64bit()
|
||||
{
|
||||
HMODULE hDoscalls;
|
||||
|
||||
|
@ -156,7 +156,7 @@ static unsigned char const errno_tab[] =
|
|||
#endif
|
||||
}
|
||||
|
||||
void _OS2errno( APIRET rc)
|
||||
void _OS2errno( APIRET rc)
|
||||
{
|
||||
if (rc >= sizeof (errno_tab))
|
||||
errno = EINVAL;
|
||||
|
@ -187,19 +187,19 @@ longlong _lseek64( int fd, longlong offset, int seektype)
|
|||
}
|
||||
|
||||
inline _SetFileLocksL(HFILE hFile,
|
||||
PFILELOCKL pflUnlock,
|
||||
PFILELOCKL pflLock,
|
||||
ULONG timeout,
|
||||
ULONG flags)
|
||||
PFILELOCKL pflUnlock,
|
||||
PFILELOCKL pflLock,
|
||||
ULONG timeout,
|
||||
ULONG flags)
|
||||
{
|
||||
if (_DosSetFileLocksL) {
|
||||
APIRET rc;
|
||||
rc = _DosSetFileLocksL( hFile, pflUnlock, pflLock, timeout, flags);
|
||||
|
||||
// on FAT/HPFS/LAN a INVALID_PARAMETER is returned, seems that
|
||||
// on FAT/HPFS/LAN a INVALID_PARAMETER is returned, seems that
|
||||
// only JFS can handle >2GB ranges.
|
||||
if (rc != 87)
|
||||
return rc;
|
||||
return rc;
|
||||
|
||||
// got INVALID_PARAMETER, fallback to standard call
|
||||
}
|
||||
|
@ -209,8 +209,8 @@ inline _SetFileLocksL(HFILE hFile,
|
|||
return DosSetFileLocks( hFile, &flUnlock, &flLock, timeout, flags);
|
||||
}
|
||||
|
||||
int _lock64( int fd, int locktype, my_off_t start,
|
||||
my_off_t length, myf MyFlags)
|
||||
int _lock64( int fd, int locktype, my_off_t start,
|
||||
my_off_t length, myf MyFlags)
|
||||
{
|
||||
FILELOCKL LockArea = {0,0}, UnlockArea = {0,0};
|
||||
ULONG readonly = 0;
|
||||
|
@ -241,16 +241,16 @@ int _lock64( int fd, int locktype, my_off_t start,
|
|||
//printf( "fd %d, locktype %d, rc %d (dont_wait)\n", fd, locktype, rc);
|
||||
if (rc == 33) { /* Lock Violation */
|
||||
|
||||
DBUG_PRINT("info",("Was locked, trying with timeout"));
|
||||
rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 1 * 1000, readonly);
|
||||
//printf( "fd %d, locktype %d, rc %d (dont_wait with timeout)\n", fd, locktype, rc);
|
||||
DBUG_PRINT("info",("Was locked, trying with timeout"));
|
||||
rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 1 * 1000, readonly);
|
||||
//printf( "fd %d, locktype %d, rc %d (dont_wait with timeout)\n", fd, locktype, rc);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
while( rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 0, readonly) && (rc == 33)) {
|
||||
printf(".");
|
||||
DosSleep(1 * 1000);
|
||||
printf(".");
|
||||
DosSleep(1 * 1000);
|
||||
}
|
||||
//printf( "fd %d, locktype %d, rc %d (wait2)\n", fd, locktype, rc);
|
||||
}
|
||||
|
@ -264,9 +264,9 @@ int _lock64( int fd, int locktype, my_off_t start,
|
|||
return(-1);
|
||||
}
|
||||
|
||||
int sopen( const char *name, int oflag, int shflag, int mask)
|
||||
int sopen( const char *name, int oflag, int shflag, int mask)
|
||||
{
|
||||
int fail_errno;
|
||||
int fail_errno;
|
||||
APIRET rc = 0;
|
||||
HFILE hf = 0;
|
||||
ULONG ulAction = 0;
|
||||
|
@ -289,18 +289,18 @@ int sopen( const char *name, int oflag, int shflag, int mask)
|
|||
{
|
||||
if (oflag & O_EXCL)
|
||||
{
|
||||
fsOpenFlags = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
|
||||
fail_errno = EEXIST;
|
||||
fsOpenFlags = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
|
||||
fail_errno = EEXIST;
|
||||
}
|
||||
else if (oflag & O_TRUNC)
|
||||
fsOpenFlags = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
|
||||
fsOpenFlags = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
|
||||
else
|
||||
fsOpenFlags = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
|
||||
fsOpenFlags = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
|
||||
|
||||
if (mask & S_IWRITE)
|
||||
ulAttribute = FILE_NORMAL;
|
||||
ulAttribute = FILE_NORMAL;
|
||||
else
|
||||
ulAttribute = FILE_READONLY;
|
||||
ulAttribute = FILE_READONLY;
|
||||
|
||||
}
|
||||
else if (oflag & O_TRUNC)
|
||||
|
@ -311,10 +311,10 @@ int sopen( const char *name, int oflag, int shflag, int mask)
|
|||
/* Try to open the file and handle errors. */
|
||||
if (_DosOpenL)
|
||||
rc = _DosOpenL( name, &hf, &ulAction, cbFile,
|
||||
ulAttribute, fsOpenFlags, fsOpenMode, NULL);
|
||||
ulAttribute, fsOpenFlags, fsOpenMode, NULL);
|
||||
else
|
||||
rc = DosOpen( name, &hf, &ulAction, (LONG) cbFile,
|
||||
ulAttribute, fsOpenFlags, fsOpenMode, NULL);
|
||||
ulAttribute, fsOpenFlags, fsOpenMode, NULL);
|
||||
|
||||
if (rc == ERROR_OPEN_FAILED)
|
||||
{
|
||||
|
@ -334,7 +334,7 @@ int sopen( const char *name, int oflag, int shflag, int mask)
|
|||
return hf;
|
||||
}
|
||||
|
||||
int read( int fd, void *buffer, unsigned int count)
|
||||
int read( int fd, void *buffer, unsigned int count)
|
||||
{
|
||||
APIRET rc;
|
||||
ULONG actual;
|
||||
|
@ -350,7 +350,7 @@ int read( int fd, void *buffer, unsigned int count)
|
|||
return(-1);
|
||||
}
|
||||
|
||||
int write( int fd, const void *buffer, unsigned int count)
|
||||
int write( int fd, const void *buffer, unsigned int count)
|
||||
{
|
||||
APIRET rc;
|
||||
ULONG actual;
|
||||
|
@ -366,7 +366,7 @@ int write( int fd, const void *buffer, unsigned int count)
|
|||
return(-1);
|
||||
}
|
||||
|
||||
int close( int fd)
|
||||
int close( int fd)
|
||||
{
|
||||
APIRET rc;
|
||||
ULONG actual;
|
||||
|
|
|
@ -72,8 +72,8 @@ pthread_mutex_destroy(pthread_mutex_t * mutex)
|
|||
int
|
||||
pthread_mutex_lock(pthread_mutex_t * mutex)
|
||||
{
|
||||
int ret = 0;
|
||||
int status = 0;
|
||||
int ret = 0;
|
||||
int status = 0;
|
||||
APIRET rc = 0;
|
||||
|
||||
rc = DosRequestMutexSem(*mutex,SEM_INDEFINITE_WAIT);
|
||||
|
@ -86,9 +86,9 @@ pthread_mutex_lock(pthread_mutex_t * mutex)
|
|||
int
|
||||
pthread_mutex_unlock(pthread_mutex_t * mutex)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret = 0;
|
||||
APIRET rc = 0;
|
||||
int status;
|
||||
int status;
|
||||
|
||||
rc = DosReleaseMutexSem(*mutex);
|
||||
|
||||
|
|
|
@ -31,9 +31,9 @@ static pthread_mutex_t THR_LOCK_thread;
|
|||
|
||||
struct pthread_map
|
||||
{
|
||||
HANDLE pthreadself;
|
||||
HANDLE pthreadself;
|
||||
pthread_handler func;
|
||||
void * param;
|
||||
void * param;
|
||||
};
|
||||
|
||||
void win_pthread_init(void)
|
||||
|
@ -57,7 +57,7 @@ static pthread_handler_decl(pthread_start,param)
|
|||
pthread_handler func=((struct pthread_map *) param)->func;
|
||||
void *func_param=((struct pthread_map *) param)->param;
|
||||
my_thread_init(); /* Will always succeed in windows */
|
||||
pthread_mutex_lock(&THR_LOCK_thread); /* Wait for beginthread to return */
|
||||
pthread_mutex_lock(&THR_LOCK_thread); /* Wait for beginthread to return */
|
||||
win_pthread_self=((struct pthread_map *) param)->pthreadself;
|
||||
pthread_mutex_unlock(&THR_LOCK_thread);
|
||||
free((char*) param); /* Free param from create */
|
||||
|
|
|
@ -18,23 +18,23 @@
|
|||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA */
|
||||
|
||||
DWORD TlsAlloc( void);
|
||||
BOOL TlsFree( DWORD);
|
||||
PVOID TlsGetValue( DWORD);
|
||||
BOOL TlsSetValue( DWORD, PVOID);
|
||||
DWORD TlsAlloc( void);
|
||||
BOOL TlsFree( DWORD);
|
||||
PVOID TlsGetValue( DWORD);
|
||||
BOOL TlsSetValue( DWORD, PVOID);
|
||||
|
||||
#define TLS_MINIMUM_AVAILABLE 64
|
||||
#define TLS_MINIMUM_AVAILABLE 64
|
||||
|
||||
|
||||
PULONG tls_storage; /* TLS local storage */
|
||||
DWORD tls_bits[2]; /* TLS in-use bits */
|
||||
pthread_mutex_t tls_mutex; /* TLS mutex for in-use bits */
|
||||
PULONG tls_storage; /* TLS local storage */
|
||||
DWORD tls_bits[2]; /* TLS in-use bits */
|
||||
pthread_mutex_t tls_mutex; /* TLS mutex for in-use bits */
|
||||
|
||||
DWORD TlsAlloc( void)
|
||||
DWORD TlsAlloc( void)
|
||||
{
|
||||
DWORD index = -1;
|
||||
DWORD mask, tibidx;
|
||||
int i;
|
||||
int i;
|
||||
|
||||
if (tls_storage == NULL) {
|
||||
|
||||
|
@ -43,12 +43,12 @@ DWORD TlsAlloc( void)
|
|||
// allocate memory for TLS storage
|
||||
rc = DosAllocThreadLocalMemory( 1, &tls_storage);
|
||||
if (rc) {
|
||||
fprintf( stderr, "DosAllocThreadLocalMemory error: return code = %u\n", rc);
|
||||
fprintf( stderr, "DosAllocThreadLocalMemory error: return code = %u\n", rc);
|
||||
}
|
||||
|
||||
// create a mutex
|
||||
if (pthread_mutex_init( &tls_mutex, NULL))
|
||||
fprintf( stderr, "Failed to init TLS mutex\n");
|
||||
fprintf( stderr, "Failed to init TLS mutex\n");
|
||||
}
|
||||
|
||||
pthread_mutex_lock( &tls_mutex);
|
||||
|
@ -56,18 +56,18 @@ DWORD TlsAlloc( void)
|
|||
tibidx = 0;
|
||||
if (tls_bits[0] == 0xFFFFFFFF) {
|
||||
if (tls_bits[1] == 0xFFFFFFFF) {
|
||||
fprintf( stderr, "tid#%d, no more TLS bits available\n", _threadid);
|
||||
pthread_mutex_unlock( &tls_mutex);
|
||||
return -1;
|
||||
fprintf( stderr, "tid#%d, no more TLS bits available\n", _threadid);
|
||||
pthread_mutex_unlock( &tls_mutex);
|
||||
return -1;
|
||||
}
|
||||
tibidx = 1;
|
||||
}
|
||||
for( i=0; i<32; i++) {
|
||||
mask = (1 << i);
|
||||
if ((tls_bits[ tibidx] & mask) == 0) {
|
||||
tls_bits[ tibidx] |= mask;
|
||||
index = (tibidx*32) + i;
|
||||
break;
|
||||
tls_bits[ tibidx] |= mask;
|
||||
index = (tibidx*32) + i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tls_storage[index] = 0;
|
||||
|
@ -79,9 +79,9 @@ DWORD TlsAlloc( void)
|
|||
return index;
|
||||
}
|
||||
|
||||
BOOL TlsFree( DWORD index)
|
||||
BOOL TlsFree( DWORD index)
|
||||
{
|
||||
int tlsidx;
|
||||
int tlsidx;
|
||||
DWORD mask;
|
||||
|
||||
if (index >= TLS_MINIMUM_AVAILABLE)
|
||||
|
@ -106,7 +106,7 @@ BOOL TlsFree( DWORD index)
|
|||
}
|
||||
|
||||
|
||||
PVOID TlsGetValue( DWORD index)
|
||||
PVOID TlsGetValue( DWORD index)
|
||||
{
|
||||
if (index >= TLS_MINIMUM_AVAILABLE)
|
||||
return NULL;
|
||||
|
@ -122,7 +122,7 @@ PVOID TlsGetValue( DWORD index)
|
|||
return (PVOID) tls_array[ index];
|
||||
}
|
||||
|
||||
BOOL TlsSetValue( DWORD index, PVOID val)
|
||||
BOOL TlsSetValue( DWORD index, PVOID val)
|
||||
{
|
||||
|
||||
// verify if memory has been allocated for this thread
|
||||
|
|
40
mysys/my_port.c
Normal file
40
mysys/my_port.c
Normal file
|
@ -0,0 +1,40 @@
|
|||
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA */
|
||||
|
||||
/*
|
||||
Small functions to make code portable
|
||||
*/
|
||||
|
||||
#include "mysys_priv.h"
|
||||
|
||||
#ifdef _AIX
|
||||
|
||||
/*
|
||||
On AIX, at least with gcc 3.1, the expression
|
||||
'(double) (ulonglong) var' doesn't always work for big unsigned
|
||||
integers like '18446744073709551615'. The end result is that the
|
||||
high bit is simply dropped. (probably bug in gcc optimizations)
|
||||
Handling the conversion in a sub function seems to work.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
double my_longlong2double(unsigned long long nr)
|
||||
{
|
||||
return (double) nr;
|
||||
}
|
||||
#endif /* _AIX */
|
|
@ -23,10 +23,10 @@
|
|||
#endif
|
||||
|
||||
#ifdef THREAD
|
||||
#include <my_pthread.h>
|
||||
extern pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache,
|
||||
THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_net,THR_LOCK_charset;
|
||||
extern pthread_mutex_t LOCK_bitmap;
|
||||
#else /* THREAD */
|
||||
#define pthread_mutex_lock(A)
|
||||
#define pthread_mutex_unlock(A)
|
||||
#else
|
||||
#include <my_no_pthread.h>
|
||||
#endif
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
/* Synchronization - readers / writer thread locks */
|
||||
|
||||
#include "mysys_priv.h"
|
||||
#include <my_pthread.h>
|
||||
#if defined(THREAD) && !defined(HAVE_PTHREAD_RWLOCK_RDLOCK) && !defined(HAVE_RWLOCK_INIT)
|
||||
|
||||
/*
|
||||
|
|
|
@ -267,43 +267,6 @@ innobase_mysql_print_thd(
|
|||
|
||||
thd = (THD*) input_thd;
|
||||
|
||||
buf += sprintf(buf, "MySQL thread id %lu, query id %lu",
|
||||
thd->thread_id, thd->query_id);
|
||||
if (thd->host) {
|
||||
buf += sprintf(buf, " %.30s", thd->host);
|
||||
}
|
||||
|
||||
if (thd->ip) {
|
||||
buf += sprintf(buf, " %.20s", thd->ip);
|
||||
}
|
||||
|
||||
if (thd->user) {
|
||||
buf += sprintf(buf, " %.20s", thd->user);
|
||||
}
|
||||
|
||||
if (thd->proc_info) {
|
||||
buf += sprintf(buf, " %.50s", thd->proc_info);
|
||||
}
|
||||
|
||||
if (thd->query) {
|
||||
buf += sprintf(buf, "\n%.150s", thd->query);
|
||||
}
|
||||
|
||||
buf += sprintf(buf, "\n");
|
||||
|
||||
#ifdef notdefined
|
||||
/* August 8, 2002
|
||||
Revert these changes because they make control characters sometimes
|
||||
appear in the output and scramble it:
|
||||
the reason is that the last character of the ouptput will be
|
||||
'\n', not the null character '\0'. We do not know where the output
|
||||
ends in buf!
|
||||
|
||||
On platforms (what are those?) where sprintf does not work
|
||||
we should define sprintf as 'my_emulated_sprintf'; InnoDB code
|
||||
contains lots of sprintfs, it does not help to remove them from
|
||||
just a single file. */
|
||||
|
||||
/* We can't use value of sprintf() as this is not portable */
|
||||
buf+= my_sprintf(buf,
|
||||
(buf, "MySQL thread id %lu",
|
||||
|
@ -337,9 +300,8 @@ innobase_mysql_print_thd(
|
|||
*buf++='\n';
|
||||
buf=strnmov(buf, thd->query, 150);
|
||||
}
|
||||
*buf='\n';
|
||||
/* Here we should add '\0' to the end of output to mark its end */
|
||||
#endif
|
||||
buf[0]='\n';
|
||||
buf[1]=0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -494,12 +494,7 @@ Item_func_if::fix_length_and_dec()
|
|||
decimals=max(args[1]->decimals,args[2]->decimals);
|
||||
enum Item_result arg1_type=args[1]->result_type();
|
||||
enum Item_result arg2_type=args[2]->result_type();
|
||||
bool null1=args[1]->null_value;
|
||||
bool null2=args[2]->null_value;
|
||||
if (null1 && !null2)
|
||||
arg1_type=arg2_type;
|
||||
else if (!null1 && null2)
|
||||
arg2_type=arg1_type;
|
||||
|
||||
binary=1;
|
||||
if (arg1_type == STRING_RESULT || arg2_type == STRING_RESULT)
|
||||
{
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ)
|
||||
#define HAVE_CLOSE_SERVER_SOCK 1
|
||||
void close_server_sock();
|
||||
#else
|
||||
#define close_server_sock()
|
||||
#endif
|
||||
|
||||
extern "C" { // Because of SCO 3.2V4.2
|
||||
|
@ -465,9 +467,7 @@ static void close_connections(void)
|
|||
if (error != 0 && !count++)
|
||||
sql_print_error("Got error %d from pthread_cond_timedwait",error);
|
||||
#endif
|
||||
#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ)
|
||||
close_server_sock();
|
||||
#endif
|
||||
}
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
#endif /* __WIN__ */
|
||||
|
@ -598,18 +598,26 @@ if (hPipe != INVALID_HANDLE_VALUE && opt_enable_named_pipe)
|
|||
void close_server_sock()
|
||||
{
|
||||
DBUG_ENTER("close_server_sock");
|
||||
|
||||
if (ip_sock != INVALID_SOCKET)
|
||||
{
|
||||
DBUG_PRINT("info",("closing TCP/IP socket"));
|
||||
DBUG_PRINT("info",("calling shutdown on TCP/IP socket"));
|
||||
VOID(shutdown(ip_sock,2));
|
||||
#ifdef NOT_USED
|
||||
/*
|
||||
The following code is disabled as it cases MySQL to hang on
|
||||
AIX 4.3 during shutdown
|
||||
*/
|
||||
DBUG_PRINT("info",("calling closesocket on TCP/IP socket"));
|
||||
VOID(closesocket(ip_sock));
|
||||
#endif
|
||||
ip_sock=INVALID_SOCKET;
|
||||
}
|
||||
if (unix_sock != INVALID_SOCKET)
|
||||
{
|
||||
DBUG_PRINT("info",("closing Unix socket"));
|
||||
DBUG_PRINT("info",("calling shutdown on unix socket"));
|
||||
VOID(shutdown(unix_sock,2));
|
||||
VOID(closesocket(unix_sock));
|
||||
DBUG_PRINT("info",("calling closesocket on unix socket"));
|
||||
VOID(unlink(mysql_unix_port));
|
||||
unix_sock=INVALID_SOCKET;
|
||||
}
|
||||
|
@ -621,7 +629,8 @@ void kill_mysql(void)
|
|||
{
|
||||
DBUG_ENTER("kill_mysql");
|
||||
#ifdef SIGNALS_DONT_BREAK_READ
|
||||
close_server_sock(); /* force accept to wake up */
|
||||
abort_loop=1; // Break connection loops
|
||||
close_server_sock(); // Force accept to wake up
|
||||
#endif
|
||||
#if defined(__WIN__)
|
||||
{
|
||||
|
@ -647,10 +656,9 @@ void kill_mysql(void)
|
|||
DBUG_PRINT("quit",("After pthread_kill"));
|
||||
shutdown_in_progress=1; // Safety if kill didn't work
|
||||
#ifdef SIGNALS_DONT_BREAK_READ
|
||||
if (!abort_loop)
|
||||
if (!kill_in_progress)
|
||||
{
|
||||
pthread_t tmp;
|
||||
abort_loop=1;
|
||||
if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
|
||||
(void*) 0))
|
||||
sql_print_error("Error: Can't create thread to kill server");
|
||||
|
@ -1220,7 +1228,7 @@ static void sig_reload(int signo)
|
|||
|
||||
static void sig_kill(int signo)
|
||||
{
|
||||
if (!abort_loop)
|
||||
if (!kill_in_progress)
|
||||
{
|
||||
abort_loop=1; // mark abort for threads
|
||||
kill_server((void*) signo);
|
||||
|
|
Loading…
Reference in a new issue