io.mmap: fix obsolete tests and get code to inline better
							parent
							
								
									eb6933ebfc
								
							
						
					
					
						commit
						530accdad9
					
				| 
						 | 
				
			
			@ -1,32 +1,32 @@
 | 
			
		|||
! (c)2009 Slava Pestov, Joe Groff bsd license
 | 
			
		||||
USING: accessors alien alien.c-types alien.strings arrays
 | 
			
		||||
byte-arrays cpu.architecture fry io io.encodings.binary
 | 
			
		||||
io.files io.streams.memory kernel libc math sequences ;
 | 
			
		||||
io.files io.streams.memory kernel libc math sequences words ;
 | 
			
		||||
IN: alien.data
 | 
			
		||||
 | 
			
		||||
GENERIC: require-c-array ( c-type -- )
 | 
			
		||||
 | 
			
		||||
M: array require-c-array first require-c-array ;
 | 
			
		||||
 | 
			
		||||
GENERIC: c-array-constructor ( c-type -- word )
 | 
			
		||||
GENERIC: c-array-constructor ( c-type -- word ) foldable
 | 
			
		||||
 | 
			
		||||
GENERIC: c-(array)-constructor ( c-type -- word )
 | 
			
		||||
GENERIC: c-(array)-constructor ( c-type -- word ) foldable
 | 
			
		||||
 | 
			
		||||
GENERIC: c-direct-array-constructor ( c-type -- word )
 | 
			
		||||
GENERIC: c-direct-array-constructor ( c-type -- word ) foldable
 | 
			
		||||
 | 
			
		||||
GENERIC: <c-array> ( len c-type -- array )
 | 
			
		||||
 | 
			
		||||
M: c-type-name <c-array>
 | 
			
		||||
M: word <c-array>
 | 
			
		||||
    c-array-constructor execute( len -- array ) ; inline
 | 
			
		||||
 | 
			
		||||
GENERIC: (c-array) ( len c-type -- array )
 | 
			
		||||
 | 
			
		||||
M: c-type-name (c-array)
 | 
			
		||||
M: word (c-array)
 | 
			
		||||
    c-(array)-constructor execute( len -- array ) ; inline
 | 
			
		||||
 | 
			
		||||
GENERIC: <c-direct-array> ( alien len c-type -- array )
 | 
			
		||||
 | 
			
		||||
M: c-type-name <c-direct-array>
 | 
			
		||||
M: word <c-direct-array>
 | 
			
		||||
    c-direct-array-constructor execute( alien len -- array ) ; inline
 | 
			
		||||
 | 
			
		||||
: malloc-array ( n type -- array )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,7 @@ specialized-arrays system sorting math.libm
 | 
			
		|||
math.intervals quotations effects alien alien.data ;
 | 
			
		||||
FROM: math => float ;
 | 
			
		||||
SPECIALIZED-ARRAY: double
 | 
			
		||||
SPECIALIZED-ARRAY: void*
 | 
			
		||||
IN: compiler.tree.propagation.tests
 | 
			
		||||
 | 
			
		||||
[ V{ } ] [ [ ] final-classes ] unit-test
 | 
			
		||||
| 
						 | 
				
			
			@ -897,3 +898,4 @@ M: tuple-with-read-only-slot clone
 | 
			
		|||
 | 
			
		||||
! We want this to inline
 | 
			
		||||
[ t ] [ [ void* <c-direct-array> ] { <c-direct-array> } inlined? ] unit-test
 | 
			
		||||
[ V{ void*-array } ] [ [ void* <c-direct-array> ] final-classes ] unit-test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
USING: help.markup help.syntax alien math continuations
 | 
			
		||||
destructors ;
 | 
			
		||||
destructors specialized-arrays ;
 | 
			
		||||
IN: io.mmap
 | 
			
		||||
 | 
			
		||||
HELP: mapped-file
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +25,7 @@ HELP: with-mapped-file
 | 
			
		|||
HELP: with-mapped-file-reader
 | 
			
		||||
{ $values { "path" "a pathname string" } { "quot" { $quotation "( mmap -- )" } } }
 | 
			
		||||
{ $contract "Opens a file for read-only access and maps its contents into memory, passing the " { $link mapped-file } " instance to the quotation. The mapped file is disposed of when the quotation returns, or if an error is thrown." }
 | 
			
		||||
{ $notes "This is a low-level word, because " { $link mapped-file } " objects simply expose their base address and length. Most applications should use " { $link "io.mmap.arrays" } " instead." }
 | 
			
		||||
{ $notes "This is a low-level word, because " { $link mapped-file } " objects simply expose their base address and length. See " { $link "io.mmap.arrays" } " for a discussion of how to access data in a mapped file." }
 | 
			
		||||
{ $errors "Throws an error if a memory mapping could not be established." } ;
 | 
			
		||||
 | 
			
		||||
HELP: close-mapped-file
 | 
			
		||||
| 
						 | 
				
			
			@ -33,51 +33,43 @@ HELP: close-mapped-file
 | 
			
		|||
{ $contract "Releases system resources associated with the mapped file. This word should not be called by user code; use " { $link dispose } " instead." }
 | 
			
		||||
{ $errors "Throws an error if a memory mapping could not be established." } ;
 | 
			
		||||
 | 
			
		||||
ARTICLE: "io.mmap.arrays" "Memory-mapped arrays"
 | 
			
		||||
"Mapped file can be viewed as a sequence using the words in sub-vocabularies of " { $vocab-link "io.mmap" } ". For each primitive C type " { $snippet "T" } ", a set of words are defined in the vocabulary named " { $snippet "io.mmap.T" } ":"
 | 
			
		||||
{ $table
 | 
			
		||||
    { { $snippet "<mapped-T-array>" } { "Wraps a " { $link mapped-file } " in a sequence; stack effect " { $snippet "( mapped-file -- direct-array )" } } }
 | 
			
		||||
    { { $snippet "with-mapped-T-file" } { "Maps a file into memory and wraps it in a sequence by combining " { $link with-mapped-file } " and " { $snippet "<mapped-T-array>" } "; stack effect " { $snippet "( path quot -- )" } } }
 | 
			
		||||
}
 | 
			
		||||
"The primitive C types for which mapped arrays exist:"
 | 
			
		||||
{ $list
 | 
			
		||||
    { $snippet "char" }
 | 
			
		||||
    { $snippet "uchar" }
 | 
			
		||||
    { $snippet "short" }
 | 
			
		||||
    { $snippet "ushort" }
 | 
			
		||||
    { $snippet "int" }
 | 
			
		||||
    { $snippet "uint" }
 | 
			
		||||
    { $snippet "long" }
 | 
			
		||||
    { $snippet "ulong" }
 | 
			
		||||
    { $snippet "longlong" }
 | 
			
		||||
    { $snippet "ulonglong" }
 | 
			
		||||
    { $snippet "float" }
 | 
			
		||||
    { $snippet "double" }
 | 
			
		||||
    { $snippet "void*" }
 | 
			
		||||
    { $snippet "bool" }
 | 
			
		||||
} ;
 | 
			
		||||
ARTICLE: "io.mmap.arrays" "Working with memory-mapped data"
 | 
			
		||||
"The " { $link <mapped-file> } " word returns an instance of " { $link mapped-file } ", which doesn't directly support the sequence protocol. Instead, it needs to be wrapped in a specialized array of the appropriate C type:"
 | 
			
		||||
{ $subsection <mapped-array> }
 | 
			
		||||
"The appropriate specialized array type must first be generated with " { $link POSTPONE: SPECIALIZED-ARRAY: } "."
 | 
			
		||||
$nl
 | 
			
		||||
"Data can also be read and written from the " { $link mapped-file } " by applying low-level alien words to the " { $slot "address" } " slot. This approach is not recommended, though, since in most cases the compiler will generate efficient code for specialized array usage. See " { $link "reading-writing-memory" } " for a description of low-level memory access primitives." ;
 | 
			
		||||
 | 
			
		||||
ARTICLE: "io.mmap.low-level" "Reading and writing mapped files directly"
 | 
			
		||||
"Data can be read and written from the " { $link mapped-file } " by applying low-level alien words to the " { $slot "address" } " slot. See " { $link "reading-writing-memory" } "." ;
 | 
			
		||||
 | 
			
		||||
ARTICLE: "io.mmap.examples" "Memory-mapped file example"
 | 
			
		||||
ARTICLE: "io.mmap.examples" "Memory-mapped file examples"
 | 
			
		||||
"Convert a file of 4-byte cells from little to big endian or vice versa, by directly mapping it into memory and operating on it with sequence words:"
 | 
			
		||||
{ $code
 | 
			
		||||
    "USING: accessors grouping io.files io.mmap.char kernel sequences ;"
 | 
			
		||||
    "USING: alien.c-types grouping io.mmap sequences" "specialized-arrays ;"
 | 
			
		||||
    "SPECIALIZED-ARRAY: char"
 | 
			
		||||
    ""
 | 
			
		||||
    "\"mydata.dat\" ["
 | 
			
		||||
    "    4 <sliced-groups> [ reverse-here ] change-each"
 | 
			
		||||
    "] with-mapped-char-file"
 | 
			
		||||
    "    char <mapped-array> 4 <sliced-groups>"
 | 
			
		||||
    "    [ reverse-here ] change-each"
 | 
			
		||||
    "] with-mapped-file"
 | 
			
		||||
}
 | 
			
		||||
"Normalize a file containing packed quadrupes of floats:"
 | 
			
		||||
{ $code
 | 
			
		||||
    "USING: kernel io.mmap math.vectors math.vectors.simd" "sequences specialized-arrays ;"
 | 
			
		||||
    "SIMD: float"
 | 
			
		||||
    "SPECIALIZED-ARRAY: float-4"
 | 
			
		||||
    ""
 | 
			
		||||
    "\"mydata.dat\" ["
 | 
			
		||||
    "    float-4 <mapped-array>"
 | 
			
		||||
    "    [ normalize ] change-each"
 | 
			
		||||
    "] with-mapped-file"
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
ARTICLE: "io.mmap" "Memory-mapped files"
 | 
			
		||||
"The " { $vocab-link "io.mmap" } " vocabulary implements support for memory-mapped files."
 | 
			
		||||
{ $subsection <mapped-file> }
 | 
			
		||||
"Memory-mapped files are disposable and can be closed with " { $link dispose } " or " { $link with-disposal } "."
 | 
			
		||||
{ $subsection "io.mmap.examples" }
 | 
			
		||||
"A utility combinator which wraps the above:"
 | 
			
		||||
"Memory-mapped files are disposable and can be closed with " { $link dispose } " or " { $link with-disposal } ". A utility combinator which wraps the above:"
 | 
			
		||||
{ $subsection with-mapped-file }
 | 
			
		||||
"Instances of " { $link mapped-file } " don't support any interesting operations in themselves. There are two facilities for accessing their contents:"
 | 
			
		||||
{ $subsection "io.mmap.arrays" }
 | 
			
		||||
{ $subsection "io.mmap.low-level" } ;
 | 
			
		||||
{ $subsection "io.mmap.examples" } ;
 | 
			
		||||
 | 
			
		||||
ABOUT: "io.mmap"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,14 @@
 | 
			
		|||
USING: io io.mmap io.files io.files.temp
 | 
			
		||||
io.directories kernel tools.test continuations sequences
 | 
			
		||||
io.encodings.ascii accessors math ;
 | 
			
		||||
USING: io io.mmap io.files io.files.temp io.directories kernel
 | 
			
		||||
tools.test continuations sequences io.encodings.ascii accessors
 | 
			
		||||
math compiler.tree.debugger alien.data alien.c-types
 | 
			
		||||
sequences.private ;
 | 
			
		||||
IN: io.mmap.tests
 | 
			
		||||
 | 
			
		||||
[ "mmap-test-file.txt" temp-file delete-file ] ignore-errors
 | 
			
		||||
[ ] [ "12345" "mmap-test-file.txt" temp-file ascii set-file-contents ] unit-test
 | 
			
		||||
[ ] [ "mmap-test-file.txt" temp-file [ "char" <mapped-array> CHAR: 2 0 pick set-nth drop ] with-mapped-file ] unit-test
 | 
			
		||||
[ 5 ] [ "mmap-test-file.txt" temp-file [ "char" <mapped-array> length ] with-mapped-file ] unit-test
 | 
			
		||||
[ 5 ] [ "mmap-test-file.txt" temp-file [ "char" <mapped-array> length ] with-mapped-file-reader ] unit-test
 | 
			
		||||
[ ] [ "mmap-test-file.txt" temp-file [ char <mapped-array> CHAR: 2 0 pick set-nth drop ] with-mapped-file ] unit-test
 | 
			
		||||
[ 5 ] [ "mmap-test-file.txt" temp-file [ char <mapped-array> length ] with-mapped-file ] unit-test
 | 
			
		||||
[ 5 ] [ "mmap-test-file.txt" temp-file [ char <mapped-array> length ] with-mapped-file-reader ] unit-test
 | 
			
		||||
[ "22345" ] [ "mmap-test-file.txt" temp-file ascii file-contents ] unit-test
 | 
			
		||||
[ "mmap-test-file.txt" temp-file delete-file ] ignore-errors
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,3 +21,8 @@ IN: io.mmap.tests
 | 
			
		|||
        drop
 | 
			
		||||
    ] with-mapped-file
 | 
			
		||||
] [ bad-mmap-size? ] must-fail-with
 | 
			
		||||
 | 
			
		||||
[ t ] [
 | 
			
		||||
    [ "test.txt" <mapped-file> void* <c-direct-array> first-unsafe ]
 | 
			
		||||
    { nth-unsafe } inlined?
 | 
			
		||||
] unit-test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,10 +25,10 @@ ERROR: bad-mmap-size n ;
 | 
			
		|||
PRIVATE>
 | 
			
		||||
 | 
			
		||||
: <mapped-file-reader> ( path -- mmap )
 | 
			
		||||
    [ (mapped-file-reader) ] prepare-mapped-file ;
 | 
			
		||||
    [ (mapped-file-reader) ] prepare-mapped-file ; inline
 | 
			
		||||
 | 
			
		||||
: <mapped-file> ( path -- mmap )
 | 
			
		||||
    [ (mapped-file-r/w) ] prepare-mapped-file ;
 | 
			
		||||
    [ (mapped-file-r/w) ] prepare-mapped-file ; inline
 | 
			
		||||
 | 
			
		||||
: <mapped-array> ( mmap c-type -- direct-array )
 | 
			
		||||
    [ [ address>> ] [ length>> ] bi ] dip
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue