summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
Diffstat (limited to 'mysys')
-rw-r--r--mysys/Makefile.am2
-rw-r--r--mysys/errors.c8
-rw-r--r--mysys/my_new.cc4
-rw-r--r--mysys/my_sync.c60
-rw-r--r--mysys/my_thr_init.c9
-rw-r--r--mysys/thr_alarm.c7
6 files changed, 82 insertions, 8 deletions
diff --git a/mysys/Makefile.am b/mysys/Makefile.am
index 5ff682fbc80..37c79e28395 100644
--- a/mysys/Makefile.am
+++ b/mysys/Makefile.am
@@ -47,7 +47,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\
my_delete.c my_rename.c my_redel.c my_tempnam.c \
my_chsize.c my_lread.c my_lwrite.c my_clock.c \
my_quick.c my_lockmem.c my_static.c \
- my_getopt.c my_mkdir.c \
+ my_sync.c my_getopt.c my_mkdir.c \
default.c my_compress.c checksum.c raid.cc \
my_net.c my_semaphore.c my_port.c my_sleep.c \
charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
diff --git a/mysys/errors.c b/mysys/errors.c
index a2226fc12c5..255b6893c73 100644
--- a/mysys/errors.c
+++ b/mysys/errors.c
@@ -48,6 +48,7 @@ const char * NEAR globerrs[GLOBERRS]=
"Can't read value for symlink '%s' (Error %d)",
"Can't create symlink '%s' pointing at '%s' (Error %d)",
"Error on realpath() on '%s' (Error %d)",
+ "Can't sync file '%s' to disk (Errcode: %d)",
};
void init_glob_errs(void)
@@ -84,8 +85,9 @@ void init_glob_errs()
EE(EE_CANT_MKDIR) ="Can't create directory '%s' (Errcode: %d)";
EE(EE_UNKNOWN_CHARSET)= "Character set '%s' is not a compiled character set and is not specified in the %s file";
EE(EE_OUT_OF_FILERESOURCES)="Out of resources when opening file '%s' (Errcode: %d)";
- EE(EE_CANT_READLINK)="Can't read value for symlink '%s' (Error %d)";
- EE(EE_CANT_SYMLINK)="Can't create symlink '%s' pointing at '%s' (Error %d)";
- EE(EE_REALPATH)="Error on realpath() on '%s' (Error %d)";
+ EE(EE_CANT_READLINK)= "Can't read value for symlink '%s' (Error %d)";
+ EE(EE_CANT_SYMLINK)= "Can't create symlink '%s' pointing at '%s' (Error %d)";
+ EE(EE_REALPATH)= "Error on realpath() on '%s' (Error %d)";
+ EE(EE_SYNC)= "Can't sync file '%s' to disk (Errcode: %d)";
}
#endif
diff --git a/mysys/my_new.cc b/mysys/my_new.cc
index 5cc291af9aa..5f2da90bbd1 100644
--- a/mysys/my_new.cc
+++ b/mysys/my_new.cc
@@ -25,12 +25,12 @@
void *operator new (size_t sz)
{
- return (void *) malloc (sz ? sz+1 : sz);
+ return (void *) malloc (sz ? sz : 1);
}
void *operator new[] (size_t sz)
{
- return (void *) malloc (sz ? sz+1 : sz);
+ return (void *) malloc (sz ? sz : 1);
}
void operator delete (void *ptr)
diff --git a/mysys/my_sync.c b/mysys/my_sync.c
new file mode 100644
index 00000000000..317ca039346
--- /dev/null
+++ b/mysys/my_sync.c
@@ -0,0 +1,60 @@
+/* Copyright (C) 2003 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,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ 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 */
+
+#include "mysys_priv.h"
+#include "mysys_err.h"
+#include <errno.h>
+
+/*
+ Sync data in file to disk
+
+ SYNOPSIS
+ my_sync()
+ fd File descritor to sync
+ my_flags Flags (now only MY_WME is supported)
+
+ NOTE
+ If file system supports its, only file data is synced, not inode date
+
+ RETURN
+ 0 ok
+ -1 error
+*/
+
+int my_sync(File fd, myf my_flags)
+{
+ int res;
+ DBUG_ENTER("my_sync");
+ DBUG_PRINT("my",("Fd: %d my_flags: %d", fd, my_flags));
+
+#if defined(HAVE_FDATASYNC)
+ res= fdatasync(fd);
+#elif defined(HAVE_FSYNC)
+ res=fsync(fd);
+#elif defined(__WIN__)
+ res= _commit(fd);
+#else
+ res= 0; /* No sync (strange OS) */
+#endif
+ if (res)
+ {
+ if (!(my_errno= errno))
+ my_errno= -1; /* Unknown error */
+ if (my_flags & MY_WME)
+ my_error(EE_SYNC, MYF(ME_BELL+ME_WAITTANG), my_filename(fd), my_errno);
+ }
+ DBUG_RETURN(res);
+} /* my_read */
diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c
index 32bc8ea3724..9ee7371b639 100644
--- a/mysys/my_thr_init.c
+++ b/mysys/my_thr_init.c
@@ -159,6 +159,7 @@ my_bool my_thread_init(void)
tmp->id= ++thread_id;
pthread_mutex_init(&tmp->mutex,MY_MUTEX_INIT_FAST);
pthread_cond_init(&tmp->suspend, NULL);
+ tmp->init= 1;
end:
#if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX)
@@ -170,12 +171,14 @@ end:
void my_thread_end(void)
{
- struct st_my_thread_var *tmp=my_thread_var;
+ struct st_my_thread_var *tmp;
+ tmp= my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys);
+
#ifdef EXTRA_DEBUG_THREADS
fprintf(stderr,"my_thread_end(): tmp=%p,thread_id=%ld\n",
tmp,pthread_self());
#endif
- if (tmp)
+ if (tmp && tmp->init)
{
#if !defined(DBUG_OFF)
/* tmp->dbug is allocated inside DBUG library */
@@ -191,6 +194,8 @@ void my_thread_end(void)
pthread_mutex_destroy(&tmp->mutex);
#if (!defined(__WIN__) && !defined(OS2)) || defined(USE_TLS)
free(tmp);
+#else
+ tmp->init= 0;
#endif
}
/* The following free has to be done, even if my_thread_var() is 0 */
diff --git a/mysys/thr_alarm.c b/mysys/thr_alarm.c
index 36bbac16fef..bf40ffc5b4d 100644
--- a/mysys/thr_alarm.c
+++ b/mysys/thr_alarm.c
@@ -714,6 +714,9 @@ void thr_alarm_info(ALARM_INFO *info)
bzero((char*) info, sizeof(*info));
}
+void resize_thr_alarm(uint max_alarms)
+{
+}
/*****************************************************************************
thr_alarm for win95
@@ -793,6 +796,10 @@ void thr_alarm_info(ALARM_INFO *info)
bzero((char*) info, sizeof(*info));
}
+void resize_thr_alarm(uint max_alarms)
+{
+}
+
#endif /* __WIN__ */
#endif /* THREAD */