# define os_file_read(file, buf, offset, offset_high, n)        \
    os_file_read_func(file, buf, offset, offset_high, n)
/*******************************************************************//**
NOTE! Use the corresponding macro os_file_read(), not directly this
function!
Requests a synchronous positioned read operation.
@return    TRUE if request was successful, FALSE if fail */
UNIV_INTERN
ibool
os_file_read_func(
/*==============*/
    os_file_t    file,    /*!< in: handle to a file */
    void*        buf,    /*!< in: buffer where to read */
    ulint        offset,    /*!< in: least significant 32 bits of file
                offset where to read */
    ulint        offset_high, /*!< in: most significant 32 bits of
                offset */
    ulint        n)    /*!< in: number of bytes to read */
{
#ifdef __WIN__
    BOOL        ret;
    DWORD        len;
    DWORD        ret2;
    DWORD        low;
    DWORD        high;
    ibool        retry;
#ifndef UNIV_HOTBACKUP
    ulint        i;
#endif /* !UNIV_HOTBACKUP */

    /* On 64-bit Windows, ulint is 64 bits. But offset and n should be
    no more than 32 bits. */
    ut_a((offset & 0xFFFFFFFFUL) == offset);
    ut_a((n & 0xFFFFFFFFUL) == n);

    os_n_file_reads++;
    os_bytes_read_since_printout += n;

try_again:
    ut_ad(file);
    ut_ad(buf);
    ut_ad(n > );

    low = (DWORD) offset;
    high = (DWORD) offset_high;

    os_mutex_enter(os_file_count_mutex);
    os_n_pending_reads++;
    os_mutex_exit(os_file_count_mutex);

#ifndef UNIV_HOTBACKUP
    /* Protect the seek / read operation with a mutex */
    i = ((ulint) file) % OS_FILE_N_SEEK_MUTEXES;

    os_mutex_enter(os_file_seek_mutexes[i]);
#endif /* !UNIV_HOTBACKUP */

    ret2 = SetFilePointer(file, low, &high, FILE_BEGIN);

    if (ret2 == 0xFFFFFFFF && GetLastError() != NO_ERROR) {

#ifndef UNIV_HOTBACKUP
        os_mutex_exit(os_file_seek_mutexes[i]);
#endif /* !UNIV_HOTBACKUP */

        os_mutex_enter(os_file_count_mutex);
        os_n_pending_reads--;
        os_mutex_exit(os_file_count_mutex);

        goto error_handling;
    }

    ret = ReadFile(file, buf, (DWORD) n, &len, NULL);

#ifndef UNIV_HOTBACKUP
    os_mutex_exit(os_file_seek_mutexes[i]);
#endif /* !UNIV_HOTBACKUP */

    os_mutex_enter(os_file_count_mutex);
    os_n_pending_reads--;
    os_mutex_exit(os_file_count_mutex);

    if (ret && len == n) {
        return(TRUE);
    }
#else /* __WIN__ */
    ibool    retry;
    ssize_t    ret;

    os_bytes_read_since_printout += n;

try_again:
    ret = os_file_pread(file, buf, n, offset, offset_high); //读取数据 详见    if ((ulint)ret == n) {

        return(TRUE);
    }

    fprintf(stderr,
        "InnoDB: Error: tried to read %lu bytes at offset %lu %lu.\n"
        "InnoDB: Was only able to read %ld.\n",
        (ulong)n, (ulong)offset_high,
        (ulong)offset, (long)ret);
#endif /* __WIN__ */
#ifdef __WIN__
error_handling:
#endif
    retry = os_file_handle_error(NULL, "read");

    if (retry) {
        goto try_again;
    }

    fprintf(stderr,
        "InnoDB: Fatal error: cannot read from file."
        " OS error number %lu.\n",
#ifdef __WIN__
        (ulong) GetLastError()
#else
        (ulong) errno
#endif
        );
    fflush(stderr);

    ut_error;

    return(FALSE);
}

宏os_file_read_func的更多相关文章

  1. Visual Studio 宏的高级用法

    因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...

  2. VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用

    CSDN原博文:http://blog.csdn.net/houkai363/article/details/8134787 遇到了:不能将参数 1 从“const char [5]”转换为“LPCT ...

  3. 【转】linux内核中writesb(), writesw(), writesl() 宏函数

    writesb(), writesw(), writesl() 宏函数 功能 : writesb()    I/O 上写入 8 位数据流数据 (1字节) writesw()   I/O  上写入 16 ...

  4. c++宏定义命令

    在程序开始以#开头的命令,他们是预编译命令.有三类预编译命令:宏定义命令.文件包含命令.条件编译命令:今天聊聊宏定义: 宏定义命令将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替 ...

  5. dll导入导出宏定义,出现“不允许 dllimport 函数 的定义”的问题分析

    建立dll项目后,在头文件中,定义API宏 #ifndef API_S_H #define API_S_H ...... #ifndef DLL_S_20160424 #define API _dec ...

  6. VC++/MFC 最常用宏和指令

    1.#include指令  包含指定的文件,最基本的最熟悉的指令,编程中不得不用,包含库文件用双尖括号,包含自定义头文件用双引号. 2.#define指令   预定义,通常用它来定义常量(包括无参量与 ...

  7. [Sass]混合宏的参数

    [Sass]混合宏的参数--传一个不带值的参数 Sass 的混合宏有一个强大的功能,可以传参,那么在 Sass 中传参主要有以下几种情形: A) 传一个不带值的参数 在混合宏中,可以传一个不带任何值的 ...

  8. [Sass]混合宏

    [Sass]混合宏-声明混合宏 如果整个网站中有几处小样式类似,比如颜色,字体等,在 Sass 可以使用变量来统一处理,那么这种选择还是不错的.但当你的样式变得越来越复杂,需要重复使用大段的样式时,使 ...

  9. BOOST_AUTO宏

    在boost中,有个非常不错的宏BOOST_AUTO(),它的作用是自动给var定义类型,适合function()函数返回的值的类型. int function() { ; } main() { BO ...

随机推荐

  1. Careercup - Facebook面试题 - 6139456847347712

    2014-05-01 01:50 题目链接 原题: Microsoft Excel numbers cells ... and after that AA, AB.... AAA, AAB...ZZZ ...

  2. Netsharp快速入门(之12) 销售管理(开发发货单工作区)

    作者:秋时 杨昶   时间:2014-02-15  转载须说明出处 4.4     发货单 4.4.1  部件工作区设置 1.设置部件工作区,需要设置的部件如下 2.设置单据和明细列表的字段,设置完成 ...

  3. java多线程为什么要用while而不是if

    对于java多线程的wait()方法,我们在jdk1.6的说明文档里可以看到这样一段话 从上面的截图,我们可以看出,在使用wait方法时,需要使用while循环来判断条件十分满足,而不是if,那么我们 ...

  4. 【BZOJ】【1103】【POI2007】大都市meg

    dfs序 模板题,进点+1出点-1,刚好对于不在路径上的点一进一出刚好抵消,由于本题要动态修改(变成公路以后+1-1都变成0)所以在序列上套一个树状数组即可. TLE:1.递归dfs给爆了……写了个手 ...

  5. Matlab中cell2mat的使用

    binIndices是1*50的cell,每个cell是的1*n(n不定),那么cell2mat(binIndices)得到的是1*sum(cellfun(@length,binIndices))的行 ...

  6. 【机器学习】BP神经网络实现手写数字识别

    最近用python写了一个实现手写数字识别的BP神经网络,BP的推导到处都是,但是一动手才知道,会理论推导跟实现它是两回事.关于BP神经网络的实现网上有一些代码,可惜或多或少都有各种问题,在下手写了一 ...

  7. Oracle中的 UPDATE FROM 解决方法

    转:http://www.cnblogs.com/JasonLiao/archive/2009/12/23/1630895.html Oracle中的 UPDATE FROM 解决方法 在表的更新操作 ...

  8. hdu 2112 HDU Today (最短路,字符处理)

    题目 题目很简单,只是多了对地名转化为数字的处理,好吧,这我也是参考网上的处理办法,不过大多数的人采用map来处理 注意初始化注意范围,不然会wa!!!(这是我当时wa的原因org) 大家容易忽视的地 ...

  9. Ubuntu环境下手动配置ElasticSearch0.90.5

    1 下载elasticsearch-0.90.5 2 修改配置(可选) 修改内存:(可选) bin/elasticsearch.in.sh中: ES_MIN_MEM ES_MAX_MEM 修改搜索引擎 ...

  10. 学习selenium需要具备的知识或技术

    因为有QTP和JAVA的基础,selenium学起来会快很多,总结下学习selenium所需要具备的知识或技术 1.selenium进行的自动化测试是基于ui层面的,所以html,css,javasc ...