From: "nobu (Nobuyoshi Nakada)" Date: 2012-03-31T10:53:18+09:00 Subject: [ruby-core:43976] [ruby-trunk - Feature #5677][Assigned] IO C API Issue #5677 has been updated by nobu (Nobuyoshi Nakada). Status changed from Open to Assigned Assignee set to akr (Akira Tanaka) MartinBosslet (Martin Bosslet) wrote: > 1. Duplicating the file descriptor to obtain a pure FILE* > like it is done in ext/openssl/ossl_bio.c[2] and continue > working on the raw FILE*. Can't you use rb_io_stdio_file()? And OpenSSL seems providing BIO_new_fd() too. > The problem, though, is that only rb_io_bufwrite is public API in io.h, > rb_io_bufread is declared private in internal.h and rb_cloexec_dup is > semi-public in intern.h. > > Could we make rb_io_bufread public API in io.h as well? What about > rb_cloexec_dup? It doesn't seem bad to me. They are all added to internal.h by akr. ---------------------------------------- Feature #5677: IO C API https://bugs.ruby-lang.org/issues/5677#change-25497 Author: MartinBosslet (Martin Bosslet) Status: Assigned Priority: Normal Assignee: akr (Akira Tanaka) Category: core Target version: 2.0.0 This is related to the proposal in [ruby-core:41321][1]. I'd like to take advantage of streaming IO in an extension I am working on. The problem I'm having is that I don't want to call IO#read on the rb_funcall level because that would kill the performance due to wrapping the bytes into Ruby objects back and forth again. I saw two solutions to my problem: 1. Duplicating the file descriptor to obtain a pure FILE* like it is done in ext/openssl/ossl_bio.c[2] and continue working on the raw FILE*. 2. Since I really only need to read and write on the stream, I was looking for public Ruby C API that would support me in the process, and I found - ssize_t rb_io_bufwrite(VALUE io, const void *buf, size_t size) - ssize_t rb_io_bufread(VALUE io, void *buf, size_t size) I think both cases are valid use cases, 1. is likely necessary if there is the need to pass a FILE* on to an external C library, 2. is for cases like mine where there is the need to operate on raw C data types for performance reasons. The problem, though, is that only rb_io_bufwrite is public API in io.h, rb_io_bufread is declared private in internal.h and rb_cloexec_dup is semi-public in intern.h. Could we make rb_io_bufread public API in io.h as well? What about rb_cloexec_dup? [1] http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/41321 [2] https://github.com/ruby/ruby/blob/trunk/ext/openssl/ossl_bio.c#L17 -- http://bugs.ruby-lang.org/