mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
New thr_alarm struct for better integration with OS2
Run bootstrap in separate thread Fix bug in FLUSH TABLES table_name Docs/manual.texi: Updated ChangeLog client/mysql.cc: Added info about compressed protocol include/getopt.h: Fix for OS2 include/global.h: Fix for OS2 include/my_sys.h: Fix for OS2 include/mysql_com.h: Fix for OS2 include/thr_alarm.h: Cleanup up alarm struct for OS2 port isam/isamchk.c: Fix for OS2 libmysql/libmysql.c: cleanup libmysql/net.c: Use new thr_alarm libmysql/violite.c: Fix for OS2 myisam/ChangeLog: Changes myisam/mi_create.c: Use less stack myisam/myisamchk.c: Fix for OS2 mysys/default.c: Fix for OS2 mysys/getopt.c: Fix for OS2 mysys/mf_format.c: Safety mysys/mf_path.c: Fix for OS2 mysys/my_create.c: Fix for OS2 mysys/my_lock.c: Fix for OS2 mysys/my_open.c: Fix for OS2 mysys/thr_alarm.c: Use new thr_alarm struct readline/input.c: Fix for OS2 readline/rltty.c: Fix for OS2 sql/ha_myisam.cc: Remove unnecessary fn_format sql/my_lock.c: Use new thr_alarm sql/mysql_priv.h: Changed bootstrap to run in separate thread to avoid problem with small stack sql/mysqld.cc: Changed bootstrap to run in separate thread to avoid problem with small stack sql/net_serv.cc: Use new thr_alarm sql/sql_base.cc: Fix problem with FLUSH TABLE table_name sql/sql_class.cc: Fix for new bootstrap sql/sql_class.h: cleanup sql/sql_delete.cc: cleanup sql/sql_load.cc: Fix for OS2 sql/sql_parse.cc: Changed bootstrap to run in separate thread to avoid problem with small stack sql/sql_select.cc: Reset used structure elements sql/sql_table.cc: For OS2 sql/violite.c: For OS2
This commit is contained in:
parent
2700d28319
commit
746f0b3b76
38 changed files with 435 additions and 146 deletions
|
@ -17586,7 +17586,7 @@ The options work for all table types, if not otherwise indicated:
|
|||
|
||||
@multitable @columnfractions .20 .80
|
||||
@item @code{AUTO_INCREMENT} @tab The next auto_increment value you want to set for your table (MyISAM).
|
||||
@item @code{AVG_ROW_LENGTH} @tab An approximation of the average row length for your table. You only need to set this for tables with variable size records.
|
||||
@item @code{AVG_ROW_LENGTH} @tab An approximation of the average row length for your table. You only need to set this for large tables with variable size records.
|
||||
@item @code{CHECKSUM} @tab Set this to 1 if you want @strong{MySQL} to maintain a checksum for all rows (makes the table a little slower to update but makes it easier to find corrupted tables) (MyISAM).
|
||||
@item @code{COMMENT} @tab A 60-character comment for your table.
|
||||
@item @code{MAX_ROWS} @tab Max number of rows you plan to store in the table.
|
||||
|
@ -17601,7 +17601,8 @@ When you use a @code{MyISAM} table, @strong{MySQL} uses the product of
|
|||
@code{max_rows * avg_row_length} to decide how big the resulting table
|
||||
will be. If you don't specify any of the above options, the maximum size
|
||||
for a table will be 4G (or 2G if your operating systems only supports 2G
|
||||
tables).
|
||||
tables). The reason for this is just to keep down the pointer sizes
|
||||
to make the index smaller and faster if you don't really need big files.
|
||||
|
||||
If you don't use @code{PACK_KEYS}, the default is to only pack strings,
|
||||
not numbers. If you use @code{PACK_KEYS=1}, numbers will be packed as well.
|
||||
|
@ -38893,6 +38894,16 @@ though, so Version 3.23 is not released as a stable version yet.
|
|||
@appendixsubsec Changes in release 3.23.29
|
||||
@itemize @bullet
|
||||
@item
|
||||
Applied patches for OS2 by @code{Yuri Dario}.
|
||||
@item
|
||||
@code[FLUSH TABLES table_name} didn't always flush table properly to
|
||||
disk; One some cases the index tree wasn't completely written to disk.
|
||||
@item
|
||||
@code{--bootstrap} is now run in a separate thread. This fixes the problem
|
||||
that @code{mysql_install_db} core dumped on some Linux machines.
|
||||
@item
|
||||
Changed @code{mi_create()} to use less stack.
|
||||
@item
|
||||
Changed crash-me and the MySQL benchmarks to also work with FrontBase.
|
||||
@item
|
||||
Allow @code{RESTRICT} and @code{CASCADE} after @code{DROP TABLE} to make
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
#include "my_readline.h"
|
||||
#include <signal.h>
|
||||
|
||||
const char *VER="11.8";
|
||||
|
||||
gptr sql_alloc(unsigned size); // Don't use mysqld alloc for these
|
||||
void sql_element_free(void *ptr);
|
||||
#include "sql_string.h"
|
||||
|
@ -109,8 +111,6 @@ static HashTable ht;
|
|||
enum enum_info_type { INFO_INFO,INFO_ERROR,INFO_RESULT};
|
||||
typedef enum enum_info_type INFO_TYPE;
|
||||
|
||||
const char *VER="11.7";
|
||||
|
||||
static MYSQL mysql; /* The connection */
|
||||
static bool info_flag=0,ignore_errors=0,wait_flag=0,quick=0,
|
||||
connected=0,opt_raw_data=0,unbuffered=0,output_tables=0,
|
||||
|
@ -2156,10 +2156,7 @@ com_status(String *buffer __attribute__((unused)),
|
|||
}
|
||||
#ifndef __WIN__
|
||||
tee_fprintf(stdout, "Current pager:\t\t%s\n", pager);
|
||||
if (opt_outfile)
|
||||
tee_fprintf(stdout, "Using outfile:\t\tYes: '%s'\n", outfile);
|
||||
else
|
||||
printf("Using outfile:\t\tNo\n");
|
||||
tee_fprintf(stdout, "Using outfile:\t\t'%s'\n", opt_outfile ? outfile : "");
|
||||
#endif
|
||||
tee_fprintf(stdout, "Server version:\t\t%s\n", mysql_get_server_info(&mysql));
|
||||
tee_fprintf(stdout, "Protocol version:\t%d\n", mysql_get_proto_info(&mysql));
|
||||
|
@ -2169,6 +2166,9 @@ com_status(String *buffer __attribute__((unused)),
|
|||
tee_fprintf(stdout, "TCP port:\t\t%d\n", mysql.port);
|
||||
else
|
||||
tee_fprintf(stdout, "UNIX socket:\t\t%s\n", mysql.unix_socket);
|
||||
if (mysql.net.compress)
|
||||
tee_fprintf(stdout, "Protocol:\t\tCompressed\n");
|
||||
|
||||
if ((status=mysql_stat(&mysql)) && !mysql_error(&mysql)[0])
|
||||
{
|
||||
char *pos,buff[40];
|
||||
|
|
|
@ -99,7 +99,9 @@ struct option
|
|||
#define optional_argument 2
|
||||
|
||||
#if ( defined (__STDC__) && __STDC__ ) || defined(__cplusplus) || defined(MSDOS)
|
||||
#ifdef __GNU_LIBRARY__
|
||||
#ifdef __EMX__
|
||||
int getopt (int, char **, __const__ char *);
|
||||
#elif defined( __GNU_LIBRARY__)
|
||||
/* Many other libraries have conflicting prototypes for getopt, with
|
||||
differences in the consts, in stdlib.h. To avoid compilation
|
||||
errors, only prototype getopt for the GNU C library. */
|
||||
|
|
|
@ -21,6 +21,13 @@
|
|||
#ifndef _global_h
|
||||
#define _global_h
|
||||
|
||||
#if defined( __EMX__) && !defined( MYSQL_SERVER)
|
||||
// moved here to use below VOID macro redefinition
|
||||
#define INCL_BASE
|
||||
#define INCL_NOPMAPI
|
||||
#include <os2.h>
|
||||
#endif // __EMX__
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32)
|
||||
#include <config-win.h>
|
||||
#else
|
||||
|
@ -381,8 +388,13 @@ typedef SOCKET_SIZE_TYPE size_socket;
|
|||
#define FN_DEVCHAR ':'
|
||||
|
||||
#ifndef FN_LIBCHAR
|
||||
#ifdef __EMX__
|
||||
#define FN_LIBCHAR '\\'
|
||||
#define FN_ROOTDIR "\\"
|
||||
#else
|
||||
#define FN_LIBCHAR '/'
|
||||
#define FN_ROOTDIR "/"
|
||||
#endif
|
||||
#define MY_NFILE 1024 /* This is only used to save filenames */
|
||||
#endif
|
||||
|
||||
|
|
|
@ -41,6 +41,13 @@ extern int NEAR my_errno; /* Last error in mysys */
|
|||
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef __EMX__
|
||||
/* record loging flags (F_GETLK, F_SETLK, F_SETLKW) */
|
||||
#define F_RDLCK 1 /* FreeBSD: shared or read lock */
|
||||
#define F_UNLCK 2 /* FreeBSD: unlock */
|
||||
#define F_WRLCK 3 /* FreeBSD: exclusive or write lock */
|
||||
#endif
|
||||
|
||||
#define MYSYS_PROGRAM_USES_CURSES() { error_handler_hook = my_message_curses; mysys_uses_curses=1; }
|
||||
#define MYSYS_PROGRAM_DONT_USE_CURSES() { error_handler_hook = my_message_no_curses; mysys_uses_curses=0;}
|
||||
#define MY_INIT(name); { my_progname= name; my_init(); }
|
||||
|
|
|
@ -30,11 +30,6 @@
|
|||
#define LOCAL_HOST "localhost"
|
||||
#define LOCAL_HOST_NAMEDPIPE "."
|
||||
|
||||
#if defined(__EMX__) || defined(__OS2__)
|
||||
#undef MYSQL_UNIX_ADDR
|
||||
#define MYSQL_OS2_ADDR "\\socket\\MySQL"
|
||||
#define MYSQL_UNIX_ADDR MYSQL_OS2_ADDR
|
||||
#endif
|
||||
#if defined(__WIN__) && !defined( _CUSTOMCONFIG_)
|
||||
#define MYSQL_NAMEDPIPE "MySQL"
|
||||
#define MYSQL_SERVICENAME "MySql"
|
||||
|
|
|
@ -23,13 +23,6 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct st_alarm {
|
||||
ulong expire_time;
|
||||
int alarmed; /* 1 when alarm is due */
|
||||
pthread_t thread;
|
||||
my_bool malloced;
|
||||
} ALARM;
|
||||
|
||||
#ifndef USE_ALARM_THREAD
|
||||
#define USE_ONE_SIGNAL_HAND /* One must call process_alarm */
|
||||
#endif
|
||||
|
@ -46,55 +39,74 @@ typedef struct st_alarm {
|
|||
#define THR_SERVER_ALARM SIGALRM
|
||||
#endif
|
||||
|
||||
#ifdef DONT_USE_THR_ALARM
|
||||
#if defined(DONT_USE_THR_ALARM)
|
||||
|
||||
#define USE_ALARM_THREAD
|
||||
#undef USE_ONE_SIGNAL_HAND
|
||||
|
||||
typedef struct st_win_timer
|
||||
typedef struct st_thr_alarm_entry
|
||||
{
|
||||
uint crono;
|
||||
} thr_alarm_t;
|
||||
} thr_alarm_entry;
|
||||
|
||||
#define thr_alarm_init(A) (A)->crono=0
|
||||
#define thr_alarm_in_use(A) (A).crono
|
||||
#define init_thr_alarm(A)
|
||||
#define thr_alarm_kill(A)
|
||||
#define end_thr_alarm()
|
||||
#define thr_alarm(A,B) (((A)->crono=1)-1)
|
||||
#define thr_got_alarm(A) (A).crono
|
||||
#define thr_end_alarm(A)
|
||||
|
||||
#else
|
||||
|
||||
#ifdef __WIN__
|
||||
typedef struct st_win_timer
|
||||
{
|
||||
rf_SetTimer crono;
|
||||
} thr_alarm_t;
|
||||
|
||||
bool thr_got_alarm(thr_alarm_t *alrm);
|
||||
#define thr_alarm_init(A) (A)->crono=0
|
||||
#define thr_alarm_in_use(A) (A)->crono
|
||||
#define init_thr_alarm(A)
|
||||
#define thr_alarm_kill(A)
|
||||
#else
|
||||
#define end_thr_alarm()
|
||||
#define thr_alarm(A,B) (((A)->crono=1)-1)
|
||||
#define thr_got_alarm(A) (A)->crono
|
||||
#define thr_end_alarm(A)
|
||||
|
||||
#else
|
||||
#if defined(__WIN__)
|
||||
typedef struct st_thr_alarm_entry
|
||||
{
|
||||
rf_SetTimer crono;
|
||||
} thr_alarm_entry;
|
||||
|
||||
#elif defined(__EMX__)
|
||||
|
||||
typedef struct st_thr_alarm_entry
|
||||
{
|
||||
uint crono;
|
||||
uint event;
|
||||
} thr_alarm_entry;
|
||||
|
||||
#else /* System with posix threads */
|
||||
|
||||
typedef int thr_alarm_entry;
|
||||
|
||||
#define thr_got_alarm(thr_alarm) (**(thr_alarm))
|
||||
|
||||
typedef int* thr_alarm_t;
|
||||
#define thr_got_alarm(thr_alarm) (*thr_alarm)
|
||||
#define thr_alarm_init(A) (*A)=0
|
||||
#define thr_alarm_in_use(A) ((A) != 0)
|
||||
void init_thr_alarm(uint max_alarm);
|
||||
void thr_alarm_kill(pthread_t thread_id);
|
||||
sig_handler process_alarm(int);
|
||||
#endif /* __WIN__ */
|
||||
|
||||
bool thr_alarm(thr_alarm_t *alarmed,uint sec, ALARM *buff);
|
||||
typedef thr_alarm_entry* thr_alarm_t;
|
||||
|
||||
typedef struct st_alarm {
|
||||
ulong expire_time;
|
||||
thr_alarm_entry alarmed; /* set when alarm is due */
|
||||
pthread_t thread;
|
||||
my_bool malloced;
|
||||
} ALARM;
|
||||
|
||||
#define thr_alarm_init(A) (*(A))=0
|
||||
#define thr_alarm_in_use(A) (*(A)!= 0)
|
||||
void init_thr_alarm(uint max_alarm);
|
||||
bool thr_alarm(thr_alarm_t *alarmed, uint sec, ALARM *buff);
|
||||
void thr_alarm_kill(pthread_t thread_id);
|
||||
void thr_end_alarm(thr_alarm_t *alarmed);
|
||||
void end_thr_alarm(void);
|
||||
sig_handler process_alarm(int);
|
||||
#ifndef thr_got_alarm
|
||||
bool thr_got_alarm(thr_alarm_t *alrm);
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* DONT_USE_THR_ALARM */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /* __cplusplus */
|
||||
#endif /* _thr_alarm_h */
|
||||
|
||||
|
|
|
@ -193,6 +193,10 @@ char **argv;
|
|||
int error;
|
||||
MY_INIT(argv[0]);
|
||||
|
||||
#ifdef __EMX__
|
||||
_wildcard (&argc, &argv);
|
||||
#endif
|
||||
|
||||
get_options(&argc,(char***) &argv);
|
||||
nisam_quick_table_bits=(uint) decode_bits;
|
||||
error=0;
|
||||
|
|
|
@ -1465,8 +1465,8 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||
if (db)
|
||||
client_flag|=CLIENT_CONNECT_WITH_DB;
|
||||
#ifdef HAVE_COMPRESS
|
||||
if (mysql->server_capabilities & CLIENT_COMPRESS &&
|
||||
(mysql->options.compress || client_flag & CLIENT_COMPRESS))
|
||||
if ((mysql->server_capabilities & CLIENT_COMPRESS) &&
|
||||
(mysql->options.compress || (client_flag & CLIENT_COMPRESS)))
|
||||
client_flag|=CLIENT_COMPRESS; /* We will use compression */
|
||||
else
|
||||
#endif
|
||||
|
|
|
@ -71,7 +71,7 @@ extern ulong mysqld_net_retry_count;
|
|||
typedef my_bool thr_alarm_t;
|
||||
typedef my_bool ALARM;
|
||||
#define thr_alarm_init(A) (*A)=0
|
||||
#define thr_alarm_in_use(A) (A)
|
||||
#define thr_alarm_in_use(A) (*(A))
|
||||
#define thr_end_alarm(A)
|
||||
#define thr_alarm(A,B,C) local_thr_alarm((A),(B),(C))
|
||||
static inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __attribute__((unused)))
|
||||
|
@ -330,7 +330,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
{
|
||||
my_bool interrupted = vio_should_retry(net->vio);
|
||||
#if (!defined(__WIN__) && !defined(__EMX__))
|
||||
if ((interrupted || length==0) && !thr_alarm_in_use(alarmed))
|
||||
if ((interrupted || length==0) && !thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
if (!thr_alarm(&alarmed,(uint) net_write_timeout,&alarm_buff))
|
||||
{ /* Always true for client */
|
||||
|
@ -355,7 +355,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
}
|
||||
else
|
||||
#endif /* (!defined(__WIN__) && !defined(__EMX__)) */
|
||||
if (thr_alarm_in_use(alarmed) && !thr_got_alarm(alarmed) &&
|
||||
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
|
||||
interrupted)
|
||||
{
|
||||
if (retry_count++ < RETRY_COUNT)
|
||||
|
@ -389,7 +389,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
if (net->compress)
|
||||
my_free((char*) packet,MYF(0));
|
||||
#endif
|
||||
if (thr_alarm_in_use(alarmed))
|
||||
if (thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
thr_end_alarm(&alarmed);
|
||||
vio_blocking(net->vio, net_blocking);
|
||||
|
@ -412,10 +412,9 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
|
||||
static void my_net_skip_rest(NET *net, ulong remain, thr_alarm_t *alarmed)
|
||||
{
|
||||
char buff[1024];
|
||||
ALARM alarm_buff;
|
||||
uint retry_count=0;
|
||||
if (!thr_alarm_in_use(alarmed))
|
||||
if (!thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
if (!thr_alarm(alarmed,net->timeout,&alarm_buff) ||
|
||||
(!vio_is_blocking(net->vio) && vio_blocking(net->vio,TRUE) < 0))
|
||||
|
@ -427,7 +426,7 @@ static void my_net_skip_rest(NET *net, ulong remain, thr_alarm_t *alarmed)
|
|||
if ((int) (length=vio_read(net->vio,(char*) net->buff,remain)) <= 0L)
|
||||
{
|
||||
my_bool interrupted = vio_should_retry(net->vio);
|
||||
if (!thr_got_alarm(alarmed) && interrupted)
|
||||
if (!thr_got_alarm(&alarmed) && interrupted)
|
||||
{ /* Probably in MIT threads */
|
||||
if (retry_count++ < RETRY_COUNT)
|
||||
continue;
|
||||
|
@ -482,7 +481,7 @@ my_real_read(NET *net, ulong *complen)
|
|||
an alarm to not 'read forever', change the socket to non blocking
|
||||
mode and try again
|
||||
*/
|
||||
if ((interrupted || length == 0) && !thr_alarm_in_use(alarmed))
|
||||
if ((interrupted || length == 0) && !thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
if (!thr_alarm(&alarmed,net->timeout,&alarm_buff)) /* Don't wait too long */
|
||||
{
|
||||
|
@ -514,7 +513,7 @@ my_real_read(NET *net, ulong *complen)
|
|||
}
|
||||
}
|
||||
#endif /* (!defined(__WIN__) && !defined(__EMX__)) || defined(MYSQL_SERVER) */
|
||||
if (thr_alarm_in_use(alarmed) && !thr_got_alarm(alarmed) &&
|
||||
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
|
||||
interrupted)
|
||||
{ /* Probably in MIT threads */
|
||||
if (retry_count++ < RETRY_COUNT)
|
||||
|
@ -598,7 +597,7 @@ my_real_read(NET *net, ulong *complen)
|
|||
}
|
||||
|
||||
end:
|
||||
if (thr_alarm_in_use(alarmed))
|
||||
if (thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
thr_end_alarm(&alarmed);
|
||||
vio_blocking(net->vio, net_blocking);
|
||||
|
|
|
@ -38,8 +38,7 @@
|
|||
|
||||
#if defined(__EMX__)
|
||||
#include <sys/ioctl.h>
|
||||
#define ioctlsocket(A,B,C) ioctl((A),(B),(void *)(C),sizeof(*(C)))
|
||||
#undef HAVE_FCNTL
|
||||
#define ioctlsocket ioctl
|
||||
#endif /* defined(__EMX__) */
|
||||
|
||||
#if defined(MSDOS) || defined(__WIN__)
|
||||
|
@ -111,7 +110,7 @@ Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
|
|||
#else /* !defined(__WIN__) && !defined(__EMX__) */
|
||||
{
|
||||
/* set to blocking mode by default */
|
||||
ulong arg=0;
|
||||
ulong arg=0, r;
|
||||
r = ioctlsocket(vio->sd,FIONBIO,(void*) &arg, sizeof(arg));
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2000-11-27 Michael Widenius <monty@mysql.com>
|
||||
|
||||
* Changed mi_create.c to use less stack.
|
||||
|
||||
2000-08-23 Michael Widenius <monty@mysql.com>
|
||||
|
||||
* Fixed bug when comparing DECIMAL/NUMERIC key parts.
|
||||
|
|
|
@ -43,7 +43,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
base_pos,varchar_count,long_varchar_count,varchar_length,
|
||||
max_key_block_length,unique_key_parts,offset;
|
||||
ulong reclength, real_reclength,min_pack_length;
|
||||
char buff[max(FN_REFLEN,2048)];
|
||||
char buff[FN_REFLEN];
|
||||
ulong pack_reclength;
|
||||
ulonglong tot_length,max_rows;
|
||||
enum en_fieldtype type;
|
||||
|
@ -52,7 +52,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
MI_UNIQUEDEF *uniquedef;
|
||||
MI_KEYSEG *keyseg,tmp_keyseg;
|
||||
MI_COLUMNDEF *rec;
|
||||
ulong rec_per_key_part[MI_MAX_POSSIBLE_KEY*MI_MAX_KEY_SEG];
|
||||
ulong *rec_per_key_part;
|
||||
my_off_t key_root[MI_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE];
|
||||
MI_CREATE_INFO tmp_create_info;
|
||||
DBUG_ENTER("mi_create");
|
||||
|
@ -87,7 +87,12 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
}
|
||||
|
||||
if (ci->reloc_rows > ci->max_rows)
|
||||
ci->reloc_rows=ci->max_rows; /* Check if wrong parameter */
|
||||
ci->reloc_rows=ci->max_rows; /* Check if wrong parameter */
|
||||
|
||||
if (!(rec_per_key_part=
|
||||
(ulong*) my_malloc((keys + uniques)*MI_MAX_KEY_SEG*sizeof(long),
|
||||
MYF(MY_WME | MY_ZEROFILL))))
|
||||
DBUG_RETURN(my_errno);
|
||||
|
||||
/* Start by checking fields and field-types used */
|
||||
|
||||
|
@ -214,7 +219,6 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
max_key_length=0; tot_length=0 ; key_segs=0;
|
||||
max_key_block_length=0;
|
||||
share.state.rec_per_key_part=rec_per_key_part;
|
||||
bzero((char*) rec_per_key_part,sizeof(rec_per_key_part));
|
||||
share.state.key_root=key_root;
|
||||
share.state.key_del=key_del;
|
||||
if (uniques)
|
||||
|
@ -581,6 +585,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
pthread_mutex_unlock(&THR_LOCK_myisam);
|
||||
if (my_close(file,MYF(0)))
|
||||
goto err;
|
||||
my_free((char*) rec_per_key_part,MYF(0));
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
|
@ -606,6 +611,7 @@ err:
|
|||
my_delete(buff,MYF(0));
|
||||
}
|
||||
}
|
||||
my_free((char*) rec_per_key_part, MYF(0));
|
||||
DBUG_RETURN(my_errno=save_errno); /* return the fatal errno */
|
||||
}
|
||||
|
||||
|
|
|
@ -84,6 +84,10 @@ int main(int argc, char **argv)
|
|||
int error;
|
||||
MY_INIT(argv[0]);
|
||||
|
||||
#ifdef __EMX__
|
||||
_wildcard (&argc, &argv);
|
||||
#endif
|
||||
|
||||
myisamchk_init(&check_param);
|
||||
check_param.opt_lock_memory=1; /* Lock memory if possible */
|
||||
check_param.using_global_keycache = 0;
|
||||
|
|
|
@ -145,6 +145,12 @@ void load_defaults(const char *conf_file, const char **groups,
|
|||
if (search_default_file(&args, &alloc, system_dir, conf_file, windows_ext,
|
||||
&group))
|
||||
goto err;
|
||||
#endif
|
||||
#ifdef __EMX__
|
||||
if (getenv("ETC") &&
|
||||
search_default_file(&args, &alloc, getenv("ETC"), conf_file,
|
||||
default_ext, &group))
|
||||
goto err;
|
||||
#endif
|
||||
for (dirs=default_directories ; *dirs; dirs++)
|
||||
{
|
||||
|
@ -356,6 +362,10 @@ void print_defaults(const char *conf_file, const char **groups)
|
|||
#ifdef __WIN__
|
||||
GetWindowsDirectory(name,sizeof(name));
|
||||
printf("%s\\%s%s ",name,conf_file,have_ext ? "" : windows_ext);
|
||||
#endif
|
||||
#ifdef __EMX__
|
||||
if (getenv("ETC"))
|
||||
printf("%s\\%s%s ", getenv("ETC"), conf_file, default_ext);
|
||||
#endif
|
||||
for (dirs=default_directories ; *dirs; dirs++)
|
||||
{
|
||||
|
|
|
@ -660,8 +660,12 @@ _getopt_internal (int argc, char *const *argv, const char *optstring, const stru
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef __EMX__
|
||||
int getopt (int argc, char **argv, __const__ char *optstring)
|
||||
#else
|
||||
int
|
||||
getopt (int argc, char *const *argv, const char *optstring)
|
||||
#endif
|
||||
{
|
||||
return _getopt_internal (argc, argv, optstring,
|
||||
(const struct option *) 0,
|
||||
|
|
|
@ -117,7 +117,7 @@ my_string fn_format(my_string to, const char *name, const char *dsk,
|
|||
if (flag & 32 || (!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
|
||||
{
|
||||
if (realpath(to,buff))
|
||||
strmov(to,buff);
|
||||
strnmov(to,buff,FN_REFLEN-1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -74,7 +74,7 @@ my_string my_path(my_string to, const char *progname,
|
|||
/* test if file without filename is found in path */
|
||||
/* Returns to if found and to has dirpart if found, else NullS */
|
||||
|
||||
#if defined(MSDOS) || defined(__WIN__)
|
||||
#if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
|
||||
#define F_OK 0
|
||||
#define PATH_SEP ';'
|
||||
#define PROGRAM_EXTENSION ".exe"
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include <my_dir.h>
|
||||
#include "mysys_err.h"
|
||||
#include <errno.h>
|
||||
#if defined(MSDOS) || defined(__WIN__)
|
||||
#if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
|
||||
#include <share.h>
|
||||
#endif
|
||||
|
||||
|
@ -42,13 +42,13 @@ File my_create(const char *FileName, int CreateFlags, int access_flags,
|
|||
DBUG_PRINT("my",("Name: '%s' CreateFlags: %d AccessFlags: %d MyFlags: %d",
|
||||
FileName, CreateFlags, access_flags, MyFlags));
|
||||
|
||||
#if !defined(NO_OPEN_3)
|
||||
#if !defined(NO_OPEN_3) && !defined(__EMX__)
|
||||
fd = open((my_string) FileName, access_flags | O_CREAT,
|
||||
CreateFlags ? CreateFlags : my_umask);
|
||||
#elif defined(VMS)
|
||||
fd = open((my_string) FileName, access_flags | O_CREAT, 0,
|
||||
"ctx=stm","ctx=bin");
|
||||
#elif defined(MSDOS) || defined(__WIN__)
|
||||
#elif defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
|
||||
if (access_flags & O_SHARE)
|
||||
fd = sopen((my_string) FileName, access_flags | O_CREAT | O_BINARY,
|
||||
SH_DENYNO, MY_S_IREAD | MY_S_IWRITE);
|
||||
|
|
|
@ -33,8 +33,10 @@
|
|||
#include <os2emx.h>
|
||||
#endif
|
||||
|
||||
#ifndef __EMX__
|
||||
#ifdef HAVE_FCNTL
|
||||
static struct flock lock; /* Must be static for sun-sparc */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Lock a part of a file */
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#include "mysys_priv.h"
|
||||
#include "mysys_err.h"
|
||||
#include <errno.h>
|
||||
#if defined(MSDOS) || defined(__WIN__)
|
||||
#if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
|
||||
#include <share.h>
|
||||
#endif
|
||||
|
||||
|
@ -34,7 +34,7 @@ File my_open(const char *FileName, int Flags, myf MyFlags)
|
|||
DBUG_ENTER("my_open");
|
||||
DBUG_PRINT("my",("Name: '%s' Flags: %d MyFlags: %d",
|
||||
FileName, Flags, MyFlags));
|
||||
#if defined(MSDOS) || defined(__WIN__)
|
||||
#if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
|
||||
if (Flags & O_SHARE)
|
||||
fd = sopen((my_string) FileName, (Flags & ~O_SHARE) | O_BINARY, SH_DENYNO);
|
||||
else
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
static my_bool alarm_aborted=1;
|
||||
my_bool thr_alarm_inited=0;
|
||||
|
||||
#if !defined(__WIN__) && !defined(__OS2__)
|
||||
#if !defined(__WIN__) && !defined(__EMX__)
|
||||
|
||||
static pthread_mutex_t LOCK_alarm;
|
||||
static sigset_t full_signal_set;
|
||||
|
@ -460,42 +460,91 @@ static void *alarm_handler(void *arg __attribute__((unused)))
|
|||
** thr_alarm for OS/2
|
||||
*****************************************************************************/
|
||||
|
||||
#elif defined(__OS2__)
|
||||
#elif defined(__EMX__)
|
||||
|
||||
#define INCL_BASE
|
||||
#define INCL_NOPMAPI
|
||||
#include <os2.h>
|
||||
|
||||
static pthread_mutex_t LOCK_alarm;
|
||||
static sigset_t full_signal_set;
|
||||
static QUEUE alarm_queue;
|
||||
pthread_t alarm_thread;
|
||||
|
||||
#ifdef USE_ALARM_THREAD
|
||||
static pthread_cond_t COND_alarm;
|
||||
static void *alarm_handler(void *arg);
|
||||
#define reschedule_alarms() pthread_cond_signal(&COND_alarm)
|
||||
#else
|
||||
#define reschedule_alarms() pthread_kill(alarm_thread,THR_SERVER_ALARM)
|
||||
#endif
|
||||
|
||||
sig_handler process_alarm(int sig __attribute__((unused)))
|
||||
{
|
||||
sigset_t old_mask;
|
||||
ALARM *alarm_data;
|
||||
DBUG_PRINT("info",("sig: %d active alarms: %d",sig,alarm_queue.elements));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Remove another thread from the alarm
|
||||
*/
|
||||
|
||||
void thr_alarm_kill(pthread_t thread_id)
|
||||
{
|
||||
uint i;
|
||||
|
||||
pthread_mutex_lock(&LOCK_alarm);
|
||||
for (i=0 ; i < alarm_queue.elements ; i++)
|
||||
{
|
||||
if (pthread_equal(((ALARM*) queue_element(&alarm_queue,i))->thread,
|
||||
thread_id))
|
||||
{
|
||||
ALARM *tmp=(ALARM*) queue_remove(&alarm_queue,i);
|
||||
tmp->expire_time=0;
|
||||
queue_insert(&alarm_queue,(byte*) tmp);
|
||||
reschedule_alarms();
|
||||
break;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_alarm);
|
||||
}
|
||||
|
||||
bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm)
|
||||
{
|
||||
APIRET rc;
|
||||
if (alarm_aborted)
|
||||
{
|
||||
alrm->crono=0;
|
||||
alrm->event=0;
|
||||
alarm->alarmed.crono=0;
|
||||
alarm->alarmed.event=0;
|
||||
return 1;
|
||||
}
|
||||
if (!(rc = DosCreateEventSem(NULL,(HEV *)&alrm->event,DC_SEM_SHARED,FALSE)))
|
||||
if (rc = DosCreateEventSem(NULL,(HEV *) &alarm->alarmed.event,
|
||||
DC_SEM_SHARED,FALSE))
|
||||
{
|
||||
printf("Error creating event semaphore! [%d] \n",rc);
|
||||
alrm->crono=0;
|
||||
alrm->event=0;
|
||||
alarm->alarmed.crono=0;
|
||||
alarm->alarmed.event=0;
|
||||
return 1;
|
||||
}
|
||||
if (!(rc = DosAsyncTimer((long) sec*1000L, (HSEM) alrm->event,(HTIMER *) &alrm->crono))) {
|
||||
if (rc = DosAsyncTimer((long) sec*1000L, (HSEM) alarm->alarmed.event,
|
||||
(HTIMER *) &alarm->alarmed.crono))
|
||||
{
|
||||
printf("Error starting async timer! [%d] \n",rc);
|
||||
DosCloseEventSem((HEV) alrm->event);
|
||||
alrm->crono=0;
|
||||
alrm->event=0;
|
||||
DosCloseEventSem((HEV) alarm->alarmed.event);
|
||||
alarm->alarmed.crono=0;
|
||||
alarm->alarmed.event=0;
|
||||
return 1;
|
||||
} /* endif */
|
||||
|
||||
(*alrm)= &alarm->alarmed;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
bool thr_got_alarm(thr_alarm_t *alrm)
|
||||
bool thr_got_alarm(thr_alarm_t *alrm_ptr)
|
||||
{
|
||||
thr_alarm_t alrm= *alrm_ptr;
|
||||
APIRET rc;
|
||||
|
||||
if (alrm->crono)
|
||||
|
@ -511,8 +560,9 @@ bool thr_got_alarm(thr_alarm_t *alrm)
|
|||
}
|
||||
|
||||
|
||||
void thr_end_alarm(thr_alarm_t *alrm)
|
||||
void thr_end_alarm(thr_alarm_t *alrm_ptr)
|
||||
{
|
||||
thr_alarm_t alrm= *alrm_ptr;
|
||||
if (alrm->crono)
|
||||
{
|
||||
DosStopTimer((HTIMER) alrm->crono);
|
||||
|
@ -542,21 +592,35 @@ void init_thr_alarm(uint max_alarm)
|
|||
|
||||
#else /* __WIN__ */
|
||||
|
||||
void thr_alarm_kill(pthread_t thread_id)
|
||||
{
|
||||
/* Can't do this yet */
|
||||
}
|
||||
|
||||
sig_handler process_alarm(int sig __attribute__((unused)))
|
||||
{
|
||||
/* Can't do this yet */
|
||||
}
|
||||
|
||||
|
||||
bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm)
|
||||
{
|
||||
if (alarm_aborted)
|
||||
{
|
||||
alrm->crono=0;
|
||||
alarm->alarmed.crono=0;
|
||||
return 1;
|
||||
}
|
||||
if (!(alrm->crono=SetTimer((HWND) NULL,0, sec*1000,(TIMERPROC) NULL)))
|
||||
if (!(alarm->alarmed.crono=SetTimer((HWND) NULL,0, sec*1000,
|
||||
(TIMERPROC) NULL)))
|
||||
return 1;
|
||||
(*alrm)= &alarm->alarmed;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool thr_got_alarm(thr_alarm_t *alrm)
|
||||
bool thr_got_alarm(thr_alarm_t *alrm_ptr)
|
||||
{
|
||||
thr_alarm_t alrm= *alrm_ptr;
|
||||
MSG msg;
|
||||
if (alrm->crono)
|
||||
{
|
||||
|
@ -571,8 +635,9 @@ bool thr_got_alarm(thr_alarm_t *alrm)
|
|||
}
|
||||
|
||||
|
||||
void thr_end_alarm(thr_alarm_t *alrm)
|
||||
void thr_end_alarm(thr_alarm_t *alrm_ptr)
|
||||
{
|
||||
thr_alarm_t alrm= *alrm_ptr;
|
||||
if (alrm->crono)
|
||||
{
|
||||
KillTimer(NULL, alrm->crono);
|
||||
|
@ -587,6 +652,13 @@ void end_thr_alarm(void)
|
|||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void init_thr_alarm(uint max_alarm)
|
||||
{
|
||||
DBUG_ENTER("init_thr_alarm");
|
||||
alarm_aborted=0; /* Yes, Gimmie alarms */
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
#endif /* __WIN__ */
|
||||
|
||||
#endif /* THREAD */
|
||||
|
@ -634,12 +706,12 @@ static void *test_thread(void *arg)
|
|||
}
|
||||
else
|
||||
{
|
||||
for (retry=0 ; !thr_got_alarm(got_alarm) && retry < 10 ; retry++)
|
||||
for (retry=0 ; !thr_got_alarm(&got_alarm) && retry < 10 ; retry++)
|
||||
{
|
||||
printf("Thread: %s Waiting %d sec\n",my_thread_name(),wait_time);
|
||||
select(0,(fd_set_ptr) &fd,0,0,0);
|
||||
}
|
||||
if (!thr_got_alarm(got_alarm))
|
||||
if (!thr_got_alarm(&got_alarm))
|
||||
{
|
||||
printf("Thread: %s didn't get an alarm. Aborting!\n",
|
||||
my_thread_name());
|
||||
|
|
100
readline/input.c
100
readline/input.c
|
@ -171,12 +171,23 @@ rl_unget_char (key)
|
|||
return (0);
|
||||
}
|
||||
|
||||
#if defined(__EMX__)
|
||||
int waiting_char = -1;
|
||||
#endif
|
||||
|
||||
/* If a character is available to be read, then read it
|
||||
and stuff it into IBUFFER. Otherwise, just return. */
|
||||
static void
|
||||
rl_gather_tyi ()
|
||||
{
|
||||
#if defined (__GO32__)
|
||||
#if defined (__EMX__)
|
||||
if (isatty (0) && (waiting_char = _read_kbd(0, 0, 0)) != -1 && ibuffer_space ())
|
||||
{
|
||||
int i;
|
||||
i = (*rl_getc_function) (rl_instream);
|
||||
rl_stuff_char (i);
|
||||
}
|
||||
#elif defined (__GO32__)
|
||||
char input;
|
||||
|
||||
if (isatty (0) && kbhit () && ibuffer_space ())
|
||||
|
@ -263,6 +274,10 @@ rl_gather_tyi ()
|
|||
int
|
||||
_rl_input_available ()
|
||||
{
|
||||
#if defined (__EMX__)
|
||||
if (isatty (0) && (waiting_char = _read_kbd(0, 0, 0)) != -1)
|
||||
return 1;
|
||||
#else /* __EMX__ */
|
||||
#if defined(HAVE_SELECT)
|
||||
fd_set readfds, exceptfds;
|
||||
struct timeval timeout;
|
||||
|
@ -288,6 +303,7 @@ _rl_input_available ()
|
|||
if (ioctl (tty, FIONREAD, &chars_avail) == 0)
|
||||
return (chars_avail);
|
||||
#endif
|
||||
#endif /* !__EMX__ */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -397,6 +413,88 @@ rl_getc (stream)
|
|||
int result, flags;
|
||||
unsigned char c;
|
||||
|
||||
#if defined (__EMX__)
|
||||
if (isatty (0))
|
||||
{
|
||||
int key;
|
||||
|
||||
if (waiting_char != -1)
|
||||
{
|
||||
key = waiting_char;
|
||||
waiting_char = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef __RSXNT__
|
||||
pc_flush();
|
||||
#endif
|
||||
key = _read_kbd(0, 1, 0);
|
||||
}
|
||||
|
||||
while (key == 0)
|
||||
{
|
||||
key |= (_read_kbd(0, 1, 0) << 8);
|
||||
/* printf("<%04X> ", key);
|
||||
fflush(stdout); */
|
||||
|
||||
switch (key)
|
||||
{
|
||||
case 0x4B00: /* left arrow */
|
||||
key = 'B' - 64;
|
||||
break;
|
||||
case 0x4D00: /* right arrow */
|
||||
key = 'F' - 64;
|
||||
break;
|
||||
case 0x7300: /* ctrl left arrow */
|
||||
key = 27;
|
||||
waiting_char = 'B';
|
||||
break;
|
||||
case 0x7400: /* ctrl right arrow */
|
||||
key = 27;
|
||||
waiting_char = 'F';
|
||||
break;
|
||||
case 0x4800: /* up arrow */
|
||||
key = 'P' - 64;
|
||||
break;
|
||||
case 0x5000: /* down arrow */
|
||||
key = 'N' - 64;
|
||||
break;
|
||||
case 0x8D00: /* ctrl up arrow */
|
||||
key = 'R' - 64;
|
||||
break;
|
||||
case 0x9100: /* ctrl down arrow */
|
||||
key = 'S' - 64;
|
||||
break;
|
||||
case 0x4700: /* home key */
|
||||
key = 'A' - 64;
|
||||
break;
|
||||
case 0x4F00: /* end key */
|
||||
key = 'E' - 64;
|
||||
break;
|
||||
case 0x7700: /* ctrl home key */
|
||||
key = 27;
|
||||
waiting_char = '<';
|
||||
break;
|
||||
case 0x7500: /* ctrl end key */
|
||||
key = 27;
|
||||
waiting_char = '>';
|
||||
break;
|
||||
case 0x5300: /* delete key */
|
||||
key = 'D' - 64;
|
||||
break;
|
||||
case 0x5200: /* insert key */
|
||||
key = 'V' - 64;
|
||||
break;
|
||||
default: /* ignore all other special keys, read next */
|
||||
key = _read_kbd(0, 1, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (key & 0xFF);
|
||||
}
|
||||
#endif /* __EMX__ */
|
||||
|
||||
#if defined (__GO32__)
|
||||
if (isatty (0))
|
||||
return (getkey () & 0x7F);
|
||||
|
|
|
@ -156,6 +156,13 @@ set_winsize (tty)
|
|||
if (ioctl (tty, TIOCGWINSZ, &w) == 0)
|
||||
(void) ioctl (tty, TIOCSWINSZ, &w);
|
||||
}
|
||||
#else
|
||||
static void
|
||||
set_winsize (tty)
|
||||
int tty;
|
||||
{
|
||||
// dummy function, required by other code. What should be doing?
|
||||
}
|
||||
#endif /* TIOCGWINSZ */
|
||||
|
||||
#if defined (NEW_TTY_DRIVER)
|
||||
|
|
|
@ -199,11 +199,11 @@ err:
|
|||
return error;
|
||||
}
|
||||
|
||||
/* Name is here without an extension */
|
||||
|
||||
int ha_myisam::open(const char *name, int mode, uint test_if_locked)
|
||||
{
|
||||
char name_buff[FN_REFLEN];
|
||||
if (!(file=mi_open(fn_format(name_buff,name,"","",2 | 4), mode,
|
||||
test_if_locked)))
|
||||
if (!(file=mi_open(name, mode, test_if_locked)))
|
||||
return (my_errno ? my_errno : -1);
|
||||
|
||||
if (test_if_locked & (HA_OPEN_IGNORE_IF_LOCKED | HA_OPEN_TMP_TABLE))
|
||||
|
|
|
@ -54,7 +54,7 @@ int my_lock(File fd,int locktype,my_off_t start,my_off_t length,myf MyFlags)
|
|||
if (!thr_alarm(&alarmed,wait_for_alarm,&alarm_buff))
|
||||
{
|
||||
int value;
|
||||
while ((value=fcntl(fd,F_SETLKW,&lock)) && !thr_got_alarm(alarmed) &&
|
||||
while ((value=fcntl(fd,F_SETLKW,&lock)) && !thr_got_alarm(&alarmed) &&
|
||||
errno == EINTR) ;
|
||||
thr_end_alarm(&alarmed);
|
||||
if (value != -1)
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
#include <my_base.h> /* Needed by field.h */
|
||||
#include <violite.h>
|
||||
|
||||
#undef write // remove pthread.h macro definition for EMX
|
||||
|
||||
typedef ulong table_map; /* Used for table bits in join */
|
||||
typedef ulong key_map; /* Used for finding keys */
|
||||
typedef ulong key_part_map; /* Used for finding key parts */
|
||||
|
@ -223,7 +225,7 @@ bool mysql_change_db(THD *thd,const char *name);
|
|||
void mysql_parse(THD *thd,char *inBuf,uint length);
|
||||
void mysql_init_select(LEX *lex);
|
||||
pthread_handler_decl(handle_one_connection,arg);
|
||||
int handle_bootstrap(THD *thd,FILE *file);
|
||||
pthread_handler_decl(handle_bootstrap,arg);
|
||||
sig_handler end_thread_signal(int sig);
|
||||
void end_thread(THD *thd,bool put_in_cache);
|
||||
void flush_thread_cache();
|
||||
|
@ -405,7 +407,8 @@ bool rename_temporary_table(TABLE *table, const char *new_db,
|
|||
const char *table_name);
|
||||
void remove_db_from_cache(const my_string db);
|
||||
void flush_tables();
|
||||
bool remove_table_from_cache(THD *thd, const char *db, const char *table);
|
||||
bool remove_table_from_cache(THD *thd, const char *db, const char *table,
|
||||
bool return_if_owned_by_thd=0);
|
||||
bool close_cached_tables(THD *thd, bool wait_for_refresh, TABLE_LIST *tables);
|
||||
void copy_field_from_tmp_record(Field *field,int offset);
|
||||
int fill_record(List<Item> &fields,List<Item> &values);
|
||||
|
@ -462,6 +465,7 @@ extern time_t start_time;
|
|||
extern const char *command_name[];
|
||||
extern I_List<THD> threads;
|
||||
extern MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log;
|
||||
extern FILE *bootstrap_file;
|
||||
extern pthread_key(MEM_ROOT*,THR_MALLOC);
|
||||
extern pthread_key(NET*, THR_NET);
|
||||
extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open,
|
||||
|
|
|
@ -159,6 +159,7 @@ static bool opt_log,opt_update_log,opt_bin_log,opt_slow_log,opt_noacl,
|
|||
opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0,
|
||||
opt_ansi_mode=0,opt_myisam_log=0, opt_large_files=sizeof(my_off_t) > 4;
|
||||
bool opt_sql_bin_update = 0, opt_log_slave_updates = 0;
|
||||
FILE *bootstrap_file=0;
|
||||
extern MASTER_INFO glob_mi;
|
||||
extern int init_master_info(MASTER_INFO* mi);
|
||||
|
||||
|
@ -1001,7 +1002,8 @@ static void init_signals(void)
|
|||
#elif defined(__EMX__)
|
||||
static void sig_reload(int signo)
|
||||
{
|
||||
reload_acl_and_cache(~0); // Flush everything
|
||||
//reload_acl_and_cache(~0); // Flush everything
|
||||
reload_acl_and_cache((THD*) 0,~0, (TABLE_LIST*) 0); // Flush everything
|
||||
signal(signo, SIG_ACK);
|
||||
}
|
||||
|
||||
|
@ -1327,7 +1329,7 @@ int main(int argc, char **argv)
|
|||
{
|
||||
struct tm *start_tm;
|
||||
start_tm=localtime(&start_time);
|
||||
strmov(time_zone=tzname[start_tm->tm_isdst == 1 ? 1 : 0]);
|
||||
strmov(time_zone,tzname[start_tm->tm_isdst == 1 ? 1 : 0]);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
@ -1780,9 +1782,25 @@ static int bootstrap(FILE *file)
|
|||
my_net_init(&thd->net,(Vio*) 0);
|
||||
thd->max_packet_length=thd->net.max_packet;
|
||||
thd->master_access= ~0;
|
||||
thd->thread_id=thread_id++;
|
||||
thread_count++;
|
||||
thd->real_id=pthread_self();
|
||||
error=handle_bootstrap(thd,file);
|
||||
|
||||
bootstrap_file=file;
|
||||
if (pthread_create(&thd->real_id,&connection_attrib,handle_bootstrap,
|
||||
(void*) thd))
|
||||
{
|
||||
sql_print_error("Warning: Can't create thread to handle bootstrap");
|
||||
return -1;
|
||||
}
|
||||
/* Wait for thread to die */
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
while (thread_count)
|
||||
{
|
||||
(void) pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
|
||||
DBUG_PRINT("quit",("One thread died (count=%u)",thread_count));
|
||||
}
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
error= thd->fatal_error;
|
||||
net_end(&thd->net);
|
||||
delete thd;
|
||||
return error;
|
||||
|
|
|
@ -71,7 +71,7 @@ extern ulong mysqld_net_retry_count;
|
|||
typedef my_bool thr_alarm_t;
|
||||
typedef my_bool ALARM;
|
||||
#define thr_alarm_init(A) (*A)=0
|
||||
#define thr_alarm_in_use(A) (A)
|
||||
#define thr_alarm_in_use(A) (*(A))
|
||||
#define thr_end_alarm(A)
|
||||
#define thr_alarm(A,B,C) local_thr_alarm((A),(B),(C))
|
||||
static inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __attribute__((unused)))
|
||||
|
@ -271,7 +271,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
int length;
|
||||
char *pos,*end;
|
||||
thr_alarm_t alarmed;
|
||||
#if (!defined(__WIN__) && !defined(__EMX__))
|
||||
#if !defined(__WIN__)
|
||||
ALARM alarm_buff;
|
||||
#endif
|
||||
uint retry_count=0;
|
||||
|
@ -330,7 +330,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
{
|
||||
my_bool interrupted = vio_should_retry(net->vio);
|
||||
#if (!defined(__WIN__) && !defined(__EMX__))
|
||||
if ((interrupted || length==0) && !thr_alarm_in_use(alarmed))
|
||||
if ((interrupted || length==0) && !thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
if (!thr_alarm(&alarmed,(uint) net_write_timeout,&alarm_buff))
|
||||
{ /* Always true for client */
|
||||
|
@ -355,7 +355,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
}
|
||||
else
|
||||
#endif /* (!defined(__WIN__) && !defined(__EMX__)) */
|
||||
if (thr_alarm_in_use(alarmed) && !thr_got_alarm(alarmed) &&
|
||||
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
|
||||
interrupted)
|
||||
{
|
||||
if (retry_count++ < RETRY_COUNT)
|
||||
|
@ -389,7 +389,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
if (net->compress)
|
||||
my_free((char*) packet,MYF(0));
|
||||
#endif
|
||||
if (thr_alarm_in_use(alarmed))
|
||||
if (thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
thr_end_alarm(&alarmed);
|
||||
vio_blocking(net->vio, net_blocking);
|
||||
|
@ -414,7 +414,7 @@ static void my_net_skip_rest(NET *net, ulong remain, thr_alarm_t *alarmed)
|
|||
{
|
||||
ALARM alarm_buff;
|
||||
uint retry_count=0;
|
||||
if (!thr_alarm_in_use(alarmed))
|
||||
if (!thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
if (!thr_alarm(alarmed,net->timeout,&alarm_buff) ||
|
||||
(!vio_is_blocking(net->vio) && vio_blocking(net->vio,TRUE) < 0))
|
||||
|
@ -426,7 +426,7 @@ static void my_net_skip_rest(NET *net, ulong remain, thr_alarm_t *alarmed)
|
|||
if ((int) (length=vio_read(net->vio,(char*) net->buff,remain)) <= 0L)
|
||||
{
|
||||
my_bool interrupted = vio_should_retry(net->vio);
|
||||
if (!thr_got_alarm(alarmed) && interrupted)
|
||||
if (!thr_got_alarm(&alarmed) && interrupted)
|
||||
{ /* Probably in MIT threads */
|
||||
if (retry_count++ < RETRY_COUNT)
|
||||
continue;
|
||||
|
@ -481,7 +481,7 @@ my_real_read(NET *net, ulong *complen)
|
|||
an alarm to not 'read forever', change the socket to non blocking
|
||||
mode and try again
|
||||
*/
|
||||
if ((interrupted || length == 0) && !thr_alarm_in_use(alarmed))
|
||||
if ((interrupted || length == 0) && !thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
if (!thr_alarm(&alarmed,net->timeout,&alarm_buff)) /* Don't wait too long */
|
||||
{
|
||||
|
@ -513,7 +513,7 @@ my_real_read(NET *net, ulong *complen)
|
|||
}
|
||||
}
|
||||
#endif /* (!defined(__WIN__) && !defined(__EMX__)) || defined(MYSQL_SERVER) */
|
||||
if (thr_alarm_in_use(alarmed) && !thr_got_alarm(alarmed) &&
|
||||
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
|
||||
interrupted)
|
||||
{ /* Probably in MIT threads */
|
||||
if (retry_count++ < RETRY_COUNT)
|
||||
|
@ -597,7 +597,7 @@ my_real_read(NET *net, ulong *complen)
|
|||
}
|
||||
|
||||
end:
|
||||
if (thr_alarm_in_use(alarmed))
|
||||
if (thr_alarm_in_use(&alarmed))
|
||||
{
|
||||
thr_end_alarm(&alarmed);
|
||||
vio_blocking(net->vio, net_blocking);
|
||||
|
|
|
@ -275,7 +275,7 @@ bool close_cached_tables(THD *thd, bool if_wait_for_refresh,
|
|||
bool found=0;
|
||||
for (TABLE_LIST *table=tables ; table ; table=table->next)
|
||||
{
|
||||
if (remove_table_from_cache(thd, table->db, table->name))
|
||||
if (remove_table_from_cache(thd, table->db, table->name, 1))
|
||||
found=1;
|
||||
}
|
||||
if (!found)
|
||||
|
@ -1972,7 +1972,8 @@ void flush_tables()
|
|||
** Returns true if the table is in use by another thread
|
||||
*/
|
||||
|
||||
bool remove_table_from_cache(THD *thd, const char *db,const char *table_name)
|
||||
bool remove_table_from_cache(THD *thd, const char *db, const char *table_name,
|
||||
bool return_if_owned_by_thd)
|
||||
{
|
||||
char key[MAX_DBKEY_LENGTH];
|
||||
uint key_length;
|
||||
|
@ -1985,13 +1986,12 @@ bool remove_table_from_cache(THD *thd, const char *db,const char *table_name)
|
|||
table;
|
||||
table = (TABLE*) hash_next(&open_cache,(byte*) key,key_length))
|
||||
{
|
||||
THD *in_use;
|
||||
table->version=0L; /* Free when thread is ready */
|
||||
if (!table->in_use)
|
||||
if (!(in_use=table->in_use))
|
||||
relink_unused(table);
|
||||
else if (table->in_use != thd)
|
||||
else if (in_use != thd)
|
||||
{
|
||||
THD *in_use=table->in_use;
|
||||
|
||||
in_use->some_tables_deleted=1;
|
||||
if (table->db_stat)
|
||||
result=1;
|
||||
|
@ -2009,6 +2009,8 @@ bool remove_table_from_cache(THD *thd, const char *db,const char *table_name)
|
|||
pthread_mutex_unlock(&in_use->mysys_var->mutex);
|
||||
}
|
||||
}
|
||||
else
|
||||
result= result || return_if_owned_by_thd;
|
||||
}
|
||||
while (unused_tables && !unused_tables->version)
|
||||
VOID(hash_delete(&open_cache,(byte*) unused_tables));
|
||||
|
|
|
@ -80,7 +80,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
|
|||
global_read_lock(0)
|
||||
{
|
||||
proc_info="login";
|
||||
host=user=db=query=ip=0;
|
||||
host=user=priv_user=db=query=ip=0;
|
||||
locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password=
|
||||
query_start_used=0;
|
||||
query_length=col_access=0;
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#pragma interface /* gcc class implementation */
|
||||
#endif
|
||||
|
||||
|
||||
class Query_log_event;
|
||||
class Load_log_event;
|
||||
|
||||
|
|
|
@ -24,8 +24,7 @@
|
|||
This will work even if the .ISM and .ISD tables are destroyed
|
||||
*/
|
||||
|
||||
int generate_table(THD *thd, TABLE_LIST *table_list,
|
||||
TABLE *locked_table)
|
||||
int generate_table(THD *thd, TABLE_LIST *table_list, TABLE *locked_table)
|
||||
{
|
||||
char path[FN_REFLEN];
|
||||
int error;
|
||||
|
|
|
@ -163,7 +163,9 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
|
||||
// the file must be:
|
||||
if (!((stat_info.st_mode & S_IROTH) == S_IROTH && // readable by others
|
||||
#ifndef __EMX__
|
||||
(stat_info.st_mode & S_IFLNK) != S_IFLNK && // and not a symlink
|
||||
#endif
|
||||
((stat_info.st_mode & S_IFREG) == S_IFREG ||
|
||||
(stat_info.st_mode & S_IFIFO) == S_IFIFO)))
|
||||
{
|
||||
|
|
|
@ -428,19 +428,26 @@ end_thread:
|
|||
return(0); /* purecov: deadcode */
|
||||
}
|
||||
|
||||
/*
|
||||
Execute commands from bootstrap_file.
|
||||
Used when creating the initial grant tables
|
||||
*/
|
||||
|
||||
int handle_bootstrap(THD *thd,FILE *file)
|
||||
pthread_handler_decl(handle_bootstrap,arg)
|
||||
{
|
||||
THD *thd=(THD*) arg;
|
||||
FILE *file=bootstrap_file;
|
||||
char *buff;
|
||||
DBUG_ENTER("handle_bootstrap");
|
||||
|
||||
pthread_detach_this_thread();
|
||||
thd->thread_stack= (char*) &thd;
|
||||
|
||||
if (init_thr_lock() ||
|
||||
my_pthread_setspecific_ptr(THR_THD, thd) ||
|
||||
my_pthread_setspecific_ptr(THR_MALLOC, &thd->mem_root) ||
|
||||
my_pthread_setspecific_ptr(THR_NET, &thd->net))
|
||||
if (my_thread_init() || thd->store_globals())
|
||||
{
|
||||
close_connection(&thd->net,ER_OUT_OF_RESOURCES);
|
||||
DBUG_RETURN(-1);
|
||||
thd->fatal_error=1;
|
||||
goto end;
|
||||
}
|
||||
thd->mysys_var=my_thread_var;
|
||||
thd->dbug_thread_id=my_thread_id();
|
||||
|
@ -455,8 +462,9 @@ int handle_bootstrap(THD *thd,FILE *file)
|
|||
|
||||
thd->proc_info=0;
|
||||
thd->version=refresh_version;
|
||||
thd->priv_user=thd->user="boot";
|
||||
|
||||
char *buff= (char*) thd->net.buff;
|
||||
buff= (char*) thd->net.buff;
|
||||
init_sql_alloc(&thd->mem_root,8192,8192);
|
||||
while (fgets(buff, thd->net.max_packet, file))
|
||||
{
|
||||
|
@ -470,13 +478,20 @@ int handle_bootstrap(THD *thd,FILE *file)
|
|||
mysql_parse(thd,thd->query,length);
|
||||
close_thread_tables(thd); // Free tables
|
||||
if (thd->fatal_error)
|
||||
{
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
break;
|
||||
free_root(&thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||
}
|
||||
free_root(&thd->mem_root,MYF(0));
|
||||
DBUG_RETURN(0);
|
||||
thd->priv_user=thd->user=0;
|
||||
|
||||
/* thd->fatal_error should be set in case something went wrong */
|
||||
end:
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
thread_count--;
|
||||
(void) pthread_cond_broadcast(&COND_thread_count);
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
my_thread_end();
|
||||
pthread_exit(0);
|
||||
DBUG_RETURN(0); // Never reached
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -3520,6 +3520,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||
{
|
||||
Field *field=(*group->item)->tmp_table_field();
|
||||
bool maybe_null=(*group->item)->maybe_null;
|
||||
key_part_info->null_bit=0;
|
||||
key_part_info->field= field;
|
||||
key_part_info->offset= field->offset();
|
||||
key_part_info->length= (uint16) field->pack_length();
|
||||
|
@ -3581,6 +3582,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||
keyinfo->name=(char*) "tmp";
|
||||
if (null_count)
|
||||
{
|
||||
key_part_info->null_bit=0;
|
||||
key_part_info->offset=0;
|
||||
key_part_info->length=(null_count+7)/8;
|
||||
key_part_info->field=new Field_string((char*) table->record[0],
|
||||
|
@ -3596,6 +3598,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||
for (i=0,reg_field=table->field; i < field_count;
|
||||
i++, reg_field++, key_part_info++)
|
||||
{
|
||||
key_part_info->null_bit=0;
|
||||
key_part_info->field= *reg_field;
|
||||
key_part_info->offset= (*reg_field)->offset();
|
||||
key_part_info->length= (uint16) (*reg_field)->pack_length();
|
||||
|
|
|
@ -1482,7 +1482,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef __WIN__
|
||||
#if defined( __WIN__) || defined( __EMX__)
|
||||
// Win32 can't rename an open table, so we must close the org table!
|
||||
table_name=thd->strdup(table_name); // must be saved
|
||||
if (close_cached_table(thd,table))
|
||||
|
|
|
@ -38,8 +38,7 @@
|
|||
|
||||
#if defined(__EMX__)
|
||||
#include <sys/ioctl.h>
|
||||
#define ioctlsocket(A,B,C) ioctl((A),(B),(void *)(C),sizeof(*(C)))
|
||||
#undef HAVE_FCNTL
|
||||
#define ioctlsocket ioctl
|
||||
#endif /* defined(__EMX__) */
|
||||
|
||||
#if defined(MSDOS) || defined(__WIN__)
|
||||
|
@ -111,7 +110,7 @@ Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
|
|||
#else /* !defined(__WIN__) && !defined(__EMX__) */
|
||||
{
|
||||
/* set to blocking mode by default */
|
||||
ulong arg=0;
|
||||
ulong arg=0, r;
|
||||
r = ioctlsocket(vio->sd,FIONBIO,(void*) &arg, sizeof(arg));
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue