84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
# File 'lib/mt-libuv/pipe.rb', line 84
def write2(fd, data = ".", wait: false)
deferred = @reactor.defer
if @ipc && !@closed
begin
assert_type(String, data, WRITE_ERROR)
assert_type(Handle, fd, WRITE2_ERROR)
size = data.respond_to?(:bytesize) ? data.bytesize : data.size
buffer = ::MTLibuv::Ext.buf_init(FFI::MemoryPointer.from_string(data), size)
req = ::MTLibuv::Ext.allocate_request_write
@write_callbacks ||= {}
@write_callbacks[req.address] = deferred
error = check_result ::MTLibuv::Ext.write2(req, handle, buffer, 1, fd.handle, callback(:write2_complete, req.address))
if error
@write_callbacks.delete(req.address)
::MTLibuv::Ext.free(req)
deferred.reject(error)
reject(error) end
rescue Exception => e
deferred.reject(e) end
else
deferred.reject(TypeError.new('pipe not initialized for interprocess communication'))
end
if wait
return deferred.promise if wait == :promise
deferred.promise.value
end
self
end
|