<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>petermao的技术blog &#187; leveldb env</title>
	<atom:link href="http://www.petermao.com/tag/leveldb-env/feed" rel="self" type="application/rss+xml" />
	<link>http://www.petermao.com</link>
	<description>欢迎探讨，共同进步</description>
	<lastBuildDate>Fri, 17 Feb 2017 07:03:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>leveldb注释4–平台相关</title>
		<link>http://www.petermao.com/leveldb/leveldb-4-port.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=leveldb-4-port</link>
		<comments>http://www.petermao.com/leveldb/leveldb-4-port.html#comments</comments>
		<pubDate>Sun, 07 Jul 2013 11:10:20 +0000</pubDate>
		<dc:creator>petermao</dc:creator>
				<category><![CDATA[leveldb]]></category>
		<category><![CDATA[leveldb env]]></category>
		<category><![CDATA[leveldb port_posix]]></category>
		<category><![CDATA[存储]]></category>
		<category><![CDATA[源码分析]]></category>

		<guid isPermaLink="false">http://www.petermao.com/?p=539</guid>
		<description><![CDATA[0 编译 leveldb没有使用autoconf/automake来生成Makefile，而是自己编写了Makefile以及平台检测脚本。Makefile中会先调用检测脚本build_detect_platform，并将设置的环境变量保存在build_config.mk文件里。随后Makefile会include build_config.mk文件以进行编译，相关Makefile代码如下，其中的PLATFORM_CCFLAGS等参数将在build_detect_platform中设置并输出给build_config.mk文件： --- # detect what platform we're building on $(shell CC=$(CC) CXX=$(CXX) TARGET_OS=$(TARGET_OS) \ ./build_detect_platform build_config.mk ./) # this file is generated by the previous line to set build flags and sources include build_config.mk CFLAGS += -I. &#8230; <a href="http://www.petermao.com/leveldb/leveldb-4-port.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>0 编译<br />
leveldb没有使用autoconf/automake来生成Makefile，而是自己编写了Makefile以及平台检测脚本。Makefile中会先调用检测脚本build_detect_platform，并将设置的环境变量保存在build_config.mk文件里。随后Makefile会include build_config.mk文件以进行编译，相关Makefile代码如下，其中的PLATFORM_CCFLAGS等参数将在build_detect_platform中设置并输出给build_config.mk文件：<span id="more-539"></span></p>
<pre class="wp-code-highlight prettyprint">
---
# detect what platform we're building on
$(shell CC=$(CC) CXX=$(CXX) TARGET_OS=$(TARGET_OS) \
    ./build_detect_platform build_config.mk ./)
# this file is generated by the previous line to set build flags and sources
include build_config.mk

CFLAGS += -I. -I./include $(PLATFORM_CCFLAGS) $(OPT)
CXXFLAGS += -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT)

LDFLAGS += $(PLATFORM_LDFLAGS)
LIBS += $(PLATFORM_LIBS)
---
</pre>
<p>build_detect_platform脚本内部使用&#8217;uname -s&#8217;命令来检测类Unix/Linux操作系统的各版本并设置合适的变量(如CC/PLATFORM等变量，以及选择合适的底层平台文件，主要是port/port_posix.cc)，然后会依次检测编译环境中是否支持c++ 0x、snappy、tcmalloc，比如检测snappy是否安装的代码如下，对于snappy，若已安装，则会定义-DSNAPPY宏：</p>
<pre class="wp-code-highlight prettyprint">
    # Test whether Snappy library is installed
    # http://code.google.com/p/snappy/
    $CXX $CXXFLAGS -x c++ - -o /dev/null 2&gt;/dev/null  &lt;&lt;EOF
      #include &lt;snappy.h&gt;
      int main() {}
EOF
    if [ &quot;$?&quot; = 0 ]; then
        COMMON_FLAGS=&quot;$COMMON_FLAGS -DSNAPPY&quot;
        PLATFORM_LIBS=&quot;$PLATFORM_LIBS -lsnappy&quot;
    fi
</pre>
<p>如果你想更进一步，连leveldb本身提供的Makefile都不想使用，你想将源代码集成进来，则只需要注意包含port/port_posix.cc文件或者其他合适的跨平台文件，以及定义合适的平台参数，比如对于POSIX环境，可简单的使用&#8217;-DLEVELDB_PLATFORM_POSIX&#8217;就可以编译。</p>
<p>这里简单介绍了leveldb的编译过程，下面来看看其对平台的具体支持。</p>
<p>leveldb大致通过3层来实现平台语义的支持。<br />
第一层是对外接口，在env.cc/.h与mutexlock.h中实现，mutexlock.h提供了锁的上层接口，而env则主要提供了文件与线程操作的上层接口。这部分代码对于不同平台没有多大差别。主要定义了一个抽象接口。<br />
第二层是文件与线程操作的实际实现，对于posix，则为env_posix.cc。<br />
第三层则是一些原子操作的封装，比如信号、锁等。对于posix，对应的文件为port_posix.cc/.h。</p>
<p>第一层：<br />
Env：环境对象，提供文件、目录、线程等的操作接口。用户可自定义新Env对象，以加强对系统的控制；否则会使用默认的Env对象。对于posix，就是PosixEnv对象。<br />
SequentialFile：顺序读文件<br />
RandomAccessFile：随机读文件<br />
WritableFile：顺序写文件<br />
FileLock：文件锁</p>
<p>第二层：<br />
PosixSequentialFile是对SequentialFile接口的实现，也就是简单调用fread读文件。<br />
posix的RandomAccessFile实现有两个，一个是PosixRandomAccessFile，另一个是PosixMmapReadableFile，前者调用pread读取指定偏移的文件数据，后者为使用mmap来读取文件。<br />
PosixMmapFile是对WritableFile接口的实现，始终使用mmap来写文件。</p>
<p>最终的PosixEnv对象通过调用这些子类来对外提供服务。对于随机读文件，在64位环境下，最多允许1000个文件使用mmap的方式，其他则使用pread方式。</p>
<p>第三层：<br />
利用C++的语言特性定义了Mutex、CondVar，以在使用过程中自动释放pthread_mutex_t、pthread_cond_t资源。另外，也提供了Snappy的操作接口：Snappy_Compress与Snappy_Uncompress。</p>
<p>大部分代码并不复杂，这里就不一一分析了。</p>
<p>helpers/memenv目录下实现了自定义的Env类 &#8212; InMemoryEnv，完全基于内存操作的Env对象，对自定义Env对象感兴趣的可了解下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.petermao.com/leveldb/leveldb-4-port.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
