Skip to content

Commit 3092903

Browse files
committed
Refactor Factory::Pool
1 parent 076a21c commit 3092903

4 files changed

Lines changed: 57 additions & 50 deletions

File tree

ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
* Implement `Factory::Pool#unpacker` and `Factory::Pool#packer` to allow for more precise serialization.
12
* Require Ruby 2.5+.
23

34
2023-03-03 1.6.1:

doclib/msgpack/factory.rb

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,6 @@ class Pool
124124
# @param data [String]
125125
# @return [Object] deserialized object
126126
#
127-
# See Unpacker#initialize for supported options.
128-
#
129127
def load(data)
130128
end
131129

@@ -140,6 +138,28 @@ def load(data)
140138
#
141139
def dump(object)
142140
end
141+
142+
#
143+
# Yields an Unpacker from the pool, and check it back in.
144+
#
145+
# The unpacker should no longer be held after the block has returned.
146+
#
147+
# @yieldparam unpacker [MessagePack::Unpacker]
148+
# @returns [Object] the block return value
149+
#
150+
def unpacker(&block)
151+
end
152+
153+
#
154+
# Yields a Packer from the pool, and check it back in.
155+
#
156+
# The packer should no longer be held after the block has returned.
157+
#
158+
# @yieldparam packer [MessagePack::Packer]
159+
# @returns [Object] the block return value
160+
#
161+
def packer(&block)
162+
end
143163
end
144164
end
145165
end

ext/msgpack/unpacker_class.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ void MessagePack_Unpacker_module_init(VALUE mMessagePack)
450450
rb_define_method(cMessagePack_Unpacker, "read_array_header", Unpacker_read_array_header, 0);
451451
rb_define_method(cMessagePack_Unpacker, "read_map_header", Unpacker_read_map_header, 0);
452452
rb_define_method(cMessagePack_Unpacker, "feed", Unpacker_feed_reference, 1);
453-
rb_define_method(cMessagePack_Unpacker, "feed_reference", Unpacker_feed_reference, 1);
453+
rb_define_alias(cMessagePack_Unpacker, "feed_reference", "feed");
454454
rb_define_method(cMessagePack_Unpacker, "each", Unpacker_each, 0);
455455
rb_define_method(cMessagePack_Unpacker, "feed_each", Unpacker_feed_each, 1);
456456
rb_define_method(cMessagePack_Unpacker, "reset", Unpacker_reset, 0);

lib/msgpack/factory.rb

Lines changed: 33 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -95,21 +95,22 @@ def initialize(size, &block)
9595
@members = []
9696
end
9797

98-
def checkout
99-
@members.pop || @new_member.call
100-
end
101-
102-
def checkin(member)
103-
# If the pool is already full, we simply drop the extra member.
104-
# This is because contrary to a connection pool, creating an extra instance
105-
# is extremely unlikely to cause some kind of resource exhaustion.
106-
#
107-
# We could cycle the members (keep the newer one) but first It's more work and second
108-
# the older member might have been created pre-fork, so it might be at least partially
109-
# in shared memory.
110-
if member && @members.size < @size
111-
member.reset
112-
@members << member
98+
def with
99+
member = @members.pop || @new_member.call
100+
begin
101+
yield member
102+
ensure
103+
# If the pool is already full, we simply drop the extra member.
104+
# This is because contrary to a connection pool, creating an extra instance
105+
# is extremely unlikely to cause some kind of resource exhaustion.
106+
#
107+
# We could cycle the members (keep the newer one) but first It's more work and second
108+
# the older member might have been created pre-fork, so it might be at least partially
109+
# in shared memory.
110+
if member && @members.size < @size
111+
member.reset
112+
@members << member
113+
end
113114
end
114115
end
115116
end
@@ -122,15 +123,16 @@ def initialize(size, &block)
122123
@mutex = Mutex.new
123124
end
124125

125-
def checkout
126-
@mutex.synchronize { @members.pop } || @new_member.call
127-
end
128-
129-
def checkin(member)
130-
member.reset
131-
@mutex.synchronize do
132-
if member && @members.size < @size
133-
@members << member
126+
def with
127+
member = @mutex.synchronize { @members.pop } || @new_member.call
128+
begin
129+
yield member
130+
ensure
131+
member.reset
132+
@mutex.synchronize do
133+
if member && @members.size < @size
134+
@members << member
135+
end
134136
end
135137
end
136138
end
@@ -145,41 +147,25 @@ def initialize(factory, size, options = nil)
145147
end
146148

147149
def load(data)
148-
unpacker = @unpackers.checkout
149-
begin
150-
unpacker.feed_reference(data)
150+
@unpackers.with do |unpacker|
151+
unpacker.feed(data)
151152
unpacker.full_unpack
152-
ensure
153-
@unpackers.checkin(unpacker)
154153
end
155154
end
156155

157156
def dump(object)
158-
packer = @packers.checkout
159-
begin
157+
@packers.with do |packer|
160158
packer.write(object)
161159
packer.full_pack
162-
ensure
163-
@packers.checkin(packer)
164160
end
165161
end
166162

167-
def unpacker
168-
unpacker = @unpackers.checkout
169-
begin
170-
yield unpacker
171-
ensure
172-
@unpackers.checkin(unpacker)
173-
end
163+
def unpacker(&block)
164+
@unpackers.with(&block)
174165
end
175166

176-
def packer
177-
packer = @packers.checkout
178-
begin
179-
yield packer
180-
ensure
181-
@packers.checkin(packer)
182-
end
167+
def packer(&block)
168+
@packers.with(&block)
183169
end
184170
end
185171
end

0 commit comments

Comments
 (0)