Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Side by Side Diff: src/core/SkStream.cpp

Issue 14336003: Move MMap to SkData. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Work on Linux. Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/core/SkData.cpp ('k') | src/ports/SkOSFile_stdio.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkStream.h" 10 #include "SkStream.h"
11 #include "SkData.h" 11 #include "SkData.h"
12 #include "SkFixed.h" 12 #include "SkFixed.h"
13 #include "SkString.h" 13 #include "SkString.h"
14 #include "SkOSFile.h" 14 #include "SkOSFile.h"
15 15
16 #if SK_MMAP_SUPPORT
17 #include <unistd.h>
18 #include <sys/mman.h>
19 #include <fcntl.h>
20 #include <errno.h>
21 #include <unistd.h>
22 #endif
23
24 SK_DEFINE_INST_COUNT(SkStream) 16 SK_DEFINE_INST_COUNT(SkStream)
25 SK_DEFINE_INST_COUNT(SkWStream) 17 SK_DEFINE_INST_COUNT(SkWStream)
26 SK_DEFINE_INST_COUNT(SkFILEStream) 18 SK_DEFINE_INST_COUNT(SkFILEStream)
27 SK_DEFINE_INST_COUNT(SkFDStream) 19 SK_DEFINE_INST_COUNT(SkFDStream)
28 SK_DEFINE_INST_COUNT(SkMemoryStream) 20 SK_DEFINE_INST_COUNT(SkMemoryStream)
29 SK_DEFINE_INST_COUNT(SkBufferStream) 21 SK_DEFINE_INST_COUNT(SkBufferStream)
30 SK_DEFINE_INST_COUNT(SkFILEWStream) 22 SK_DEFINE_INST_COUNT(SkFILEWStream)
31 SK_DEFINE_INST_COUNT(SkMemoryWStream) 23 SK_DEFINE_INST_COUNT(SkMemoryWStream)
32 SK_DEFINE_INST_COUNT(SkDynamicMemoryWStream) 24 SK_DEFINE_INST_COUNT(SkDynamicMemoryWStream)
33 SK_DEFINE_INST_COUNT(SkDebugWStream) 25 SK_DEFINE_INST_COUNT(SkDebugWStream)
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 s[size] = 0; 781 s[size] = 0;
790 SkDebugf("%s", s); 782 SkDebugf("%s", s);
791 delete[] s; 783 delete[] s;
792 #endif 784 #endif
793 return true; 785 return true;
794 } 786 }
795 787
796 /////////////////////////////////////////////////////////////////////////////// 788 ///////////////////////////////////////////////////////////////////////////////
797 /////////////////////////////////////////////////////////////////////////////// 789 ///////////////////////////////////////////////////////////////////////////////
798 790
799 static bool mmap_filename(const char path[], void** addrPtr, size_t* sizePtr) { 791
800 #if SK_MMAP_SUPPORT 792 static SkData* mmap_filename(const char path[]) {
reed1 2013/04/24 19:07:49 A nice illustration of the utility of SkData::NewF
801 int fd = open(path, O_RDONLY); 793 SkFILE* file = sk_fopen(path, kRead_SkFILE_Flag);
802 if (fd < 0) { 794 if (NULL == file) {
803 return false; 795 return NULL;
804 } 796 }
805 797
806 off_t offset = lseek(fd, 0, SEEK_END); // find the file size 798 SkData* data = SkData::NewFromFILE(file);
807 if (offset == -1) { 799 sk_fclose(file);
808 close(fd); 800 return data;
809 return false;
810 }
811 (void)lseek(fd, 0, SEEK_SET); // restore file offset to beginning
812
813 // to avoid a 64bit->32bit warning, I explicitly create a size_t size
814 size_t size = static_cast<size_t>(offset);
815
816 void* addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
817 close(fd);
818
819 if (MAP_FAILED == addr) {
820 return false;
821 }
822
823 *addrPtr = addr;
824 *sizePtr = size;
825 return true;
826 #else
827 return false;
828 #endif
829 } 801 }
830 802
831 SkStream* SkStream::NewFromFile(const char path[]) { 803 SkStream* SkStream::NewFromFile(const char path[]) {
832 void* addr; 804 SkAutoTUnref<SkData> data(mmap_filename(path));
833 size_t size; 805 if (data.get()) {
834 if (mmap_filename(path, &addr, &size)) { 806 return SkNEW_ARGS(SkMemoryStream, (data.get()));
835 SkAutoTUnref<SkData> data(SkData::NewFromMMap(addr, size));
836 if (data.get()) {
837 return SkNEW_ARGS(SkMemoryStream, (data.get()));
838 }
839 } 807 }
840 808
841 // If we get here, then our attempt at using mmap failed, so try normal 809 // If we get here, then our attempt at using mmap failed, so try normal
842 // file access. 810 // file access.
843 SkFILEStream* stream = SkNEW_ARGS(SkFILEStream, (path)); 811 SkFILEStream* stream = SkNEW_ARGS(SkFILEStream, (path));
844 if (!stream->isValid()) { 812 if (!stream->isValid()) {
845 stream->unref(); 813 stream->unref();
846 stream = NULL; 814 stream = NULL;
847 } 815 }
848 return stream; 816 return stream;
849 } 817 }
OLDNEW
« no previous file with comments | « src/core/SkData.cpp ('k') | src/ports/SkOSFile_stdio.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698