win32-mmap 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8fd737d1d437da5002b90092c5453761d35e5b51
4
+ data.tar.gz: c111a6f06fbbe986933dd503d80174a059c9d142
5
+ SHA512:
6
+ metadata.gz: cc7a6cca90f71eac4ea593b4fb7f9098aa89d8c515252e86a9f59983354a0099f2779d74b9f357f8e2d8baf84ff4e92f6bdbd67ed72301e8b4973ae06de3d415
7
+ data.tar.gz: 16ce6d436951d643f8476a8d673da1274a9e9fdf583aaac265032e1d973e78284a823e473d18914c914dfb8d8e3a7681b81a1d6ec80b10205bedb6b23fde4f9f
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.4.0 - 21-Aug-2013
2
+ * Added methods for reading or writing raw strings to the underlying
3
+ memory mapped file (as opposed to marshalled data). Thanks go to
4
+ Frank Quednau for the patch.
5
+
1
6
  == 0.3.2 - 28-Apr-2013
2
7
  * Fixed a prototype mismatch in a call to CreateFile. Thanks go to
3
8
  Frank Quednau for the spot.
data/README CHANGED
@@ -1,64 +1,65 @@
1
1
  = Description
2
- This package provides a Ruby interface for memory mapped I/O on MS Windows.
2
+ This package provides a Ruby interface for memory mapped I/O on MS Windows.
3
3
 
4
4
  = Prerequisites
5
- windows-pr, 0.5.5 or later.
5
+ * ffi
6
+ * test-unit (Testing only)
6
7
 
7
8
  = Installation
8
- gem install win32-mmap
9
+ gem install win32-mmap
9
10
 
10
11
  = Synopsis
11
- require 'win32/mmap'
12
- include Win32
12
+ require 'win32/mmap'
13
+ include Win32
13
14
 
14
- map1 = MMap.new(:file => "C:\\test.map", :size => 1024)
15
- map1.foo = 'hello'
16
- map1.bar = 77
17
- map1.close
15
+ map1 = MMap.new(:file => "C:\\test.map", :size => 1024)
16
+ map1.foo = 'hello'
17
+ map1.bar = 77
18
+ map1.close
18
19
 
19
- map2 = MMap.new(:file => "C:\\test.map")
20
- p map2.foo # 'hello'
21
- p map2.bar # 77
22
- map2.close
20
+ map2 = MMap.new(:file => "C:\\test.map")
21
+ p map2.foo # 'hello'
22
+ p map2.bar # 77
23
+ map2.close
23
24
 
24
25
  = About Memory Mapped Files under Windows
25
- Under Windows, code and data are both repesented by pages of memory backed
26
- by files on disk, code by executable image and data by system pagefile
27
- (i.e. swapfile). These are called memory mapped files. Memory mapped files
28
- can be used to provide a mechanism for shared memory between processes.
29
- Different processes are able to share data backed by the same swapfile,
30
- whether it's the system pagefile or a user-defined swapfile.
26
+ Under Windows, code and data are both repesented by pages of memory backed
27
+ by files on disk, code by executable image and data by system pagefile
28
+ (i.e. swapfile). These are called memory mapped files. Memory mapped files
29
+ can be used to provide a mechanism for shared memory between processes.
30
+ Different processes are able to share data backed by the same swapfile,
31
+ whether it's the system pagefile or a user-defined swapfile.
31
32
 
32
- Windows has a tight security system that prevents processes from directly
33
- sharing information among each other, but mapped memory files provide a
34
- mechanism that works with the Windows security system by using a name that
35
- all processes use to open the swapfile.
33
+ Windows has a tight security system that prevents processes from directly
34
+ sharing information among each other, but mapped memory files provide a
35
+ mechanism that works with the Windows security system by using a name that
36
+ all processes use to open the swapfile.
36
37
 
37
- A shared section of the swapfile is translated into pages of memory that are
38
- addressable by more than one process, Windows uses a system resource called a
39
- prototype page table entry (PPTE) to enable more than one process to address
40
- the same physical page of memory, thus multiple process can share the same
41
- data without violating the Windows system security.
38
+ A shared section of the swapfile is translated into pages of memory that are
39
+ addressable by more than one process, Windows uses a system resource called a
40
+ prototype page table entry (PPTE) to enable more than one process to address
41
+ the same physical page of memory, thus multiple process can share the same
42
+ data without violating the Windows system security.
42
43
 
43
- In short, memory mapped files provide shared memory under Windows.
44
+ In short, memory mapped files provide shared memory under Windows.
44
45
 
45
- (This explanation was largely borrowed from Roger Lee's Win32::MMF Perl
46
- module.)
46
+ (This explanation was largely borrowed from Roger Lee's Win32::MMF Perl
47
+ module.)
47
48
 
48
49
  = Future Plans
49
- Suggestions welcome.
50
+ Suggestions welcome.
50
51
 
51
52
  = License
52
- Artistic 2.0
53
+ Artistic 2.0
53
54
 
54
55
  = Copyright
55
- (C) 2003-2013 Daniel J. Berger, All Rights Reserved
56
+ (C) 2003-2013 Daniel J. Berger, All Rights Reserved
56
57
 
57
58
  = Warranty
58
- This package is provided "as is" and without any express or
59
- implied warranties, including, without limitation, the implied
60
- warranties of merchantability and fitness for a particular purpose.
59
+ This package is provided "as is" and without any express or
60
+ implied warranties, including, without limitation, the implied
61
+ warranties of merchantability and fitness for a particular purpose.
61
62
 
62
63
  = Authors
63
- Daniel J. Berger
64
- Park Heesob
64
+ Daniel J. Berger
65
+ Park Heesob
data/Rakefile CHANGED
@@ -8,7 +8,12 @@ namespace 'gem' do
8
8
  desc 'Create the win32-mmap gem.'
9
9
  task :create => [:clean] do
10
10
  spec = eval(IO.read('win32-mmap.gemspec'))
11
- Gem::Builder.new(spec).build
11
+ if Gem::VERSION.to_f < 2.0
12
+ Gem::Builder.new(spec).build
13
+ else
14
+ require 'rubygems/package'
15
+ Gem::Package.build(spec)
16
+ end
12
17
  end
13
18
 
14
19
  desc 'Install the win32-mmap gem.'
@@ -9,7 +9,7 @@ module Win32
9
9
  #
10
10
  class MMap
11
11
  # The version of the win32-mmap library.
12
- VERSION = '0.3.2'
12
+ VERSION = '0.4.0'
13
13
 
14
14
  include Windows::Constants
15
15
  include Windows::Functions
@@ -292,6 +292,25 @@ module Win32
292
292
  @autolock
293
293
  end
294
294
 
295
+ # Writes a string directly to the underlying file
296
+ def write_string(content)
297
+ lock_pattern do
298
+ ptr = FFI::Pointer.new(:char, @address)
299
+ ptr.write_string(content,content.length)
300
+ end
301
+ end
302
+
303
+ # Reads a string of a given length from the beginning of the file
304
+ # if no length is given, reads the file with the @size attribute
305
+ # of this instance
306
+ def read_string(length = @size)
307
+ lock_pattern do
308
+ FFI::MemoryPointer.new(:char, length)
309
+ ptr = FFI::Pointer.new(:char, @address)
310
+ ptr.read_string(length)
311
+ end
312
+ end
313
+
295
314
  private
296
315
 
297
316
  # :stopdoc:
@@ -301,8 +320,6 @@ module Win32
301
320
  #--
302
321
  # This replaces the getvar/setvar API from 0.1.0.
303
322
  #
304
- # TODO: FIX!
305
- #
306
323
  def method_missing(method_id, *args)
307
324
  method = method_id.id2name
308
325
  args = args.first if args.length == 1
@@ -311,44 +328,41 @@ module Win32
311
328
  method.chop!
312
329
  @hash["#{method}"] = args
313
330
 
314
- if @autolock
315
- if mmap_lock
316
- instance_variable_set("@#{method}", args)
317
- marshal = Marshal.dump(@hash)
318
- ptr = FFI::Pointer.new(:char, @address)
319
- ptr.write_string(marshal,marshal.length)
320
- mmap_unlock
321
- end
322
- else
331
+ lock_pattern do
323
332
  instance_variable_set("@#{method}", args)
324
333
  marshal = Marshal.dump(@hash)
325
334
  ptr = FFI::Pointer.new(:char, @address)
326
335
  ptr.write_string(marshal,marshal.length)
327
336
  end
337
+
328
338
  else # Getter
329
- buf = FFI::MemoryPointer.new(:char, @size)
330
-
331
- if @autolock
332
- if mmap_lock
333
- ptr = FFI::Pointer.new(:char, @address)
334
- buf = ptr.read_string(@size)
335
- hash = Marshal.load(buf)
336
- val = hash["#{method}"]
337
- instance_variable_set("@#{method}", val)
338
- mmap_unlock
339
- end
340
- else
341
- ptr = FFI::Pointer.new(:char, @address)
342
- buf = ptr.read_string(@size)
343
- hash = Marshal.load(buf)
344
- val = hash["#{method}"]
345
- instance_variable_set("@#{method}", val)
339
+
340
+ lock_pattern do
341
+ buf = FFI::MemoryPointer.new(:char, @size)
342
+ ptr = FFI::Pointer.new(:char, @address)
343
+ buf = ptr.read_string(@size)
344
+ hash = Marshal.load(buf)
345
+ val = hash["#{method}"]
346
+ instance_variable_set("@#{method}", val)
346
347
  end
347
348
 
348
349
  return instance_variable_get("@#{method}")
349
350
  end
350
351
  end
351
352
 
353
+ def lock_pattern
354
+ if @autolock
355
+ if mmap_lock
356
+ output = yield
357
+ mmap_unlock
358
+ output
359
+ end
360
+ else
361
+ output = yield
362
+ output
363
+ end
364
+ end
365
+
352
366
  # Adds a semaphore lock the mapping. Only used if +autolock+ is set
353
367
  # to true in the constructor.
354
368
  #
@@ -14,7 +14,7 @@ class TC_Win32_Mmap < Test::Unit::TestCase
14
14
  end
15
15
 
16
16
  test "version is set to expected value" do
17
- assert_equal('0.3.2', MMap::VERSION)
17
+ assert_equal('0.4.0', MMap::VERSION)
18
18
  end
19
19
 
20
20
  test "dynamic variable names and string values work as expected" do
@@ -45,6 +45,12 @@ class TC_Win32_Mmap < Test::Unit::TestCase
45
45
  assert_equal([{1=>2}, [1,2,3], 'foo'], @mmap.barray)
46
46
  end
47
47
 
48
+ test "primitive write/read of file" do
49
+ input = "Greetings, astute reader"
50
+ assert_nothing_raised{ @mmap.write_string(input) }
51
+ assert_equal(input, @mmap.read_string(input.length))
52
+ end
53
+
48
54
  test "passing an invalid option raises an argument error" do
49
55
  assert_raises(ArgumentError){ MMap.new(:foo => 1) }
50
56
  end
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'win32-mmap'
5
- spec.version = '0.3.2'
5
+ spec.version = '0.4.0'
6
6
  spec.author = 'Daniel J. Berger'
7
7
  spec.license = 'Artistic 2.0'
8
8
  spec.email = 'djberg96@gmail.com'
metadata CHANGED
@@ -1,34 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: win32-mmap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
5
- prerelease:
4
+ version: 0.4.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Daniel J. Berger
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-28 00:00:00.000000000 Z
11
+ date: 2013-08-22 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: ffi
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
- description: ! " The win32-mmap library provides an interface for memory mapped
31
- IO on\n MS Windows.\n"
27
+ description: |2
28
+ The win32-mmap library provides an interface for memory mapped IO on
29
+ MS Windows.
32
30
  email: djberg96@gmail.com
33
31
  executables: []
34
32
  extensions: []
@@ -53,27 +51,26 @@ files:
53
51
  homepage: https://github.com/djberg96/win32-mmap
54
52
  licenses:
55
53
  - Artistic 2.0
54
+ metadata: {}
56
55
  post_install_message:
57
56
  rdoc_options: []
58
57
  require_paths:
59
58
  - lib
60
59
  required_ruby_version: !ruby/object:Gem::Requirement
61
- none: false
62
60
  requirements:
63
- - - ! '>='
61
+ - - '>='
64
62
  - !ruby/object:Gem::Version
65
63
  version: '0'
66
64
  required_rubygems_version: !ruby/object:Gem::Requirement
67
- none: false
68
65
  requirements:
69
- - - ! '>='
66
+ - - '>='
70
67
  - !ruby/object:Gem::Version
71
68
  version: '0'
72
69
  requirements: []
73
70
  rubyforge_project: win32utils
74
- rubygems_version: 1.8.24
71
+ rubygems_version: 2.0.7
75
72
  signing_key:
76
- specification_version: 3
73
+ specification_version: 4
77
74
  summary: Memory mapped IO for Windows.
78
75
  test_files:
79
76
  - test/test_win32_mmap.rb