my_sys.h 32.4 KB
Newer Older
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1 2 3 4 5 6 7 8
/* Copyright (C) 2000 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
bk@work.mysql.com's avatar
bk@work.mysql.com committed
9
   but WITHOUT ANY WARRANTY; without even the implied warranty of
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
10 11 12 13 14 15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
16 17 18

#ifndef _my_sys_h
#define _my_sys_h
19
C_MODE_START
bk@work.mysql.com's avatar
bk@work.mysql.com committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

#ifdef HAVE_AIOWAIT
#include <sys/asynch.h>			/* Used by record-cache */
typedef struct my_aio_result {
  aio_result_t result;
  int	       pending;
} my_aio_result;
#endif

#ifndef THREAD
extern int NEAR my_errno;		/* Last error in mysys */
#else
#include <my_pthread.h>
#endif

#ifndef _m_ctype_h
#include <m_ctype.h>                    /* for CHARSET_INFO */
#endif

39
#include <stdarg.h>
bk@work.mysql.com's avatar
bk@work.mysql.com committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

#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(); }

#define MAXMAPS		(4)	/* Number of error message maps */
#define ERRMOD		(1000)	/* Max number of errors in a map */
#define ERRMSGSIZE	(SC_MAXWIDTH)	/* Max length of a error message */
#define NRERRBUFFS	(2)	/* Buffers for parameters */
#define MY_FILE_ERROR	((uint) ~0)

	/* General bitmaps for my_func's */
#define MY_FFNF		1	/* Fatal if file not found */
#define MY_FNABP	2	/* Fatal if not all bytes read/writen */
#define MY_NABP		4	/* Error if not all bytes read/writen */
#define MY_FAE		8	/* Fatal if any error */
#define MY_WME		16	/* Write message on error */
#define MY_WAIT_IF_FULL 32	/* Wait and try again if disk full error */
#define MY_RAID         64      /* Support for RAID (not the "Johnson&Johnson"-s one ;) */
59
#define MY_FULL_IO     512      /* For my_read - loop intil I/O
60 61
				   is complete
				*/
62
#define MY_DONT_CHECK_FILESIZE 128	/* Option to init_io_cache() */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
63 64
#define MY_LINK_WARNING 32	/* my_redel() gives warning if links */
#define MY_COPYTIME	64	/* my_redel() copys time */
65 66
#define MY_DELETE_OLD	256	/* my_create_with_symlink() */
#define MY_RESOLVE_LINK 128	/* my_realpath(); Only resolve links */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
67
#define MY_HOLD_ORIGINAL_MODES 128  /* my_copy() holds to file modes */
68
#define MY_REDEL_MAKE_BACKUP 256
bk@work.mysql.com's avatar
bk@work.mysql.com committed
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
#define MY_SEEK_NOT_DONE 32	/* my_lock may have to do a seek */
#define MY_DONT_WAIT	64	/* my_lock() don't wait if can't lock */
#define MY_ZEROFILL	32	/* my_malloc(), fill array with zero */
#define MY_ALLOW_ZERO_PTR 64	/* my_realloc() ; zero ptr -> malloc */
#define MY_FREE_ON_ERROR 128	/* my_realloc() ; Free old ptr on error */
#define MY_HOLD_ON_ERROR 256	/* my_realloc() ; Return old ptr on error */
#define MY_THREADSAFE	128	/* pread/pwrite:  Don't allow interrupts */

#define MY_CHECK_ERROR	1	/* Params to my_end; Check open-close */
#define MY_GIVE_INFO	2	/* Give time info about process*/

#define ME_HIGHBYTE	8	/* Shift for colours */
#define ME_NOCUR	1	/* Don't use curses message */
#define ME_OLDWIN	2	/* Use old window */
#define ME_BELL		4	/* Ring bell then printing message */
#define ME_HOLDTANG	8	/* Don't delete last keys */
#define ME_WAITTOT	16	/* Wait for errtime secs of for a action */
#define ME_WAITTANG	32	/* Wait for a user action  */
#define ME_NOREFRESH	64	/* Dont refresh screen */
#define ME_NOINPUT	128	/* Dont use the input libary */
#define ME_COLOUR1	((1 << ME_HIGHBYTE))	/* Possibly error-colours */
#define ME_COLOUR2	((2 << ME_HIGHBYTE))
#define ME_COLOUR3	((3 << ME_HIGHBYTE))

93 94 95 96 97 98 99 100 101 102
	/* Bits in last argument to fn_format */
#define MY_REPLACE_DIR		1	/* replace dir in name with 'dir' */
#define MY_REPLACE_EXT		2	/* replace extension with 'ext' */
#define MY_UNPACK_FILENAME	4	/* Unpack name (~ -> home) */
#define MY_PACK_FILENAME	8	/* Pack name (home -> ~) */
#define MY_RESOLVE_SYMLINKS	16	/* Resolve all symbolic links */
#define MY_RETURN_REAL_PATH	32	/* return full path for file */
#define MY_SAFE_PATH		64	/* Return NULL if too long path */
#define MY_RELATIVE_PATH	128	/* name is relative to 'dir' */

bk@work.mysql.com's avatar
bk@work.mysql.com committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
	/* My seek flags */
#define MY_SEEK_SET	0
#define MY_SEEK_CUR	1
#define MY_SEEK_END	2

        /* My charsets_list flags */
#define MY_NO_SETS       0
#define MY_COMPILED_SETS 1      /* show compiled-in sets */
#define MY_CONFIG_SETS   2      /* sets that have a *.conf file */
#define MY_INDEX_SETS    4      /* all sets listed in the Index file */
#define MY_LOADED_SETS    8      /* the sets that are currently loaded */

	/* Some constants */
#define MY_WAIT_FOR_USER_TO_FIX_PANIC	60	/* in seconds */
#define MY_WAIT_GIVE_USER_A_MESSAGE	10	/* Every 10 times of prev */
#define MIN_COMPRESS_LENGTH		50	/* Don't compress small bl. */
119 120
#define DEFAULT_KEYCACHE_BLOCK_SIZE	1024
#define MAX_KEYCACHE_BLOCK_SIZE		16384
bk@work.mysql.com's avatar
bk@work.mysql.com committed
121

122 123
	/* root_alloc flags */
#define MY_KEEP_PREALLOC	1
124
#define MY_MARK_BLOCKS_FREE     2  /* move used to free list and reuse them */
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
125

bk@work.mysql.com's avatar
bk@work.mysql.com committed
126 127 128 129
	/* defines when allocating data */

#ifdef SAFEMALLOC
#define my_malloc(SZ,FLAG) _mymalloc( SZ, __FILE__, __LINE__, FLAG )
130
#define my_malloc_ci(SZ,FLAG) _mymalloc( SZ, sFile, uLine, FLAG )
bk@work.mysql.com's avatar
bk@work.mysql.com committed
131 132 133 134 135 136 137 138
#define my_realloc(PTR,SZ,FLAG) _myrealloc( PTR, SZ, __FILE__, __LINE__, FLAG )
#define my_checkmalloc() _sanity( __FILE__, __LINE__ )
#define my_free(PTR,FLAG) _myfree( PTR, __FILE__, __LINE__,FLAG)
#define my_memdup(A,B,C) _my_memdup(A,B,__FILE__,__LINE__,C)
#define my_strdup(A,C) _my_strdup(A,__FILE__,__LINE__,C)
#define QUICK_SAFEMALLOC sf_malloc_quick=1
#define NORMAL_SAFEMALLOC sf_malloc_quick=0
extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick;
139
extern ulonglong safemalloc_mem_limit;
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
140

141 142 143
#define CALLER_INFO_PROTO   , const char *sFile, uint uLine
#define CALLER_INFO         , __FILE__, __LINE__
#define ORIG_CALLER_INFO    , sFile, uLine
bk@work.mysql.com's avatar
bk@work.mysql.com committed
144 145
#else
#define my_checkmalloc() (0)
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
146
#undef TERMINATE
bk@work.mysql.com's avatar
bk@work.mysql.com committed
147 148 149 150
#define TERMINATE(A) {}
#define QUICK_SAFEMALLOC
#define NORMAL_SAFEMALLOC
extern gptr my_malloc(uint Size,myf MyFlags);
151
#define my_malloc_ci(SZ,FLAG) my_malloc( SZ, FLAG )
bk@work.mysql.com's avatar
bk@work.mysql.com committed
152 153 154 155 156
extern gptr my_realloc(gptr oldpoint,uint Size,myf MyFlags);
extern void my_no_flags_free(gptr ptr);
extern gptr my_memdup(const byte *from,uint length,myf MyFlags);
extern my_string my_strdup(const char *from,myf MyFlags);
#define my_free(PTR,FG) my_no_flags_free(PTR)
157 158 159
#define CALLER_INFO_PROTO   /* nothing */
#define CALLER_INFO         /* nothing */
#define ORIG_CALLER_INFO    /* nothing */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
#endif
#ifdef HAVE_ALLOCA
#define my_alloca(SZ) alloca((size_t) (SZ))
#define my_afree(PTR) {}
#else
#define my_alloca(SZ) my_malloc(SZ,MYF(0))
#define my_afree(PTR) my_free(PTR,MYF(MY_WME))
#endif /* HAVE_ALLOCA */
#ifdef MSDOS
#ifdef __ZTC__
void * __CDECL halloc(long count,size_t length);
void   __CDECL hfree(void *ptr);
#endif
#if defined(USE_HALLOC)
#if defined(_VCM_) || defined(M_IC80386)
#undef USE_HALLOC
#endif
#endif
#ifdef USE_HALLOC
#define malloc(a) halloc((long) (a),1)
#define free(a) hfree(a)
#endif
#endif /* MSDOS */

#ifdef HAVE_ERRNO_AS_DEFINE
#include <errno.h>			/* errno is a define */
#else
extern int errno;			/* declare errno */
#endif
189
extern const char ** NEAR my_errmsg[];
bk@work.mysql.com's avatar
bk@work.mysql.com committed
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
extern char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];
extern char *home_dir;			/* Home directory for user */
extern char *my_progname;		/* program-name (printed in errors) */
extern char NEAR curr_dir[];		/* Current directory for user */
extern int (*error_handler_hook)(uint my_err, const char *str,myf MyFlags);
extern int (*fatal_error_handler_hook)(uint my_err, const char *str,
				       myf MyFlags);

/* charsets */
extern uint get_charset_number(const char *cs_name);
extern const char *get_charset_name(uint cs_number);
extern CHARSET_INFO *get_charset(uint cs_number, myf flags);
extern my_bool set_default_charset(uint cs, myf flags);
extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags);
extern my_bool set_default_charset_by_name(const char *cs_name, myf flags);
extern void free_charsets(void);
extern char *list_charsets(myf want_flags); /* my_free() this string... */
207
extern char *get_charsets_dir(char *buf);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
208 209


210
/* statistics */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
211 212
extern ulong	_my_cache_w_requests,_my_cache_write,_my_cache_r_requests,
		_my_cache_read;
213 214
extern ulong	_my_blocks_used,_my_blocks_changed;
extern uint	key_cache_block_size;
215
extern ulong	my_file_opened,my_stream_opened, my_tmp_file_created;
216
extern my_bool	key_cache_inited, my_init_done;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233

					/* Point to current my_message() */
extern void (*my_sigtstp_cleanup)(void),
					/* Executed before jump to shell */
	    (*my_sigtstp_restart)(void),
	    (*my_abort_hook)(int);
					/* Executed when comming from shell */
extern int NEAR my_umask,		/* Default creation mask  */
	   NEAR my_umask_dir,
	   NEAR my_recived_signals,	/* Signals we have got */
	   NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
	   NEAR my_dont_interrupt;	/* call remember_intr when set */
extern my_bool NEAR mysys_uses_curses, my_use_symdir;
extern long lCurMemory,lMaxMemory;	/* from safemalloc */

extern ulong	my_default_record_cache_size;
extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
234
               NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
235 236
extern char	wild_many,wild_one,wild_prefix;
extern const char *charsets_dir;
monty@tramp.mysql.fi's avatar
monty@tramp.mysql.fi committed
237
extern char *defaults_extra_file;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
238 239 240 241 242 243 244 245 246 247 248 249 250 251

typedef struct wild_file_pack	/* Struct to hold info when selecting files */
{
  uint		wilds;		/* How many wildcards */
  uint		not_pos;	/* Start of not-theese-files */
  my_string	*wild;		/* Pointer to wildcards */
} WF_PACK;

typedef struct st_typelib {	/* Different types saved here */
  uint count;			/* How many types */
  const char *name;			/* Name of typelib */
  const char **type_names;
} TYPELIB;

sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
252 253 254 255
enum cache_type {READ_CACHE,WRITE_CACHE,
		 SEQ_READ_APPEND /* sequential read or append */,
		 READ_FIFO,
		 READ_NET,WRITE_NET};
bk@work.mysql.com's avatar
bk@work.mysql.com committed
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
enum flush_type { FLUSH_KEEP, FLUSH_RELEASE, FLUSH_IGNORE_CHANGED,
		  FLUSH_FORCE_WRITE};

typedef struct st_record_cache	/* Used when cacheing records */
{
  File file;
  int	rc_seek,error,inited;
  uint	rc_length,read_length,reclength;
  my_off_t rc_record_pos,end_of_file;
  byte	*rc_buff,*rc_buff2,*rc_pos,*rc_end,*rc_request_pos;
#ifdef HAVE_AIOWAIT
  int	use_async_io;
  my_aio_result aio_result;
#endif
  enum cache_type type;
} RECORD_CACHE;

enum file_type { UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE,
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
274 275
		 STREAM_BY_FOPEN, STREAM_BY_FDOPEN, FILE_BY_MKSTEMP,
		 FILE_BY_DUP };
bk@work.mysql.com's avatar
bk@work.mysql.com committed
276 277 278 279 280

extern struct my_file_info
{
  my_string		name;
  enum file_type	type;
281
#if defined(THREAD) && !defined(HAVE_PREAD)
282 283
  pthread_mutex_t	mutex;
#endif
bk@work.mysql.com's avatar
bk@work.mysql.com committed
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
} my_file_info[MY_NFILE];


typedef struct st_dynamic_array {
  char *buffer;
  uint elements,max_element;
  uint alloc_increment;
  uint size_of_element;
} DYNAMIC_ARRAY;

typedef struct st_dynamic_string {
  char *str;
  uint length,max_length,alloc_increment;
} DYNAMIC_STRING;

299 300
struct st_io_cache;
typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache*);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
301

302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
#ifdef THREAD
typedef struct st_io_cache_share
{
  /* to sync on reads into buffer */
  pthread_mutex_t mutex;
  pthread_cond_t  cond;
  int             count;
  /* actual IO_CACHE that filled the buffer */
  struct st_io_cache *active;
  /* the following will go implemented whenever the need arises */
#ifdef NOT_IMPLEMENTED
  /* whether the structure should be free'd */
  my_bool alloced;
#endif
} IO_CACHE_SHARE;

#define lock_io_cache(info)                                              \
  (                                                                      \
    (errno=pthread_mutex_lock(&((info)->share->mutex))) ? -1 : (         \
      (info)->share->count ? (                                           \
        --((info)->share->count),                                        \
        pthread_cond_wait(&((info)->share->cond),                        \
                          &((info)->share->mutex)),                      \
        (++((info)->share->count) ?                                      \
          pthread_mutex_unlock(&((info)->share->mutex)) : 0))            \
        : 1 )                                                            \
  )

#define unlock_io_cache(info)                                            \
  (                                                                      \
    pthread_cond_broadcast(&((info)->share->cond)),                      \
    pthread_mutex_unlock  (&((info)->share->mutex))                      \
  )
/* -- to catch errors
#else
#define lock_io_cache(info)
#define unlock_io_cache(info)
*/
#endif
341

bk@work.mysql.com's avatar
bk@work.mysql.com committed
342 343
typedef struct st_io_cache		/* Used when cacheing files */
{
344 345 346 347 348
  /* pos_in_file is offset in file corresponding to the first byte of
     byte* buffer. end_of_file is the offset of end of file for READ_CACHE
     and WRITE_CACHE. For SEQ_READ_APPEND it the maximum of the actual
     end of file and the position represented by read_end.
  */
349
  my_off_t pos_in_file,end_of_file;
350 351 352 353 354 355
  /* read_pos points to current read position in the buffer
     read_end is the non-inclusive boundary in the buffer for the currently
     valid read area
     buffer is the read buffer
     not sure about request_pos except that it is used in async_io
  */
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
356
  byte	*read_pos,*read_end,*buffer,*request_pos;
357 358 359 360 361 362 363 364 365
  /* write_buffer is used only in WRITE caches and in SEQ_READ_APPEND to
     buffer writes
     append_read_pos is only used in SEQ_READ_APPEND, and points to the
     current read position in the write buffer. Note that reads in
     SEQ_READ_APPEND caches can happen from both read buffer (byte* buffer),
     and write buffer (byte* write_buffer).
     write_pos points to current write position in the write buffer and
     write_end is the non-inclusive boundary of the valid write area
  */
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
366
  byte  *write_buffer, *append_read_pos, *write_pos, *write_end;
367 368 369 370 371
  /* current_pos and current_end are convenience variables used by
     my_b_tell() and other routines that need to know the current offset
     current_pos points to &write_pos, and current_end to &write_end in a
     WRITE_CACHE, and &read_pos and &read_end respectively otherwise
  */
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
372
  byte  **current_pos, **current_end;
sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
373
#ifdef THREAD
374 375
  /* The lock is for append buffer used in SEQ_READ_APPEND cache
     need mutex copying from append buffer to read buffer. */
sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
376
  pthread_mutex_t append_buffer_lock;
377 378 379 380 381 382
  /* The following is used when several threads are reading the
     same file in parallel. They are synchronized on disk
     accesses reading the cached part of the file asynchronously.
     It should be set to NULL to disable the feature.  Only
     READ_CACHE mode is supported. */
  IO_CACHE_SHARE *share;
383 384 385 386 387 388 389 390
#endif
  /* a caller will use my_b_read() macro to read from the cache
     if the data is already in cache, it will be simply copied with
     memcpy() and internal variables will be accordinging updated with
     no functions invoked. However, if the data is not fully in the cache,
     my_b_read() will call read_function to fetch the data. read_function
     must never be invoked directly
  */
391
  int (*read_function)(struct st_io_cache *,byte *,uint);
392 393 394
  /* same idea as in the case of read_function, except my_b_write() needs to
     be replaced with my_b_append() for a SEQ_READ_APPEND cache
  */
395
  int (*write_function)(struct st_io_cache *,const byte *,uint);
396 397 398 399
  /* specifies the type of the cache. Depending on the type of the cache
     certain operations might not be available and yield unpredicatable
     results. Details to be documented later
  */
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
400
  enum cache_type type;
401 402 403 404 405 406
  /* callbacks when the actual read I/O happens. These were added and
   are currently used for binary logging of LOAD DATA INFILE - when a
   block is read from the file, we create a block create/append event, and
   when IO_CACHE is closed, we create an end event. These functions could,
   of course be used for other things
  */
407 408
  IO_CACHE_CALLBACK pre_read;
  IO_CACHE_CALLBACK post_read;
409 410
  IO_CACHE_CALLBACK pre_close;
  void* arg; /* for use by pre/post_read */
411 412
  char *file_name;			/* if used with 'open_cached_file' */
  char *dir,*prefix;
413 414 415 416 417 418 419
  File file; /* file descriptor */
  /* seek_not_done is set by my_b_seek() to inform the upcoming read/write
     operation that a seek needs to be preformed prior to the actual I/O
     error is 0 if the cache operation was successful, -1 if there was a
     "hard" error, and the actual number of I/O-ed bytes if the read/write was
     partial
  */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
420
  int	seek_not_done,error;
421 422 423 424
  /* buffer_length is the size of memory allocated for buffer or write_buffer
     read_length is the same as buffer_length except when we use async io
     not sure why we need it
   */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
425 426
  uint	buffer_length,read_length;
  myf	myflags;			/* Flags used to my_read/my_write */
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
427
 /*
428 429
   alloced_buffer is 1 if the buffer was allocated by init_io_cache() and
   0 if it was supplied by the user
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
430 431 432 433
   Currently READ_NET is the only one that will use a buffer allocated
   somewhere else
 */
  my_bool alloced_buffer;
434 435 436 437 438 439 440 441 442 443 444
  /* init_count is incremented every time we call init_io_cache()
     It is not reset in end_io_cache(). This variable
     was introduced for slave relay logs - RELAY_LOG_INFO stores a pointer
     to IO_CACHE that could in some cases refer to the IO_CACHE of the
     currently active relay log. The IO_CACHE then could be closed,
     re-opened and start pointing to a different log file. In that case,
     we could not know reliably if this happened without init_count
     one must be careful with bzero() prior to the subsequent init_io_cache()
     call
  */
  int init_count;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
445
#ifdef HAVE_AIOWAIT
446 447 448
  /* as inidicated by ifdef, this is for async I/O, we will have
     Sinisa comment this some time
  */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
  uint inited;
  my_off_t aio_read_pos;
  my_aio_result aio_result;
#endif
} IO_CACHE;

typedef int (*qsort2_cmp)(const void *, const void *, const void *);

	/* defines for mf_iocache */

	/* Test if buffer is inited */
#define my_b_clear(info) (info)->buffer=0
#define my_b_inited(info) (info)->buffer
#define my_b_EOF INT_MIN

#define my_b_read(info,Buffer,Count) \
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
465 466 467
  ((info)->read_pos + (Count) <= (info)->read_end ?\
   (memcpy(Buffer,(info)->read_pos,(size_t) (Count)), \
    ((info)->read_pos+=(Count)),0) :\
bk@work.mysql.com's avatar
bk@work.mysql.com committed
468 469
   (*(info)->read_function)((info),Buffer,Count))

470 471 472 473 474
#define my_b_write(info,Buffer,Count) \
 ((info)->write_pos + (Count) <=(info)->write_end ?\
  (memcpy((info)->write_pos, (Buffer), (size_t)(Count)),\
   ((info)->write_pos+=(Count)),0) : \
   (*(info)->write_function)((info),(Buffer),(Count)))
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
475

476

bk@work.mysql.com's avatar
bk@work.mysql.com committed
477
#define my_b_get(info) \
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
478 479
  ((info)->read_pos != (info)->read_end ?\
   ((info)->read_pos++, (int) (uchar) (info)->read_pos[-1]) :\
bk@work.mysql.com's avatar
bk@work.mysql.com committed
480 481 482 483
   _my_b_get(info))

	/* my_b_write_byte dosn't have any err-check */
#define my_b_write_byte(info,chr) \
484 485 486
  (((info)->write_pos < (info)->write_end) ?\
   ((*(info)->write_pos++)=(chr)) :\
   (_my_b_write(info,0,0) , ((*(info)->write_pos++)=(chr))))
bk@work.mysql.com's avatar
bk@work.mysql.com committed
487 488

#define my_b_fill_cache(info) \
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
489
  (((info)->read_end=(info)->read_pos),(*(info)->read_function)(info,0,0))
490

bk@work.mysql.com's avatar
bk@work.mysql.com committed
491
#define my_b_tell(info) ((info)->pos_in_file + \
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
492
			 (uint) (*(info)->current_pos - (info)->request_pos))
493 494 495

/* tell write offset in the SEQ_APPEND cache */
my_off_t my_b_append_tell(IO_CACHE* info);
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
496 497 498

#define my_b_bytes_in_cache(info) (uint) (*(info)->current_end - \
					  *(info)->current_pos)
bk@work.mysql.com's avatar
bk@work.mysql.com committed
499

500

bk@work.mysql.com's avatar
bk@work.mysql.com committed
501
typedef struct st_changeable_var {
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
502 503 504 505 506 507 508
  const char *name;			/* Name of variable */
  long *varptr;				/* Pointer to variable */
  long def_value,			/* Default value */
       min_value,			/* Min allowed value */
       max_value,			/* Max allowed value */
       sub_size,			/* Subtract this from given value */
       block_size;			/* Value should be a mult. of this */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
509 510 511
} CHANGEABLE_VAR;


512
#include <my_alloc.h>
bk@work.mysql.com's avatar
bk@work.mysql.com committed
513 514 515 516 517 518 519 520 521 522 523 524 525

	/* Prototypes for mysys and my_func functions */

extern int my_copy(const char *from,const char *to,myf MyFlags);
extern int my_append(const char *from,const char *to,myf MyFlags);
extern int my_delete(const char *name,myf MyFlags);
extern int my_getwd(my_string buf,uint size,myf MyFlags);
extern int my_setwd(const char *dir,myf MyFlags);
extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags);
extern gptr my_once_alloc(uint Size,myf MyFlags);
extern void my_once_free(void);
extern my_string my_tempnam(const char *dir,const char *pfx,myf MyFlags);
extern File my_open(const char *FileName,int Flags,myf MyFlags);
526 527 528
extern File my_register_filename(File fd, const char *FileName,
				 enum file_type type_of_file,
				 uint error_message_number, myf MyFlags);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
529 530 531
extern File my_create(const char *FileName,int CreateFlags,
		      int AccsesFlags, myf MyFlags);
extern int my_close(File Filedes,myf MyFlags);
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
532
extern File my_dup(File file, myf MyFlags);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
533
extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
534 535 536 537 538
extern int my_readlink(char *to, const char *filename, myf MyFlags);
extern int my_realpath(char *to, const char *filename, myf MyFlags);
extern File my_create_with_symlink(const char *linkname, const char *filename,
				   int createflags, int access_flags,
				   myf MyFlags);
539 540
extern int my_delete_with_symlink(const char *name, myf MyFlags);
extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags);
541
extern int my_symlink(const char *content, const char *linkname, myf MyFlags);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572
extern uint my_read(File Filedes,byte *Buffer,uint Count,myf MyFlags);
extern uint my_pread(File Filedes,byte *Buffer,uint Count,my_off_t offset,
		     myf MyFlags);
extern int my_rename(const char *from,const char *to,myf MyFlags);
extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags);
extern my_off_t my_tell(File fd,myf MyFlags);
extern uint my_write(File Filedes,const byte *Buffer,uint Count,
		     myf MyFlags);
extern uint my_pwrite(File Filedes,const byte *Buffer,uint Count,
		      my_off_t offset,myf MyFlags);
extern uint my_fread(FILE *stream,byte *Buffer,uint Count,myf MyFlags);
extern uint my_fwrite(FILE *stream,const byte *Buffer,uint Count,
		      myf MyFlags);
extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags);
extern my_off_t my_ftell(FILE *stream,myf MyFlags);
extern gptr _mymalloc(uint uSize,const char *sFile,
		      uint uLine, myf MyFlag);
extern gptr _myrealloc(gptr pPtr,uint uSize,const char *sFile,
		       uint uLine, myf MyFlag);
extern gptr my_multi_malloc _VARARGS((myf MyFlags, ...));
extern void _myfree(gptr pPtr,const char *sFile,uint uLine, myf MyFlag);
extern int _sanity(const char *sFile,unsigned int uLine);
extern gptr _my_memdup(const byte *from,uint length,
		       const char *sFile, uint uLine,myf MyFlag);
extern my_string _my_strdup(const char *from, const char *sFile, uint uLine,
			    myf MyFlag);
#ifndef TERMINATE
extern void TERMINATE(FILE *file);
#endif
extern void init_glob_errs(void);
extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
573
extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
574 575 576 577 578 579 580 581
extern int my_fclose(FILE *fd,myf MyFlags);
extern int my_chsize(File fd,my_off_t newlength,myf MyFlags);
extern int my_error _VARARGS((int nr,myf MyFlags, ...));
extern int my_printf_error _VARARGS((uint my_err, const char *format,
				     myf MyFlags, ...)
				    __attribute__ ((format (printf, 2, 4))));
extern int my_vsnprintf( char *str, size_t n,
                                const char *format, va_list ap );
582
extern int my_snprintf(char* to, size_t n, const char* fmt, ...);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
583 584 585 586 587 588 589 590 591
extern int my_message(uint my_err, const char *str,myf MyFlags);
extern int my_message_no_curses(uint my_err, const char *str,myf MyFlags);
extern int my_message_curses(uint my_err, const char *str,myf MyFlags);
extern void my_init(void);
extern void my_end(int infoflag);
extern int my_redel(const char *from, const char *to, int MyFlags);
extern int my_copystat(const char *from, const char *to, int MyFlags);
extern my_string my_filename(File fd);

592
#ifndef THREAD
bk@work.mysql.com's avatar
bk@work.mysql.com committed
593 594
extern void dont_break(void);
extern void allow_break(void);
595 596 597 598 599
#else
#define dont_break()
#define allow_break()
#endif

bk@work.mysql.com's avatar
bk@work.mysql.com committed
600 601 602 603 604 605 606 607 608 609
extern void my_remember_signal(int signal_number,sig_handler (*func)(int));
extern void caseup(my_string str,uint length);
extern void casedn(my_string str,uint length);
extern void caseup_str(my_string str);
extern void casedn_str(my_string str);
extern void case_sort(my_string str,uint length);
extern uint dirname_part(my_string to,const char *name);
extern uint dirname_length(const char *name);
#define base_name(A) (A+dirname_length(A))
extern int test_if_hard_path(const char *dir_name);
610
extern char *convert_dirname(char *to, const char *from, const char *from_end);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
611 612 613
extern void to_unix_path(my_string name);
extern my_string fn_ext(const char *name);
extern my_string fn_same(my_string toname,const char *name,int flag);
614 615
extern my_string fn_format(my_string to,const char *name,const char *dir,
			   const char *form, uint flag);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
extern size_s strlength(const char *str);
extern void pack_dirname(my_string to,const char *from);
extern uint unpack_dirname(my_string to,const char *from);
extern uint cleanup_dirname(my_string to,const char *from);
extern uint system_filename(my_string to,const char *from);
extern my_string unpack_filename(my_string to,const char *from);
extern my_string intern_filename(my_string to,const char *from);
extern my_string directory_file_name(my_string dst, const char *src);
extern int pack_filename(my_string to, const char *name, size_s max_length);
extern my_string my_path(my_string to,const char *progname,
			 const char *own_pathname_part);
extern my_string my_load_path(my_string to, const char *path,
			      const char *own_path_prefix);
extern int wild_compare(const char *str,const char *wildstr);
extern my_string my_strcasestr(const char *src,const char *suffix);
extern int my_strcasecmp(const char *s,const char *t);
extern int my_strsortcmp(const char *s,const char *t);
extern int my_casecmp(const char *s,const char *t,uint length);
extern int my_sortcmp(const char *s,const char *t,uint length);
extern int my_sortncmp(const char *s,uint s_len, const char *t,uint t_len);
extern WF_PACK *wf_comp(my_string str);
extern int wf_test(struct wild_file_pack *wf_pack,const char *name);
extern void wf_end(struct wild_file_pack *buffer);
extern size_s stripp_sp(my_string str);
extern void get_date(my_string to,int timeflag,time_t use_time);
extern void soundex(my_string out_pntr, my_string in_pntr,pbool remove_garbage);
extern int init_record_cache(RECORD_CACHE *info,uint cachesize,File file,
			     uint reclength,enum cache_type type,
			     pbool use_async_io);
extern int read_cache_record(RECORD_CACHE *info,byte *to);
extern int end_record_cache(RECORD_CACHE *info);
extern int write_cache_record(RECORD_CACHE *info,my_off_t filepos,
			      const byte *record,uint length);
extern int flush_write_cache(RECORD_CACHE *info);
extern long my_clock(void);
extern sig_handler sigtstp_handler(int signal_number);
extern void handle_recived_signals(void);
extern int init_key_cache(ulong use_mem,ulong leave_this_much_mem);
extern byte *key_cache_read(File file,my_off_t filepos,byte* buff,uint length,
			    uint block_length,int return_buffer);
extern int key_cache_write(File file,my_off_t filepos,byte* buff,uint length,
			   uint block_length,int force_write);
extern int flush_key_blocks(int file, enum flush_type type);
extern void end_key_cache(void);
extern sig_handler my_set_alarm_variable(int signo);
extern void my_string_ptr_sort(void *base,uint items,size_s size);
extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements,
				  size_s size_of_element,uchar *buffer[]);
extern qsort_t qsort2(void *base_ptr, size_t total_elems, size_t size,
		      qsort2_cmp cmp, void *cmp_argument);
extern qsort2_cmp get_ptr_compare(uint);
extern int init_io_cache(IO_CACHE *info,File file,uint cachesize,
			 enum cache_type type,my_off_t seek_offset,
			 pbool use_async_io, myf cache_myflags);
extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type,
			       my_off_t seek_offset,pbool use_async_io,
			       pbool clear_cache);
extern int _my_b_read(IO_CACHE *info,byte *Buffer,uint Count);
674 675 676 677 678 679
#ifdef THREAD
extern int _my_b_read_r(IO_CACHE *info,byte *Buffer,uint Count);
extern int init_io_cache_share(IO_CACHE *info,
                             IO_CACHE_SHARE *s, uint num_threads);
extern int remove_io_thread(IO_CACHE *info);
#endif
sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
680
extern int _my_b_seq_read(IO_CACHE *info,byte *Buffer,uint Count);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
681 682 683 684
extern int _my_b_net_read(IO_CACHE *info,byte *Buffer,uint Count);
extern int _my_b_get(IO_CACHE *info);
extern int _my_b_async_read(IO_CACHE *info,byte *Buffer,uint Count);
extern int _my_b_write(IO_CACHE *info,const byte *Buffer,uint Count);
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
685
extern int my_b_append(IO_CACHE *info,const byte *Buffer,uint Count);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
686 687
extern int my_block_write(IO_CACHE *info, const byte *Buffer,
			  uint Count, my_off_t pos);
688 689 690 691
extern int _flush_io_cache(IO_CACHE *info, int need_append_buffer_lock);

#define flush_io_cache(info) _flush_io_cache((info),1)

bk@work.mysql.com's avatar
bk@work.mysql.com committed
692
extern int end_io_cache(IO_CACHE *info);
693 694 695 696
extern uint my_b_fill(IO_CACHE *info);
extern void my_b_seek(IO_CACHE *info,my_off_t pos);
extern uint my_b_gets(IO_CACHE *info, char *to, uint max_length);
extern uint my_b_printf(IO_CACHE *info, const char* fmt, ...);
697
extern uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
698 699 700 701 702
extern my_bool open_cached_file(IO_CACHE *cache,const char *dir,
				 const char *prefix, uint cache_size,
				 myf cache_myflags);
extern my_bool real_open_cached_file(IO_CACHE *cache);
extern void close_cached_file(IO_CACHE *cache);
703 704
File create_temp_file(char *to, const char *dir, const char *pfx,
		      int mode, myf MyFlags);
705 706 707
#define my_init_dynamic_array(A,B,C,D) init_dynamic_array(A,B,C,D CALLER_INFO)
#define my_init_dynamic_array_ci(A,B,C,D) init_dynamic_array(A,B,C,D ORIG_CALLER_INFO)
extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array,uint element_size,
708
	  uint init_alloc,uint alloc_increment CALLER_INFO_PROTO);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726
extern my_bool insert_dynamic(DYNAMIC_ARRAY *array,gptr element);
extern byte *alloc_dynamic(DYNAMIC_ARRAY *array);
extern byte *pop_dynamic(DYNAMIC_ARRAY*);
extern my_bool set_dynamic(DYNAMIC_ARRAY *array,gptr element,uint array_index);
extern void get_dynamic(DYNAMIC_ARRAY *array,gptr element,uint array_index);
extern void delete_dynamic(DYNAMIC_ARRAY *array);
extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
extern void freeze_size(DYNAMIC_ARRAY *array);
#define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element)
#define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index))
#define push_dynamic(A,B) insert_dynamic(A,B)

extern int find_type(my_string x,TYPELIB *typelib,uint full_name);
extern void make_type(my_string to,uint nr,TYPELIB *typelib);
extern const char *get_type(TYPELIB *typelib,uint nr);
extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
				   uint init_alloc,uint alloc_increment);
extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append);
727 728
my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
			  uint length);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
729 730 731 732 733 734 735 736 737 738 739 740 741 742
extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str);
extern my_bool dynstr_realloc(DYNAMIC_STRING *str, ulong additional_size);
extern void dynstr_free(DYNAMIC_STRING *str);
void set_all_changeable_vars(CHANGEABLE_VAR *vars);
my_bool set_changeable_var(my_string str,CHANGEABLE_VAR *vars);
my_bool set_changeable_varval(const char *var, ulong val,
			      CHANGEABLE_VAR *vars);
#ifdef HAVE_MLOCK
extern byte *my_malloc_lock(uint length,myf flags);
extern void my_free_lock(byte *ptr,myf flags);
#else
#define my_malloc_lock(A,B) my_malloc((A),(B))
#define my_free_lock(A,B) my_free((A),(B))
#endif
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
743
#define alloc_root_inited(A) ((A)->min_malloc != 0)
744
void init_alloc_root(MEM_ROOT *mem_root, uint block_size, uint pre_alloc_size);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
745
gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size);
746
void free_root(MEM_ROOT *root, myf MyFLAGS);
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
747
void set_prealloc_root(MEM_ROOT *root, char *ptr);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
748
char *strdup_root(MEM_ROOT *root,const char *str);
749
char *strmake_root(MEM_ROOT *root,const char *str,uint len);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
750 751 752 753 754 755 756 757 758
char *memdup_root(MEM_ROOT *root,const char *str,uint len);
void load_defaults(const char *conf_file, const char **groups,
		   int *argc, char ***argv);
void free_defaults(char **argv);
void print_defaults(const char *conf_file, const char **groups);
my_bool my_compress(byte *, ulong *, ulong *);
my_bool my_uncompress(byte *, ulong *, ulong *);
byte *my_compress_alloc(const byte *packet, ulong *len, ulong *complen);
ulong checksum(const byte *mem, uint count);
759
uint my_bit_log2(ulong value);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
760

sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
761 762 763 764 765 766
#if defined(SAFE_MUTEX) && !defined(DBUG_OFF)
#define DBUG_ASSERT_LOCK(lock) DBUG_ASSERT((lock)->count == 1 && \
				   (lock)->thread == pthread_self())
#else
#define DBUG_ASSERT_LOCK(lock)
#endif
767

bk@work.mysql.com's avatar
bk@work.mysql.com committed
768 769 770 771 772 773 774
#if defined(_MSC_VER) && !defined(__WIN__)
extern void sleep(int sec);
#endif
#ifdef __WIN__
extern my_bool have_tcpip;		/* Is set if tcpip is used */
#endif

775
C_MODE_END
bk@work.mysql.com's avatar
bk@work.mysql.com committed
776 777
#include "raid.h"
#endif /* _my_sys_h */