diff options
Diffstat (limited to 'mysys/my_pread.c')
-rw-r--r-- | mysys/my_pread.c | 69 |
1 files changed, 20 insertions, 49 deletions
diff --git a/mysys/my_pread.c b/mysys/my_pread.c index e006360c11b..9d513a08418 100644 --- a/mysys/my_pread.c +++ b/mysys/my_pread.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB, 2008-2009 Sun Microsystems, Inc +/* 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 @@ -18,12 +18,10 @@ #include "my_base.h" #include <m_string.h> #include <errno.h> -#if defined (HAVE_PREAD) && !defined(_WIN32) +#ifndef _WIN32 #include <unistd.h> #endif - - /* Read a chunk of bytes from a file from a given position @@ -50,49 +48,34 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, { size_t readbytes; int error= 0; -#if !defined (HAVE_PREAD) && !defined (_WIN32) - int save_errno; -#endif + DBUG_ENTER("my_pread"); DBUG_PRINT("my",("fd: %d Seek: %llu Buffer: %p Count: %lu MyFlags: %d", Filedes, (ulonglong)offset, Buffer, (ulong)Count, MyFlags)); for (;;) { errno= 0; /* Linux, Windows don't reset this on EOF/success */ -#if !defined (HAVE_PREAD) && !defined (_WIN32) - mysql_mutex_lock(&my_file_info[Filedes].mutex); - readbytes= (uint) -1; - error= (lseek(Filedes, offset, MY_SEEK_SET) == (my_off_t) -1 || - (readbytes= read(Filedes, Buffer, Count)) != Count); - save_errno= errno; - mysql_mutex_unlock(&my_file_info[Filedes].mutex); - if (error) - errno= save_errno; -#else -#if defined(_WIN32) +#ifdef _WIN32 readbytes= my_win_pread(Filedes, Buffer, Count, offset); -#else +#else readbytes= pread(Filedes, Buffer, Count, offset); #endif - error= (readbytes != Count); -#endif - if(error) + error = (readbytes != Count); + + if (error) { my_errno= errno ? errno : -1; if (errno == 0 || (readbytes != (size_t) -1 && - (MyFlags & (MY_NABP | MY_FNABP)))) - my_errno= HA_ERR_FILE_TOO_SHORT; - + (MyFlags & (MY_NABP | MY_FNABP)))) + my_errno= HA_ERR_FILE_TOO_SHORT; DBUG_PRINT("warning",("Read only %d bytes off %u from %d, errno: %d", (int) readbytes, (uint) Count,Filedes,my_errno)); - if ((readbytes == 0 || readbytes == (size_t) -1) && errno == EINTR) { DBUG_PRINT("debug", ("my_pread() was interrupted and returned %d", (int) readbytes)); continue; /* Interrupted */ } - if (MyFlags & (MY_WME | MY_FAE | MY_FNABP)) { if (readbytes == (size_t) -1) @@ -133,50 +116,38 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, # Number of bytes read */ -size_t my_pwrite(File Filedes, const uchar *Buffer, size_t Count, +size_t my_pwrite(int Filedes, const uchar *Buffer, size_t Count, my_off_t offset, myf MyFlags) { size_t writtenbytes, written; uint errors; - DBUG_ENTER("my_pwrite"); DBUG_PRINT("my",("fd: %d Seek: %llu Buffer: %p Count: %lu MyFlags: %d", - Filedes, offset, Buffer, (ulong)Count, MyFlags)); + Filedes, (ulonglong)offset, Buffer, (ulong)Count, MyFlags)); errors= 0; written= 0; for (;;) { -#if !defined (HAVE_PREAD) && !defined (_WIN32) - int error; - writtenbytes= (size_t) -1; - mysql_mutex_lock(&my_file_info[Filedes].mutex); - error= (lseek(Filedes, offset, MY_SEEK_SET) != (my_off_t) -1 && - (writtenbytes= write(Filedes, Buffer, Count)) == Count); - mysql_mutex_unlock(&my_file_info[Filedes].mutex); - if (error) - break; -#elif defined (_WIN32) - writtenbytes= my_win_pwrite(Filedes, Buffer, Count, offset); +#ifdef _WIN32 + writtenbytes= my_win_pwrite(Filedes, Buffer, Count,offset); #else writtenbytes= pwrite(Filedes, Buffer, Count, offset); #endif - if(writtenbytes == Count) + if (writtenbytes == Count) break; my_errno= errno; if (writtenbytes != (size_t) -1) - { - written+= writtenbytes; - Buffer+= writtenbytes; - Count-= writtenbytes; - offset+= writtenbytes; + { /* Safegueard */ + written+=writtenbytes; + Buffer+=writtenbytes; + Count-=writtenbytes; + offset+=writtenbytes; } DBUG_PRINT("error",("Write only %u bytes", (uint) writtenbytes)); #ifndef NO_BACKGROUND - if (my_thread_var->abort) MyFlags&= ~ MY_WAIT_IF_FULL; /* End if aborted by user */ - if ((my_errno == ENOSPC || my_errno == EDQUOT) && (MyFlags & MY_WAIT_IF_FULL)) { |