LibFIPC 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Rakefile +8 -0
- data/channels/README +0 -0
- data/lib/LibFIPC.rb +118 -0
- data/test/testLibFIPC.rb +53 -0
- metadata +52 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d5d5589adce72d95d4578491414b2974c62d873f
|
4
|
+
data.tar.gz: d509ad774d32033699af499cf6f207cdf65b7e0c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 747d0c419cca25c75aff5261189d4ddb034b1f3c6326dce6c8d02812ea674a4b3bca00786cc9b347510e74a3ab1d4fde9c267802e3c5f0e23ba9f397e136260f
|
7
|
+
data.tar.gz: 06eef8c6f2e226d4c6ef6c7256e98afab55c94c6dbf455dcd5f35e3eb1defd82d333e53f4e8ea44e4c8d342e096376291b6dc1b0b67b280b2b365260aa21d929
|
data/Rakefile
ADDED
data/channels/README
ADDED
File without changes
|
data/lib/LibFIPC.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
#push
|
2
|
+
#pop
|
3
|
+
#reset
|
4
|
+
|
5
|
+
# File Format:
|
6
|
+
# [next_data_ptr:64it] | [data_len:64bit][data] | [data_len:64bit][data]
|
7
|
+
# [00000000]
|
8
|
+
|
9
|
+
class FIPC
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
def self.sendMsg(channel,msg)
|
14
|
+
|
15
|
+
self.push(channel,msg)
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.receiveMsg(channel)
|
20
|
+
|
21
|
+
self.pop(channel)
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.push(channel,msg)
|
26
|
+
|
27
|
+
fileName = channel+".dat"
|
28
|
+
|
29
|
+
if File::exists?(fileName)
|
30
|
+
|
31
|
+
file = File.new( fileName, "ab+")
|
32
|
+
file.flock(File::LOCK_EX)
|
33
|
+
file << [msg.length].pack("Q!")
|
34
|
+
file << msg
|
35
|
+
file.close()
|
36
|
+
|
37
|
+
else
|
38
|
+
|
39
|
+
file = File.new( fileName, "wb+")
|
40
|
+
file.flock(File::LOCK_EX)
|
41
|
+
ptr=8
|
42
|
+
file << [ptr].pack("Q!")
|
43
|
+
file << [msg.length].pack("Q!")
|
44
|
+
file << msg
|
45
|
+
file.close()
|
46
|
+
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
return true
|
51
|
+
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.pop(channel)
|
56
|
+
|
57
|
+
fileName = channel+".dat"
|
58
|
+
|
59
|
+
if File::exists?(fileName)
|
60
|
+
|
61
|
+
file = File.new( fileName, "rb+")
|
62
|
+
file.flock(File::LOCK_EX)
|
63
|
+
ptrStr = file.read(8)
|
64
|
+
|
65
|
+
ptr = ptrStr.unpack("Q!")[0]
|
66
|
+
file.seek(ptr)
|
67
|
+
|
68
|
+
dataLenStr = file.read(8)
|
69
|
+
dataLen = dataLenStr.unpack("Q!")[0]
|
70
|
+
|
71
|
+
data = file.read(dataLen)
|
72
|
+
|
73
|
+
|
74
|
+
ptr = file.pos
|
75
|
+
|
76
|
+
file.seek(0)
|
77
|
+
|
78
|
+
file << [ptr].pack("Q!")
|
79
|
+
|
80
|
+
|
81
|
+
if ptr == file.size
|
82
|
+
file.close
|
83
|
+
self.reset(channel)
|
84
|
+
|
85
|
+
else
|
86
|
+
file.close
|
87
|
+
end
|
88
|
+
|
89
|
+
return data
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
else
|
94
|
+
|
95
|
+
return false
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.reset(channel)
|
101
|
+
|
102
|
+
fileName = channel+".dat"
|
103
|
+
|
104
|
+
|
105
|
+
if File::exists?(fileName) and File.writable?(fileName)
|
106
|
+
|
107
|
+
File.delete(fileName)
|
108
|
+
return true
|
109
|
+
|
110
|
+
else
|
111
|
+
|
112
|
+
return false
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
end
|
data/test/testLibFIPC.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require "LibFIPC"
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class TestLibConfig < Test::Unit::TestCase
|
8
|
+
|
9
|
+
self.test_order = :defined
|
10
|
+
|
11
|
+
def test_sendMsg()
|
12
|
+
|
13
|
+
p "sending.."
|
14
|
+
ret = FIPC.sendMsg("channels/1","hello_1")
|
15
|
+
assert_equal(true,ret)
|
16
|
+
ret = FIPC.sendMsg("channels/1","hello_2")
|
17
|
+
assert_equal(true,ret)
|
18
|
+
ret = FIPC.sendMsg("channels/1","hello_3")
|
19
|
+
assert_equal(true,ret)
|
20
|
+
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_receiveMsg()
|
25
|
+
|
26
|
+
p "receiving..."
|
27
|
+
ret=FIPC.receiveMsg("channels/1")
|
28
|
+
p ret
|
29
|
+
assert_equal("hello_1",ret)
|
30
|
+
ret=FIPC.receiveMsg("channels/1")
|
31
|
+
p ret
|
32
|
+
assert_equal("hello_2",ret)
|
33
|
+
ret=FIPC.receiveMsg("channels/1")
|
34
|
+
p ret
|
35
|
+
assert_equal("hello_3",ret)
|
36
|
+
#assert arr.length>0
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def test_reset()
|
42
|
+
|
43
|
+
ret = FIPC.sendMsg("channels/x","hello_1")
|
44
|
+
ret = FIPC.reset("channels/x")
|
45
|
+
assert_equal(true,ret)
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: LibFIPC
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Avinash DSilva
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Ruby doesn't have good support for message passing between processes.
|
14
|
+
One option is to make use of client-server setup by using sockets which is too much
|
15
|
+
for simple message passing and other would be to use a message passing server like
|
16
|
+
ZeroMQ.We decided to make FIPC to allow simpler form of IPC between 2 or more ruby
|
17
|
+
processes
|
18
|
+
email: avinash.roshan.dsilva@gmail.com
|
19
|
+
executables: []
|
20
|
+
extensions: []
|
21
|
+
extra_rdoc_files: []
|
22
|
+
files:
|
23
|
+
- Rakefile
|
24
|
+
- channels/README
|
25
|
+
- lib/LibFIPC.rb
|
26
|
+
- test/testLibFIPC.rb
|
27
|
+
homepage: http://rubygems.org/gems/FIPC
|
28
|
+
licenses:
|
29
|
+
- MIT
|
30
|
+
metadata: {}
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
requirements: []
|
46
|
+
rubyforge_project:
|
47
|
+
rubygems_version: 2.5.1
|
48
|
+
signing_key:
|
49
|
+
specification_version: 4
|
50
|
+
summary: FIPC(File based Interprocess communication) is used for asynchronous exchange
|
51
|
+
of messages between processes
|
52
|
+
test_files: []
|