Skip to content

Commit cac53e6

Browse files
committed
Only use the stack_alloc helper for multiple pointers
1 parent 634c0ae commit cac53e6

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

lib/truffle/socket/truffle/foreign.rb

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# truffleruby_primitives: true
2+
13
# Copyright (c) 2013, Brian Shirai
24
# All rights reserved.
35
#
@@ -95,26 +97,25 @@ module Foreign
9597
attach_function :freeifaddrs, [:pointer], :void
9698

9799
def self.bind(descriptor, sockaddr)
98-
sockaddr_p = Truffle::FFI::Pool.stack_alloc(:char, sockaddr.bytesize)
100+
sockaddr_p = Primitive.io_thread_buffer_allocate(sockaddr.bytesize)
99101
begin
100102
sockaddr_p.write_bytes(sockaddr)
101103
_bind(descriptor, sockaddr_p, sockaddr.bytesize)
102104
ensure
103-
Truffle::FFI::Pool.stack_free(sockaddr_p)
105+
Primitive.io_thread_buffer_free(sockaddr_p)
104106
end
105107
end
106108

107109
def self.connect(descriptor, sockaddr)
108110
sockaddr = Socket.coerce_to_string(sockaddr)
109111

110-
sockaddr_p = Truffle::FFI::Pool.stack_alloc(:char, sockaddr.bytesize)
111-
112+
sockaddr_p = Primitive.io_thread_buffer_allocate(sockaddr.bytesize)
112113
begin
113114
sockaddr_p.write_bytes(sockaddr)
114115

115116
_connect(descriptor, sockaddr_p, sockaddr.bytesize)
116117
ensure
117-
Truffle::FFI::Pool.stack_free(sockaddr_p)
118+
Primitive.io_thread_buffer_free(sockaddr_p)
118119
end
119120
end
120121

@@ -143,10 +144,10 @@ def self.getaddrinfo(host, service = nil, family = nil, socktype = nil,
143144
hints[:ai_protocol] = protocol || 0
144145
hints[:ai_flags] = flags || 0
145146

146-
res_p = Truffle::FFI::Pool.stack_alloc(:pointer, 1)
147+
res_p = Primitive.io_thread_buffer_allocate(Primitive.pointer_find_type_size(:pointer))
147148

148149
res_p.clear
149-
err = _getaddrinfo(host, service, hints.pointer, res_p)
150+
err = _getaddrinfo(host, service, hints.pointer, res_p)
150151

151152
raise SocketError, gai_strerror(err) unless err == 0
152153

@@ -183,7 +184,7 @@ def self.getaddrinfo(host, service = nil, family = nil, socktype = nil,
183184

184185
# Be sure to feed a legit pointer to freeaddrinfo
185186
freeaddrinfo(ptr) unless ptr.null?
186-
Truffle::FFI::Pool.stack_free(res_p)
187+
Primitive.io_thread_buffer_free(res_p)
187188
end
188189
end
189190

@@ -283,7 +284,7 @@ def self.pack_sockaddr_in(host, port, family = ::Socket::AF_UNSPEC,
283284
host = '0.0.0.0'
284285
end
285286

286-
res_p = Truffle::FFI::Pool.stack_alloc(:pointer, 1)
287+
res_p = Primitive.io_thread_buffer_allocate(Primitive.pointer_find_type_size(:pointer))
287288
res_p.clear
288289

289290
err = _getaddrinfo(host, port.to_s, hints.pointer, res_p)
@@ -302,7 +303,7 @@ def self.pack_sockaddr_in(host, port, family = ::Socket::AF_UNSPEC,
302303
ptr = res_p.read_pointer
303304

304305
freeaddrinfo(ptr) unless ptr.null?
305-
Truffle::FFI::Pool.stack_free(res_p)
306+
Primitive.io_thread_buffer_free(res_p)
306307
end
307308
end
308309

@@ -328,7 +329,7 @@ def self.getpeereid(*)
328329
end
329330

330331
def self.socketpair(family, type, protocol)
331-
pointer = Truffle::FFI::Pool.stack_alloc(:int, 2)
332+
pointer = Primitive.io_thread_buffer_allocate(Primitive.pointer_find_type_size(:int) * 2)
332333
begin
333334
pointer.clear
334335
status = _socketpair(family, type, protocol, pointer)
@@ -337,7 +338,7 @@ def self.socketpair(family, type, protocol)
337338

338339
pointer.read_array_of_int(2)
339340
ensure
340-
Truffle::FFI::Pool.stack_free(pointer)
341+
Primitive.io_thread_buffer_free(pointer)
341342
end
342343
end
343344

@@ -373,7 +374,7 @@ def self.ip_to_bytes(family, address)
373374
address = address[0...i]
374375
end
375376

376-
pointer = Truffle::FFI::Pool.stack_alloc(:pointer, size)
377+
pointer = Primitive.io_thread_buffer_allocate(Primitive.pointer_find_type_size(:pointer) * size)
377378

378379
begin
379380
status = inet_pton(family, address, pointer)
@@ -382,7 +383,7 @@ def self.ip_to_bytes(family, address)
382383

383384
pointer.get_array_of_uchar(0, size)
384385
ensure
385-
Truffle::FFI::Pool.stack_free(pointer)
386+
Primitive.io_thread_buffer_free(pointer)
386387
end
387388
end
388389
end

src/main/ruby/truffleruby/core/truffle/ffi/pointer.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,8 @@ def self.from_string(str)
266266
end
267267

268268
class Pool
269-
269+
# Use Primitive.io_thread_buffer_allocate(Primitive.pointer_find_type_size(:type) * n)
270+
# instead for a single pointer. This method always returns an Array of FFI::Pointer.
270271
def self.stack_alloc(*args)
271272
total_length = 0
272273
offsets = []
@@ -286,10 +287,10 @@ def self.stack_alloc(*args)
286287
total_length += length
287288
end
288289
buffer = Primitive.io_thread_buffer_allocate(total_length)
289-
pointers = offsets.map { |offset, length| buffer.slice(offset, length) }
290-
pointers.size == 1 ? pointers[0] : pointers
290+
offsets.map { |offset, length| buffer.slice(offset, length) }
291291
end
292292

293+
# The argument is the first pointer returned by #stack_alloc
293294
def self.stack_free(pointer)
294295
Primitive.io_thread_buffer_free(pointer)
295296
end

0 commit comments

Comments
 (0)