Method: MTLibuv::Pipe#write2

Defined in:
lib/mt-libuv/pipe.rb

#write2(fd, data = ".", wait: false) ⇒ Object



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)

            # local as this variable will be avaliable until the handle is closed
            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)       # close the handle
            end
        rescue Exception => e
            deferred.reject(e)  # this write exception may not be fatal
        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