summaryrefslogtreecommitdiff
path: root/mysys/my_pread.c
diff options
context:
space:
mode:
Diffstat (limited to 'mysys/my_pread.c')
-rw-r--r--mysys/my_pread.c69
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))
{