mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03: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. Docs/manual.texi: Changelog include/global.h: Fix for BIGINT problem on AIX include/my_no_pthread.h: Fixed typo libmysql/Makefile.shared: Fix for BIGINT problem on AIX mysql-test/mysql-test-run.sh: Fix to find xterm on AIX 4.3 mysql-test/r/bigint.result: Fix for BIGINT problem on AIX mysql-test/r/func_if.result: Change results for IF() after reverting change. mysql-test/t/bigint.test: Fix for BIGINT problem on AIX mysys/Makefile.am: Fix for BIGINT problem on AIX mysys/my_gethostbyname.c: Cleanup mysys/my_init.c: Cleanup mysys/my_net.c: Cleanup mysys/my_os2cond.c: Space & CRLF cleanup mysys/my_os2dirsrch.c: Space & CRLF cleanup mysys/my_os2dirsrch.h: Space & CRLF cleanup mysys/my_os2dlfcn.c: Space & CRLF cleanup mysys/my_os2file64.c: Space & CRLF cleanup mysys/my_os2mutex.c: Space & CRLF cleanup mysys/my_os2thread.c: Space & CRLF cleanup mysys/my_os2tls.c: Space & CRLF cleanup mysys/mysys_priv.h: cleanup mysys/thr_rwlock.c: cleanup sql/ha_innobase.cc: Removed usage of sprintf() Fixed missing end \0 which caused control characters to appear in SHOW INNODB STATUS sql/item_cmpfunc.cc: Reverted change for IF() sql/mysqld.cc: Fix for shutdown on AIX
This commit is contained in:
@ -46928,9 +46928,10 @@ not yet 100% confident in this code.
|
|||||||
@appendixsubsec Changes in release 3.23.52
|
@appendixsubsec Changes in release 3.23.52
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
Changed behaviour that @code{IF(condition,column,NULL)} returns column type
|
Fixed problem with @code{UNSIGNED BIGINT} on AIX.
|
||||||
@item
|
@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
|
@item
|
||||||
Changed initialisation of @code{RND()} to make it less predicatable.
|
Changed initialisation of @code{RND()} to make it less predicatable.
|
||||||
@item
|
@item
|
||||||
|
@ -104,6 +104,8 @@
|
|||||||
#define _H_STRINGS
|
#define _H_STRINGS
|
||||||
#define _SYS_STREAM_H
|
#define _SYS_STREAM_H
|
||||||
#define _AIX32_CURSES
|
#define _AIX32_CURSES
|
||||||
|
#define longlong2double(A) my_longlong2double(A)
|
||||||
|
double my_longlong2double(unsigned long long A);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_BROKEN_SNPRINTF /* HPUX 10.20 don't have this defined */
|
#ifdef HAVE_BROKEN_SNPRINTF /* HPUX 10.20 don't have this defined */
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
environment, easier to use.
|
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 _my_no_pthread_h
|
||||||
|
|
||||||
#define pthread_mutex_init(A,B)
|
#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 \
|
thr_mutex.lo mulalloc.lo string.lo default.lo \
|
||||||
my_compress.lo array.lo my_once.lo list.lo my_net.lo \
|
my_compress.lo array.lo my_once.lo list.lo my_net.lo \
|
||||||
charset.lo hash.lo mf_iocache.lo my_seek.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
|
# Not needed in the minimum library
|
||||||
mysysobjects2 = getopt.lo getopt1.lo getvar.lo my_lib.lo
|
mysysobjects2 = getopt.lo getopt1.lo getvar.lo my_lib.lo
|
||||||
mysysobjects = $(mysysobjects1) $(mysysobjects2)
|
mysysobjects = $(mysysobjects1) $(mysysobjects2)
|
||||||
|
@ -18,7 +18,7 @@ TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work
|
|||||||
# Program Definitions
|
# 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
|
# Standard functions
|
||||||
|
|
||||||
|
@ -10,4 +10,6 @@ a
|
|||||||
a
|
a
|
||||||
18446744073709551615
|
18446744073709551615
|
||||||
a
|
a
|
||||||
|
18446744073709551615
|
||||||
|
a
|
||||||
18446744073709551614
|
18446744073709551614
|
||||||
|
@ -34,4 +34,4 @@ aaa
|
|||||||
sum(if(num is null,0.00,num))
|
sum(if(num is null,0.00,num))
|
||||||
144.54
|
144.54
|
||||||
min(if(y -x > 5,y,NULL)) max(if(y - x > 5,y,NULL))
|
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 9223372036854775807,-009223372036854775808;
|
||||||
select +9999999999999999999,-9999999999999999999;
|
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;
|
drop table if exists t1;
|
||||||
create table t1 (a bigint unsigned not null, primary key(a));
|
create table t1 (a bigint unsigned not null, primary key(a));
|
||||||
insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE);
|
insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE);
|
||||||
select * from t1;
|
select * from t1;
|
||||||
select * from t1 where a=18446744073709551615;
|
select * from t1 where a=18446744073709551615;
|
||||||
#select * from t1 where a='18446744073709551615';
|
select * from t1 where a='18446744073709551615';
|
||||||
delete from t1 where a=18446744073709551615;
|
delete from t1 where a=18446744073709551615;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table 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 \
|
my_quick.c my_lockmem.c my_static.c \
|
||||||
getopt.c getopt1.c getvar.c my_mkdir.c \
|
getopt.c getopt1.c getvar.c my_mkdir.c \
|
||||||
default.c my_compress.c checksum.c raid.cc raid2.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
|
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 \
|
EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
|
||||||
thr_mutex.c thr_rwlock.c
|
thr_mutex.c thr_rwlock.c
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
/* Thread safe version of gethostbyname_r() */
|
/* Thread safe version of gethostbyname_r() */
|
||||||
|
|
||||||
#include "mysys_priv.h"
|
#include "mysys_priv.h"
|
||||||
#include "my_pthread.h"
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#if !defined(MSDOS) && !defined(__WIN__)
|
#if !defined(MSDOS) && !defined(__WIN__)
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
@ -28,11 +27,6 @@
|
|||||||
/* This file is not needed if my_gethostbyname_r is a macro */
|
/* This file is not needed if my_gethostbyname_r is a macro */
|
||||||
#if !defined(my_gethostbyname_r)
|
#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
|
Emulate SOLARIS style calls, not because it's better, but just to make the
|
||||||
usage of getbostbyname_r simpler.
|
usage of getbostbyname_r simpler.
|
||||||
|
@ -21,9 +21,6 @@
|
|||||||
#include "m_ctype.h"
|
#include "m_ctype.h"
|
||||||
#include <m_string.h>
|
#include <m_string.h>
|
||||||
#include <m_ctype.h>
|
#include <m_ctype.h>
|
||||||
#ifdef THREAD
|
|
||||||
#include <my_pthread.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_GETRUSAGE
|
#ifdef HAVE_GETRUSAGE
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
/* extern int getrusage(int, struct rusage *); */
|
/* extern int getrusage(int, struct rusage *); */
|
||||||
|
@ -34,11 +34,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif /* !defined(MSDOS) && !defined(__WIN__) */
|
#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)
|
void my_inet_ntoa(struct in_addr in, char *buf)
|
||||||
{
|
{
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
@ -32,8 +32,8 @@
|
|||||||
|
|
||||||
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
|
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
|
||||||
{
|
{
|
||||||
APIRET rc = 0;
|
APIRET rc = 0;
|
||||||
HEV event;
|
HEV event;
|
||||||
cond->waiting=0;
|
cond->waiting=0;
|
||||||
/* Warp3 FP29 or Warp4 FP4 or better required */
|
/* Warp3 FP29 or Warp4 FP4 or better required */
|
||||||
rc = DosCreateEventSem( NULL, &cond->semaphore, 0x0800, 0);
|
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)
|
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
int rval;
|
int rval;
|
||||||
|
|
||||||
rval = 0;
|
rval = 0;
|
||||||
cond->waiting++;
|
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,
|
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||||
struct timespec *abstime)
|
struct timespec *abstime)
|
||||||
{
|
{
|
||||||
struct timeb curtime;
|
struct timeb curtime;
|
||||||
int result;
|
int result;
|
||||||
long timeout;
|
long timeout;
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
int rval;
|
int rval;
|
||||||
|
|
||||||
_ftime(&curtime);
|
_ftime(&curtime);
|
||||||
timeout= ((long) (abstime->ts_sec - curtime.time)*1000L +
|
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 pthread_cond_broadcast(pthread_cond_t *cond)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enter a loop to bring all threads off the
|
* Enter a loop to bring all threads off the
|
||||||
* condition queue:
|
* condition queue:
|
||||||
*/
|
*/
|
||||||
i = cond->waiting;
|
i = cond->waiting;
|
||||||
while (i--) rc = DosPostEventSem(cond->semaphore);
|
while (i--) rc = DosPostEventSem(cond->semaphore);
|
||||||
|
|
||||||
@ -176,9 +176,9 @@ struct tm *localtime_r(const time_t *timep,struct tm *tmp)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct tm *res=localtime(timep);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
*tmp= *res;
|
*tmp= *res;
|
||||||
|
@ -26,10 +26,10 @@
|
|||||||
|
|
||||||
long _findfirst( char* path, struct _finddata_t* dos_file)
|
long _findfirst( char* path, struct _finddata_t* dos_file)
|
||||||
{
|
{
|
||||||
HDIR hdir = HDIR_CREATE;
|
HDIR hdir = HDIR_CREATE;
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
FILEFINDBUF3 buf3;
|
FILEFINDBUF3 buf3;
|
||||||
ULONG entries = 1;
|
ULONG entries = 1;
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
printf( "_findfirst path %s\n", path);
|
printf( "_findfirst path %s\n", path);
|
||||||
@ -37,13 +37,13 @@ long _findfirst( char* path, struct _finddata_t* dos_file)
|
|||||||
|
|
||||||
memset( &buf3, 0, sizeof( buf3));
|
memset( &buf3, 0, sizeof( buf3));
|
||||||
rc = DosFindFirst(
|
rc = DosFindFirst(
|
||||||
path, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */
|
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. */
|
&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. */
|
FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */
|
||||||
&buf3, /* Result buffer. */
|
&buf3, /* Result buffer. */
|
||||||
sizeof( buf3), /* The length, in bytes, of pfindbuf. */
|
sizeof( buf3), /* The length, in bytes, of pfindbuf. */
|
||||||
&entries, /* Pointer to the number of entries: */
|
&entries, /* Pointer to the number of entries: */
|
||||||
FIL_STANDARD); /* The level of file information required. */
|
FIL_STANDARD); /* The level of file information required. */
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
printf( "_findfirst rc=%d hdir=%d entries=%d->%s\n", rc, hdir, entries, buf3.achName);
|
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)
|
long _findnext( long hdir, struct _finddata_t* dos_file)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
FILEFINDBUF3 buf3;
|
FILEFINDBUF3 buf3;
|
||||||
ULONG entries = 1;
|
ULONG entries = 1;
|
||||||
|
|
||||||
memset( &buf3, 0, sizeof( buf3));
|
memset( &buf3, 0, sizeof( buf3));
|
||||||
rc = DosFindNext(
|
rc = DosFindNext(
|
||||||
hdir,
|
hdir,
|
||||||
&buf3, /* Result buffer. */
|
&buf3, /* Result buffer. */
|
||||||
sizeof( buf3), /* The length, in bytes, of pfindbuf. */
|
sizeof( buf3), /* The length, in bytes, of pfindbuf. */
|
||||||
&entries); /* Pointer to the number of entries: */
|
&entries); /* Pointer to the number of entries: */
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
printf( "_findnext rc=%d hdir=%d entries=%d->%s\n", rc, hdir, entries, buf3.achName);
|
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)
|
void _findclose( long hdir)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
|
|
||||||
rc = DosFindClose( hdir);
|
rc = DosFindClose( hdir);
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -105,8 +105,8 @@ DIR* opendir( char* path)
|
|||||||
{
|
{
|
||||||
DIR* dir = (DIR*) calloc( 1, sizeof( DIR));
|
DIR* dir = (DIR*) calloc( 1, sizeof( DIR));
|
||||||
char buffer[260];
|
char buffer[260];
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
ULONG entries = 1;
|
ULONG entries = 1;
|
||||||
|
|
||||||
strcpy( buffer, path);
|
strcpy( buffer, path);
|
||||||
strcat( buffer, "*.*");
|
strcat( buffer, "*.*");
|
||||||
@ -118,13 +118,13 @@ DIR* opendir( char* path)
|
|||||||
dir->hdir = HDIR_CREATE;
|
dir->hdir = HDIR_CREATE;
|
||||||
memset( &dir->buf3, 0, sizeof( dir->buf3));
|
memset( &dir->buf3, 0, sizeof( dir->buf3));
|
||||||
rc = DosFindFirst(
|
rc = DosFindFirst(
|
||||||
buffer, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */
|
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. */
|
&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. */
|
FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */
|
||||||
&dir->buf3, /* Result buffer. */
|
&dir->buf3, /* Result buffer. */
|
||||||
sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */
|
sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */
|
||||||
&entries, /* Pointer to the number of entries: */
|
&entries, /* Pointer to the number of entries: */
|
||||||
FIL_STANDARD); /* The level of file information required. */
|
FIL_STANDARD); /* The level of file information required. */
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
printf( "opendir rc=%d hdir=%d entries=%d->%s\n", rc, dir->hdir, entries, dir->buf3.achName);
|
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)
|
struct dirent* readdir( DIR* dir)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
//FILEFINDBUF3 buf3;
|
//FILEFINDBUF3 buf3;
|
||||||
ULONG entries = 1;
|
ULONG entries = 1;
|
||||||
|
|
||||||
if (!dir->buf3.achName[0]) // file not found on previous query
|
if (!dir->buf3.achName[0]) // file not found on previous query
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -151,10 +151,10 @@ struct dirent* readdir( DIR* dir)
|
|||||||
// query next file
|
// query next file
|
||||||
memset( &dir->buf3, 0, sizeof( dir->buf3));
|
memset( &dir->buf3, 0, sizeof( dir->buf3));
|
||||||
rc = DosFindNext(
|
rc = DosFindNext(
|
||||||
dir->hdir,
|
dir->hdir,
|
||||||
&dir->buf3, /* Result buffer. */
|
&dir->buf3, /* Result buffer. */
|
||||||
sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */
|
sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */
|
||||||
&entries); /* Pointer to the number of entries: */
|
&entries); /* Pointer to the number of entries: */
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
printf( "_findnext rc=%d hdir=%d entries=%d->%s\n", rc, dir->hdir, entries, dir->buf3.achName);
|
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)
|
int closedir (DIR *dir)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
|
|
||||||
rc = DosFindClose( dir->hdir);
|
rc = DosFindClose( dir->hdir);
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
|
@ -30,9 +30,9 @@ extern "C" {
|
|||||||
struct _finddata_t
|
struct _finddata_t
|
||||||
{
|
{
|
||||||
unsigned attrib;
|
unsigned attrib;
|
||||||
//unsigned long time_create; /* -1 for FAT file systems */
|
//unsigned long time_create; /* -1 for FAT file systems */
|
||||||
//unsigned long time_access; /* -1 for FAT file systems */
|
//unsigned long time_access; /* -1 for FAT file systems */
|
||||||
//unsigned long time_write;
|
//unsigned long time_write;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
char name[260];
|
char name[260];
|
||||||
//uint16 wr_date;
|
//uint16 wr_date;
|
||||||
@ -42,10 +42,10 @@ struct _finddata_t
|
|||||||
struct dirent
|
struct dirent
|
||||||
{
|
{
|
||||||
//unsigned attrib;
|
//unsigned attrib;
|
||||||
//unsigned long time_create; /* -1 for FAT file systems */
|
//unsigned long time_create; /* -1 for FAT file systems */
|
||||||
//unsigned long time_access; /* -1 for FAT file systems */
|
//unsigned long time_access; /* -1 for FAT file systems */
|
||||||
//unsigned long time_write;
|
//unsigned long time_write;
|
||||||
//unsigned long size;
|
//unsigned long size;
|
||||||
char d_name[260];
|
char d_name[260];
|
||||||
//uint16 wr_date;
|
//uint16 wr_date;
|
||||||
//uint16 wr_time;
|
//uint16 wr_time;
|
||||||
@ -66,9 +66,9 @@ int closedir (DIR *);
|
|||||||
//#define _A_SUBDIR FILE_DIRECTORY
|
//#define _A_SUBDIR FILE_DIRECTORY
|
||||||
//#define _A_RDONLY FILE_READONLY
|
//#define _A_RDONLY FILE_READONLY
|
||||||
|
|
||||||
//long _findfirst( char*, struct _finddata_t*);
|
//long _findfirst( char*, struct _finddata_t*);
|
||||||
//long _findnext( long, struct _finddata_t*);
|
//long _findnext( long, struct _finddata_t*);
|
||||||
//void _findclose( long);
|
//void _findclose( long);
|
||||||
|
|
||||||
#ifdef __cplusplus_00
|
#ifdef __cplusplus_00
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ char* dlerror( void);
|
|||||||
void* dlsym( void* hmod, char* fn);
|
void* dlsym( void* hmod, char* fn);
|
||||||
void dlclose( void* hmod);
|
void dlclose( void* hmod);
|
||||||
|
|
||||||
char fail[ 256];
|
char fail[ 256];
|
||||||
|
|
||||||
void* dlopen( char* path, int flag)
|
void* dlopen( char* path, int flag)
|
||||||
{
|
{
|
||||||
@ -56,7 +56,7 @@ char* dlerror( void)
|
|||||||
void* dlsym( void* hmod, char* fn)
|
void* dlsym( void* hmod, char* fn)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
PFN addr;
|
PFN addr;
|
||||||
|
|
||||||
rc = DosQueryProcAddr( (HMODULE) hmod, 0l, fn, &addr);
|
rc = DosQueryProcAddr( (HMODULE) hmod, 0l, fn, &addr);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -18,11 +18,11 @@
|
|||||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
MA 02111-1307, USA */
|
MA 02111-1307, USA */
|
||||||
|
|
||||||
void _OS2errno( APIRET rc);
|
void _OS2errno( APIRET rc);
|
||||||
longlong _lseek64( int fd, longlong offset, int seektype);
|
longlong _lseek64( int fd, longlong offset, int seektype);
|
||||||
int _lock64( int fd, int locktype, my_off_t start,
|
int _lock64( int fd, int locktype, my_off_t start,
|
||||||
my_off_t length, myf MyFlags);
|
my_off_t length, myf MyFlags);
|
||||||
int _sopen64( const char *name, int oflag, int shflag, int mask);
|
int _sopen64( const char *name, int oflag, int shflag, int mask);
|
||||||
|
|
||||||
//
|
//
|
||||||
// this class is used to define a global c++ variable, that
|
// this class is used to define a global c++ variable, that
|
||||||
@ -34,52 +34,52 @@ class File64bit
|
|||||||
File64bit(); /* default constructor */
|
File64bit(); /* default constructor */
|
||||||
} initFile64bit;
|
} initFile64bit;
|
||||||
|
|
||||||
static APIRET (* APIENTRY _DosOpenL)(PCSZ pszFileName,
|
static APIRET (* APIENTRY _DosOpenL)(PCSZ pszFileName,
|
||||||
PHFILE phf,
|
PHFILE phf,
|
||||||
PULONG pulAction,
|
PULONG pulAction,
|
||||||
LONGLONG cbFile,
|
LONGLONG cbFile,
|
||||||
ULONG ulAttribute,
|
ULONG ulAttribute,
|
||||||
ULONG fsOpenFlags,
|
ULONG fsOpenFlags,
|
||||||
ULONG fsOpenMode,
|
ULONG fsOpenMode,
|
||||||
PEAOP2 peaop2);
|
PEAOP2 peaop2);
|
||||||
static APIRET (* APIENTRY _DosSetFilePtrL)(HFILE hFile,
|
static APIRET (* APIENTRY _DosSetFilePtrL)(HFILE hFile,
|
||||||
LONGLONG ib,
|
LONGLONG ib,
|
||||||
ULONG method,
|
ULONG method,
|
||||||
PLONGLONG ibActual);
|
PLONGLONG ibActual);
|
||||||
static APIRET (* APIENTRY _DosSetFileLocksL)(HFILE hFile,
|
static APIRET (* APIENTRY _DosSetFileLocksL)(HFILE hFile,
|
||||||
PFILELOCKL pflUnlock,
|
PFILELOCKL pflUnlock,
|
||||||
PFILELOCKL pflLock,
|
PFILELOCKL pflLock,
|
||||||
ULONG timeout,
|
ULONG timeout,
|
||||||
ULONG flags);
|
ULONG flags);
|
||||||
|
|
||||||
#define EIO EINVAL
|
#define EIO EINVAL
|
||||||
#define ESPIPE EBADSEEK
|
#define ESPIPE EBADSEEK
|
||||||
|
|
||||||
|
|
||||||
static unsigned char const errno_tab[] =
|
static unsigned char const errno_tab[] =
|
||||||
{
|
{
|
||||||
0 , EINVAL, ENOENT, ENOENT, EMFILE, /* 0..4 */
|
0 , EINVAL, ENOENT, ENOENT, EMFILE, /* 0..4 */
|
||||||
EACCES, EBADF, EIO, ENOMEM, EIO, /* 5..9 */
|
EACCES, EBADF, EIO, ENOMEM, EIO, /* 5..9 */
|
||||||
EINVAL, ENOEXEC,EINVAL, EINVAL, EINVAL, /* 10..14 */
|
EINVAL, ENOEXEC,EINVAL, EINVAL, EINVAL, /* 10..14 */
|
||||||
ENOENT, EBUSY, EXDEV, ENOENT, EROFS, /* 15..19 */
|
ENOENT, EBUSY, EXDEV, ENOENT, EROFS, /* 15..19 */
|
||||||
EIO, EIO, EIO, EIO, EIO, /* 20..24 */
|
EIO, EIO, EIO, EIO, EIO, /* 20..24 */
|
||||||
EIO, EIO, EIO, ENOSPC, EIO, /* 25..29 */
|
EIO, EIO, EIO, ENOSPC, EIO, /* 25..29 */
|
||||||
EIO, EIO, EACCES, EACCES, EIO, /* 30..34 */
|
EIO, EIO, EACCES, EACCES, EIO, /* 30..34 */
|
||||||
EIO, EIO, EIO, EIO, ENOSPC, /* 35..39 */
|
EIO, EIO, EIO, EIO, ENOSPC, /* 35..39 */
|
||||||
EIO, EIO, EIO, EIO, EIO, /* 40..44 */
|
EIO, EIO, EIO, EIO, EIO, /* 40..44 */
|
||||||
EIO, EIO, EIO, EIO, EIO, /* 45..49 */
|
EIO, EIO, EIO, EIO, EIO, /* 45..49 */
|
||||||
EIO, EIO, EIO, EIO, EBUSY, /* 50..54 */
|
EIO, EIO, EIO, EIO, EBUSY, /* 50..54 */
|
||||||
EIO, EIO, EIO, EIO, EIO, /* 55..59 */
|
EIO, EIO, EIO, EIO, EIO, /* 55..59 */
|
||||||
EIO, ENOSPC, ENOSPC, EIO, EIO, /* 60..64 */
|
EIO, ENOSPC, ENOSPC, EIO, EIO, /* 60..64 */
|
||||||
EACCES, EIO, EIO, EIO, EIO, /* 65..69 */
|
EACCES, EIO, EIO, EIO, EIO, /* 65..69 */
|
||||||
EIO, EIO, EIO, EROFS, EIO, /* 70..74 */
|
EIO, EIO, EIO, EROFS, EIO, /* 70..74 */
|
||||||
EIO, EIO, EIO, EIO, EIO, /* 75..79 */
|
EIO, EIO, EIO, EIO, EIO, /* 75..79 */
|
||||||
EEXIST, EIO, ENOENT, EIO, EIO, /* 80..84 */
|
EEXIST, EIO, ENOENT, EIO, EIO, /* 80..84 */
|
||||||
EIO, EIO, EINVAL, EIO, EAGAIN, /* 85..89 */
|
EIO, EIO, EINVAL, EIO, EAGAIN, /* 85..89 */
|
||||||
EIO, EIO, EIO, EIO, EIO, /* 90..94 */
|
EIO, EIO, EIO, EIO, EIO, /* 90..94 */
|
||||||
EINTR, EIO, EIO, EIO, EACCES, /* 95..99 */
|
EINTR, EIO, EIO, EIO, EACCES, /* 95..99 */
|
||||||
ENOMEM, EINVAL, EINVAL, ENOMEM, EINVAL, /* 100..104 */
|
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 */
|
ENOENT, E2BIG, ENOSPC, ENOMEM, EBADF, /* 110..114 */
|
||||||
EINVAL, EINVAL, EINVAL, EINVAL, EINVAL, /* 115..119 */
|
EINVAL, EINVAL, EINVAL, EINVAL, EINVAL, /* 115..119 */
|
||||||
EINVAL, EINVAL, EINVAL, ENOENT, EINVAL, /* 120..124 */
|
EINVAL, EINVAL, EINVAL, ENOENT, EINVAL, /* 120..124 */
|
||||||
@ -121,16 +121,16 @@ static unsigned char const errno_tab[] =
|
|||||||
EINVAL, EBUSY, EINVAL, ESRCH, EINVAL, /* 300..304 */
|
EINVAL, EBUSY, EINVAL, ESRCH, EINVAL, /* 300..304 */
|
||||||
ESRCH, EINVAL, EINVAL, EINVAL, ESRCH, /* 305..309 */
|
ESRCH, EINVAL, EINVAL, EINVAL, ESRCH, /* 305..309 */
|
||||||
EINVAL, ENOMEM, EINVAL, EINVAL, EINVAL, /* 310..314 */
|
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, 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 */
|
EACCES, EACCES, EACCES, ENOENT, ENOMEM /* 330..334 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize 64bit file access: dynamic load of WSeB API
|
* Initialize 64bit file access: dynamic load of WSeB API
|
||||||
*/
|
*/
|
||||||
File64bit :: File64bit()
|
File64bit :: File64bit()
|
||||||
{
|
{
|
||||||
HMODULE hDoscalls;
|
HMODULE hDoscalls;
|
||||||
|
|
||||||
@ -156,7 +156,7 @@ static unsigned char const errno_tab[] =
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void _OS2errno( APIRET rc)
|
void _OS2errno( APIRET rc)
|
||||||
{
|
{
|
||||||
if (rc >= sizeof (errno_tab))
|
if (rc >= sizeof (errno_tab))
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
@ -187,10 +187,10 @@ longlong _lseek64( int fd, longlong offset, int seektype)
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline _SetFileLocksL(HFILE hFile,
|
inline _SetFileLocksL(HFILE hFile,
|
||||||
PFILELOCKL pflUnlock,
|
PFILELOCKL pflUnlock,
|
||||||
PFILELOCKL pflLock,
|
PFILELOCKL pflLock,
|
||||||
ULONG timeout,
|
ULONG timeout,
|
||||||
ULONG flags)
|
ULONG flags)
|
||||||
{
|
{
|
||||||
if (_DosSetFileLocksL) {
|
if (_DosSetFileLocksL) {
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
@ -199,7 +199,7 @@ inline _SetFileLocksL(HFILE hFile,
|
|||||||
// 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.
|
// only JFS can handle >2GB ranges.
|
||||||
if (rc != 87)
|
if (rc != 87)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
// got INVALID_PARAMETER, fallback to standard call
|
// got INVALID_PARAMETER, fallback to standard call
|
||||||
}
|
}
|
||||||
@ -209,8 +209,8 @@ inline _SetFileLocksL(HFILE hFile,
|
|||||||
return DosSetFileLocks( hFile, &flUnlock, &flLock, timeout, flags);
|
return DosSetFileLocks( hFile, &flUnlock, &flLock, timeout, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
int _lock64( int fd, int locktype, my_off_t start,
|
int _lock64( int fd, int locktype, my_off_t start,
|
||||||
my_off_t length, myf MyFlags)
|
my_off_t length, myf MyFlags)
|
||||||
{
|
{
|
||||||
FILELOCKL LockArea = {0,0}, UnlockArea = {0,0};
|
FILELOCKL LockArea = {0,0}, UnlockArea = {0,0};
|
||||||
ULONG readonly = 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);
|
//printf( "fd %d, locktype %d, rc %d (dont_wait)\n", fd, locktype, rc);
|
||||||
if (rc == 33) { /* Lock Violation */
|
if (rc == 33) { /* Lock Violation */
|
||||||
|
|
||||||
DBUG_PRINT("info",("Was locked, trying with timeout"));
|
DBUG_PRINT("info",("Was locked, trying with timeout"));
|
||||||
rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 1 * 1000, readonly);
|
rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 1 * 1000, readonly);
|
||||||
//printf( "fd %d, locktype %d, rc %d (dont_wait with timeout)\n", fd, locktype, rc);
|
//printf( "fd %d, locktype %d, rc %d (dont_wait with timeout)\n", fd, locktype, rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
while( rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 0, readonly) && (rc == 33)) {
|
while( rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 0, readonly) && (rc == 33)) {
|
||||||
printf(".");
|
printf(".");
|
||||||
DosSleep(1 * 1000);
|
DosSleep(1 * 1000);
|
||||||
}
|
}
|
||||||
//printf( "fd %d, locktype %d, rc %d (wait2)\n", fd, locktype, rc);
|
//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);
|
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;
|
APIRET rc = 0;
|
||||||
HFILE hf = 0;
|
HFILE hf = 0;
|
||||||
ULONG ulAction = 0;
|
ULONG ulAction = 0;
|
||||||
@ -289,18 +289,18 @@ int sopen( const char *name, int oflag, int shflag, int mask)
|
|||||||
{
|
{
|
||||||
if (oflag & O_EXCL)
|
if (oflag & O_EXCL)
|
||||||
{
|
{
|
||||||
fsOpenFlags = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
|
fsOpenFlags = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
|
||||||
fail_errno = EEXIST;
|
fail_errno = EEXIST;
|
||||||
}
|
}
|
||||||
else if (oflag & O_TRUNC)
|
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
|
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)
|
if (mask & S_IWRITE)
|
||||||
ulAttribute = FILE_NORMAL;
|
ulAttribute = FILE_NORMAL;
|
||||||
else
|
else
|
||||||
ulAttribute = FILE_READONLY;
|
ulAttribute = FILE_READONLY;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (oflag & O_TRUNC)
|
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. */
|
/* Try to open the file and handle errors. */
|
||||||
if (_DosOpenL)
|
if (_DosOpenL)
|
||||||
rc = _DosOpenL( name, &hf, &ulAction, cbFile,
|
rc = _DosOpenL( name, &hf, &ulAction, cbFile,
|
||||||
ulAttribute, fsOpenFlags, fsOpenMode, NULL);
|
ulAttribute, fsOpenFlags, fsOpenMode, NULL);
|
||||||
else
|
else
|
||||||
rc = DosOpen( name, &hf, &ulAction, (LONG) cbFile,
|
rc = DosOpen( name, &hf, &ulAction, (LONG) cbFile,
|
||||||
ulAttribute, fsOpenFlags, fsOpenMode, NULL);
|
ulAttribute, fsOpenFlags, fsOpenMode, NULL);
|
||||||
|
|
||||||
if (rc == ERROR_OPEN_FAILED)
|
if (rc == ERROR_OPEN_FAILED)
|
||||||
{
|
{
|
||||||
@ -334,7 +334,7 @@ int sopen( const char *name, int oflag, int shflag, int mask)
|
|||||||
return hf;
|
return hf;
|
||||||
}
|
}
|
||||||
|
|
||||||
int read( int fd, void *buffer, unsigned int count)
|
int read( int fd, void *buffer, unsigned int count)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
ULONG actual;
|
ULONG actual;
|
||||||
@ -350,7 +350,7 @@ int read( int fd, void *buffer, unsigned int count)
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int write( int fd, const void *buffer, unsigned int count)
|
int write( int fd, const void *buffer, unsigned int count)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
ULONG actual;
|
ULONG actual;
|
||||||
@ -366,7 +366,7 @@ int write( int fd, const void *buffer, unsigned int count)
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int close( int fd)
|
int close( int fd)
|
||||||
{
|
{
|
||||||
APIRET rc;
|
APIRET rc;
|
||||||
ULONG actual;
|
ULONG actual;
|
||||||
|
@ -72,8 +72,8 @@ pthread_mutex_destroy(pthread_mutex_t * mutex)
|
|||||||
int
|
int
|
||||||
pthread_mutex_lock(pthread_mutex_t * mutex)
|
pthread_mutex_lock(pthread_mutex_t * mutex)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
APIRET rc = 0;
|
APIRET rc = 0;
|
||||||
|
|
||||||
rc = DosRequestMutexSem(*mutex,SEM_INDEFINITE_WAIT);
|
rc = DosRequestMutexSem(*mutex,SEM_INDEFINITE_WAIT);
|
||||||
@ -86,9 +86,9 @@ pthread_mutex_lock(pthread_mutex_t * mutex)
|
|||||||
int
|
int
|
||||||
pthread_mutex_unlock(pthread_mutex_t * mutex)
|
pthread_mutex_unlock(pthread_mutex_t * mutex)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
APIRET rc = 0;
|
APIRET rc = 0;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
rc = DosReleaseMutexSem(*mutex);
|
rc = DosReleaseMutexSem(*mutex);
|
||||||
|
|
||||||
|
@ -31,9 +31,9 @@ static pthread_mutex_t THR_LOCK_thread;
|
|||||||
|
|
||||||
struct pthread_map
|
struct pthread_map
|
||||||
{
|
{
|
||||||
HANDLE pthreadself;
|
HANDLE pthreadself;
|
||||||
pthread_handler func;
|
pthread_handler func;
|
||||||
void * param;
|
void * param;
|
||||||
};
|
};
|
||||||
|
|
||||||
void win_pthread_init(void)
|
void win_pthread_init(void)
|
||||||
@ -57,7 +57,7 @@ static pthread_handler_decl(pthread_start,param)
|
|||||||
pthread_handler func=((struct pthread_map *) param)->func;
|
pthread_handler func=((struct pthread_map *) param)->func;
|
||||||
void *func_param=((struct pthread_map *) param)->param;
|
void *func_param=((struct pthread_map *) param)->param;
|
||||||
my_thread_init(); /* Will always succeed in windows */
|
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;
|
win_pthread_self=((struct pthread_map *) param)->pthreadself;
|
||||||
pthread_mutex_unlock(&THR_LOCK_thread);
|
pthread_mutex_unlock(&THR_LOCK_thread);
|
||||||
free((char*) param); /* Free param from create */
|
free((char*) param); /* Free param from create */
|
||||||
|
@ -18,23 +18,23 @@
|
|||||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
MA 02111-1307, USA */
|
MA 02111-1307, USA */
|
||||||
|
|
||||||
DWORD TlsAlloc( void);
|
DWORD TlsAlloc( void);
|
||||||
BOOL TlsFree( DWORD);
|
BOOL TlsFree( DWORD);
|
||||||
PVOID TlsGetValue( DWORD);
|
PVOID TlsGetValue( DWORD);
|
||||||
BOOL TlsSetValue( DWORD, PVOID);
|
BOOL TlsSetValue( DWORD, PVOID);
|
||||||
|
|
||||||
#define TLS_MINIMUM_AVAILABLE 64
|
#define TLS_MINIMUM_AVAILABLE 64
|
||||||
|
|
||||||
|
|
||||||
PULONG tls_storage; /* TLS local storage */
|
PULONG tls_storage; /* TLS local storage */
|
||||||
DWORD tls_bits[2]; /* TLS in-use bits */
|
DWORD tls_bits[2]; /* TLS in-use bits */
|
||||||
pthread_mutex_t tls_mutex; /* TLS mutex for in-use bits */
|
pthread_mutex_t tls_mutex; /* TLS mutex for in-use bits */
|
||||||
|
|
||||||
DWORD TlsAlloc( void)
|
DWORD TlsAlloc( void)
|
||||||
{
|
{
|
||||||
DWORD index = -1;
|
DWORD index = -1;
|
||||||
DWORD mask, tibidx;
|
DWORD mask, tibidx;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (tls_storage == NULL) {
|
if (tls_storage == NULL) {
|
||||||
|
|
||||||
@ -43,12 +43,12 @@ DWORD TlsAlloc( void)
|
|||||||
// allocate memory for TLS storage
|
// allocate memory for TLS storage
|
||||||
rc = DosAllocThreadLocalMemory( 1, &tls_storage);
|
rc = DosAllocThreadLocalMemory( 1, &tls_storage);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
fprintf( stderr, "DosAllocThreadLocalMemory error: return code = %u\n", rc);
|
fprintf( stderr, "DosAllocThreadLocalMemory error: return code = %u\n", rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a mutex
|
// create a mutex
|
||||||
if (pthread_mutex_init( &tls_mutex, NULL))
|
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);
|
pthread_mutex_lock( &tls_mutex);
|
||||||
@ -56,18 +56,18 @@ DWORD TlsAlloc( void)
|
|||||||
tibidx = 0;
|
tibidx = 0;
|
||||||
if (tls_bits[0] == 0xFFFFFFFF) {
|
if (tls_bits[0] == 0xFFFFFFFF) {
|
||||||
if (tls_bits[1] == 0xFFFFFFFF) {
|
if (tls_bits[1] == 0xFFFFFFFF) {
|
||||||
fprintf( stderr, "tid#%d, no more TLS bits available\n", _threadid);
|
fprintf( stderr, "tid#%d, no more TLS bits available\n", _threadid);
|
||||||
pthread_mutex_unlock( &tls_mutex);
|
pthread_mutex_unlock( &tls_mutex);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tibidx = 1;
|
tibidx = 1;
|
||||||
}
|
}
|
||||||
for( i=0; i<32; i++) {
|
for( i=0; i<32; i++) {
|
||||||
mask = (1 << i);
|
mask = (1 << i);
|
||||||
if ((tls_bits[ tibidx] & mask) == 0) {
|
if ((tls_bits[ tibidx] & mask) == 0) {
|
||||||
tls_bits[ tibidx] |= mask;
|
tls_bits[ tibidx] |= mask;
|
||||||
index = (tibidx*32) + i;
|
index = (tibidx*32) + i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tls_storage[index] = 0;
|
tls_storage[index] = 0;
|
||||||
@ -79,9 +79,9 @@ DWORD TlsAlloc( void)
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL TlsFree( DWORD index)
|
BOOL TlsFree( DWORD index)
|
||||||
{
|
{
|
||||||
int tlsidx;
|
int tlsidx;
|
||||||
DWORD mask;
|
DWORD mask;
|
||||||
|
|
||||||
if (index >= TLS_MINIMUM_AVAILABLE)
|
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)
|
if (index >= TLS_MINIMUM_AVAILABLE)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -122,7 +122,7 @@ PVOID TlsGetValue( DWORD index)
|
|||||||
return (PVOID) tls_array[ 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
|
// 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
|
#endif
|
||||||
|
|
||||||
#ifdef THREAD
|
#ifdef THREAD
|
||||||
|
#include <my_pthread.h>
|
||||||
extern pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache,
|
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;
|
THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_net,THR_LOCK_charset;
|
||||||
extern pthread_mutex_t LOCK_bitmap;
|
extern pthread_mutex_t LOCK_bitmap;
|
||||||
#else /* THREAD */
|
#else
|
||||||
#define pthread_mutex_lock(A)
|
#include <my_no_pthread.h>
|
||||||
#define pthread_mutex_unlock(A)
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
/* Synchronization - readers / writer thread locks */
|
/* Synchronization - readers / writer thread locks */
|
||||||
|
|
||||||
#include "mysys_priv.h"
|
#include "mysys_priv.h"
|
||||||
#include <my_pthread.h>
|
|
||||||
#if defined(THREAD) && !defined(HAVE_PTHREAD_RWLOCK_RDLOCK) && !defined(HAVE_RWLOCK_INIT)
|
#if defined(THREAD) && !defined(HAVE_PTHREAD_RWLOCK_RDLOCK) && !defined(HAVE_RWLOCK_INIT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -267,43 +267,6 @@ innobase_mysql_print_thd(
|
|||||||
|
|
||||||
thd = (THD*) input_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 */
|
/* We can't use value of sprintf() as this is not portable */
|
||||||
buf+= my_sprintf(buf,
|
buf+= my_sprintf(buf,
|
||||||
(buf, "MySQL thread id %lu",
|
(buf, "MySQL thread id %lu",
|
||||||
@ -337,9 +300,8 @@ innobase_mysql_print_thd(
|
|||||||
*buf++='\n';
|
*buf++='\n';
|
||||||
buf=strnmov(buf, thd->query, 150);
|
buf=strnmov(buf, thd->query, 150);
|
||||||
}
|
}
|
||||||
*buf='\n';
|
buf[0]='\n';
|
||||||
/* Here we should add '\0' to the end of output to mark its end */
|
buf[1]=0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,12 +494,7 @@ Item_func_if::fix_length_and_dec()
|
|||||||
decimals=max(args[1]->decimals,args[2]->decimals);
|
decimals=max(args[1]->decimals,args[2]->decimals);
|
||||||
enum Item_result arg1_type=args[1]->result_type();
|
enum Item_result arg1_type=args[1]->result_type();
|
||||||
enum Item_result arg2_type=args[2]->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;
|
binary=1;
|
||||||
if (arg1_type == STRING_RESULT || arg2_type == STRING_RESULT)
|
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)
|
#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ)
|
||||||
#define HAVE_CLOSE_SERVER_SOCK 1
|
#define HAVE_CLOSE_SERVER_SOCK 1
|
||||||
void close_server_sock();
|
void close_server_sock();
|
||||||
|
#else
|
||||||
|
#define close_server_sock()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern "C" { // Because of SCO 3.2V4.2
|
extern "C" { // Because of SCO 3.2V4.2
|
||||||
@ -465,9 +467,7 @@ static void close_connections(void)
|
|||||||
if (error != 0 && !count++)
|
if (error != 0 && !count++)
|
||||||
sql_print_error("Got error %d from pthread_cond_timedwait",error);
|
sql_print_error("Got error %d from pthread_cond_timedwait",error);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ)
|
|
||||||
close_server_sock();
|
close_server_sock();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||||
#endif /* __WIN__ */
|
#endif /* __WIN__ */
|
||||||
@ -598,18 +598,26 @@ if (hPipe != INVALID_HANDLE_VALUE && opt_enable_named_pipe)
|
|||||||
void close_server_sock()
|
void close_server_sock()
|
||||||
{
|
{
|
||||||
DBUG_ENTER("close_server_sock");
|
DBUG_ENTER("close_server_sock");
|
||||||
|
|
||||||
if (ip_sock != INVALID_SOCKET)
|
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));
|
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));
|
VOID(closesocket(ip_sock));
|
||||||
|
#endif
|
||||||
ip_sock=INVALID_SOCKET;
|
ip_sock=INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
if (unix_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(shutdown(unix_sock,2));
|
||||||
VOID(closesocket(unix_sock));
|
DBUG_PRINT("info",("calling closesocket on unix socket"));
|
||||||
VOID(unlink(mysql_unix_port));
|
VOID(unlink(mysql_unix_port));
|
||||||
unix_sock=INVALID_SOCKET;
|
unix_sock=INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
@ -621,7 +629,8 @@ void kill_mysql(void)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("kill_mysql");
|
DBUG_ENTER("kill_mysql");
|
||||||
#ifdef SIGNALS_DONT_BREAK_READ
|
#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
|
#endif
|
||||||
#if defined(__WIN__)
|
#if defined(__WIN__)
|
||||||
{
|
{
|
||||||
@ -647,10 +656,9 @@ void kill_mysql(void)
|
|||||||
DBUG_PRINT("quit",("After pthread_kill"));
|
DBUG_PRINT("quit",("After pthread_kill"));
|
||||||
shutdown_in_progress=1; // Safety if kill didn't work
|
shutdown_in_progress=1; // Safety if kill didn't work
|
||||||
#ifdef SIGNALS_DONT_BREAK_READ
|
#ifdef SIGNALS_DONT_BREAK_READ
|
||||||
if (!abort_loop)
|
if (!kill_in_progress)
|
||||||
{
|
{
|
||||||
pthread_t tmp;
|
pthread_t tmp;
|
||||||
abort_loop=1;
|
|
||||||
if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
|
if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
|
||||||
(void*) 0))
|
(void*) 0))
|
||||||
sql_print_error("Error: Can't create thread to kill server");
|
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)
|
static void sig_kill(int signo)
|
||||||
{
|
{
|
||||||
if (!abort_loop)
|
if (!kill_in_progress)
|
||||||
{
|
{
|
||||||
abort_loop=1; // mark abort for threads
|
abort_loop=1; // mark abort for threads
|
||||||
kill_server((void*) signo);
|
kill_server((void*) signo);
|
||||||
|
Reference in New Issue
Block a user