[#36711] [Ruby 1.9 - Bug #4821][Open] Random Segfaults (in start_thread?) — Ivan Bortko <b2630639@...>

22 messages 2011/06/03

[#36730] [Ruby 1.9 - Feature #4824][Open] Provide method Kernel#executed? — Lazaridis Ilias <ilias@...>

56 messages 2011/06/04

[#36750] [Ruby 1.9 - Feature #4830][Open] Provide Default Variables for Array#each and other iterators — Lazaridis Ilias <ilias@...>

24 messages 2011/06/05

[#36785] [Ruby 1.9 - Feature #4840][Open] Allow returning from require — Rodrigo Rosenfeld Rosas <rr.rosas@...>

53 messages 2011/06/06
[#36811] Re: [Ruby 1.9 - Feature #4840][Open] Allow returning from require — Yusuke ENDOH <mame@...> 2011/06/07

Hello,

[#36799] [Ruby 1.9 - Feature #4845][Open] Provide Class#cb_object_instantiated_from_literal(object) — Lazaridis Ilias <ilias@...>

11 messages 2011/06/06

[#36834] [Ruby 1.9 - Feature #3905] rb_clear_cache_by_class() called often during GC for non-blocking I/O — Charles Nutter <headius@...>

10 messages 2011/06/08
[#36860] Re: [Ruby 1.9 - Feature #3905] rb_clear_cache_by_class() called often during GC for non-blocking I/O — Eric Wong <normalperson@...> 2011/06/08

Charles Nutter <headius@headius.com> wrote:

[#36863] Object#trust vs Object#taint — Aaron Patterson <aaron@...>

Hi,

16 messages 2011/06/08
[#36866] Re: Object#trust vs Object#taint — Yukihiro Matsumoto <matz@...> 2011/06/08

Hi,

[#36873] Re: Object#trust vs Object#taint — Aaron Patterson <aaron@...> 2011/06/09

On Thu, Jun 09, 2011 at 07:49:06AM +0900, Yukihiro Matsumoto wrote:

[#37071] [Ruby 1.9 - Feature #4877][Open] Unify Variable Expansion within Strings — Lazaridis Ilias <ilias@...>

12 messages 2011/06/12

[#37106] ruby core tutorials location — Roger Pack <rogerdpack2@...>

Hello all.

10 messages 2011/06/13
[#37107] Re: ruby core tutorials location — Jon <jon.forums@...> 2011/06/13

> Hello all.

[#37115] Re: ruby core tutorials location — Roger Pack <rogerdpack2@...> 2011/06/13

> Rather than adding links to source code, I would prefer the wikibooks link and others under a new Tutorials section of http://www.ruby-lang.org/en/documentation/ as well as adding http://ruby.runpaint.org/ to the existing Getting Started section.

[#37117] Re: ruby core tutorials location — Jon <jon.forums@...> 2011/06/13

> > Rather than adding links to source code, I would prefer the wikibooks link and others under a new Tutorials section of http://www.ruby-lang.org/en/documentation/ as well as adding http://ruby.runpaint.org/ to the existing Getting Started section.

[#37128] Re: ruby core tutorials location — Roger Pack <rogerdpack2@...> 2011/06/14

> I like what you're trying to do and see how great that tutorial connection from rdoc/yard could be, say, mixing with existing ruby-doc.org and rubydoc.info. ut I question embedding source links to info in which the info can easily grow outdated or abandoned as time passes. I also question the ongoing maintenance burdens.

[#37137] Re: ruby core tutorials location — Jon <jon.forums@...> 2011/06/14

> > I like what you're trying to do and see how great that tutorial connection from rdoc/yard could be, say, mixing with existing ruby-doc.org and rubydoc.info. ut I question embedding source links to info in which the info can easily grow outdated or abandoned as time passes. I also question the ongoing maintenance burdens.

[#37164] [Ruby 1.9 - Feature #4890][Open] Enumerable#lazy — Yutaka HARA <redmine@...>

30 messages 2011/06/16

[#37170] [Ruby 1.9 - Bug #4893][Open] Literal Instantiation breaks Object Model — Lazaridis Ilias <ilias@...>

61 messages 2011/06/16

[#37207] [Ruby 1.9 - Feature #4897][Open] Define Math::TAU and BigMath.TAU. The "true" circle constant, Tau=2*Pi. See http://tauday.com/ — Simon Baird <simon.baird@...>

43 messages 2011/06/17

[#37286] [Ruby 1.9 - Bug #4916][Open] [BUG] Segmentation fault - dyld: lazy symbol binding failed: Symbol not found: _ASN1_put_eoc — Hiroshi NAKAMURA <nakahiro@...>

9 messages 2011/06/22

[#37324] [Ruby 1.9 - Bug #4923][Open] [ext/openssl] test_ssl.rb: test_client_auth fails — Martin Bosslet <Martin.Bosslet@...>

19 messages 2011/06/23

[#37576] [Ruby 1.9 - Feature #4938][Open] Add Random.bytes [patch] — Marc-Andre Lafortune <ruby-core@...>

13 messages 2011/06/27

[#37612] [Ruby 1.9 - Bug #4941][Open] cannot load such file -- rubygems.rb (LoadError) — Lazaridis Ilias <ilias@...>

25 messages 2011/06/28

[ruby-core:37192] rb_w32_add_socket / rb_w32_remove_socket

From: ghazel@...
Date: 2011-06-17 01:12:55 UTC
List: ruby-core #37192
Hello,

There are many gems which attempt to make use of Windows sockets
created by external libraries (libpq, libmysqlclient, libcurl, etc).
Currently, they are all broken. This is impossible on Ruby 1.9, and on
Ruby 1.8 it required a significant hack which I submitted to several
projects only this year.

First, I should make it clear that I think the correct way to fix this
is to remove the use of _open_osfhandle *entirely* from win32/win32.c,
as I suggested here: http://www.ruby-forum.com/topic/869239 However
this is becoming increasingly more time consuming as  Ruby 1.9 adds to
the complexity of the win32 layer, and it seems unlikely that a 1.8
release with such a tremendously large patch would ever occur.

So, attached are two very tiny patches for new functions which will
allow gem authors to use externally created sockets. Their usage is as
follows:

int fd = libwhatever_get_socket();
#ifdef _WIN32
  ruby_fd = rb_w32_add_socket(fd, 0);
#else
  ruby_fd = fd;
#endif

... do stuff with the ruby_fd as you would on other platforms ...

#ifdef _WIN32
  rb_w32_remove_socket(ruby_fd);
#endif

libwhatever_close_socket(fd);

In a nutshell; you pass the SOCKET given to you by the external
library to ruby and it gives you a CRT fd you can use with ruby
functions. When you're done, you pass that CRT fd to ruby to remove
it, and then close the SOCKET however the library normally does.

If the ifdefs are not preferred, rb_add_socket / rb_remove_socket
could be added as no-ops on non-win32 platforms, however I should
stress that making this a permanent fixture of the API is probably a
mistake, and the ruby win32 code should be rewritten to use
HANDLEs/SOCKETs instead of CRT fds.

Thoughts?

-Greg

Attachments (2)

add_socket.1_8.patch (906 Bytes, text/x-diff)
Index: win32/win32.c
===================================================================
--- win32/win32.c	(revision 31999)
+++ win32/win32.c	(working copy)
@@ -1927,6 +1927,19 @@
 }
 #endif
 
+int
+rb_w32_add_socket(SOCKET sock, int flag)
+{
+    return rb_w32_open_osfhandle(sock, O_RDWR|O_BINARY|O_NOINHERIT);
+}
+
+void
+rb_w32_remove_socket(int fd)
+{
+    _set_osfhnd(fd, (SOCKET)INVALID_HANDLE_VALUE);
+    _close(fd);
+}
+
 #undef getsockopt
 
 static int
Index: win32/win32.h
===================================================================
--- win32/win32.h	(revision 31999)
+++ win32/win32.h	(working copy)
@@ -612,6 +612,8 @@
 size_t rb_w32_write(int, const void *, size_t);
 int  rb_w32_utime(const char *, struct utimbuf *);
 #define Sleep(msec) (void)rb_w32_sleep(msec)
+int  rb_w32_add_socket(SOCKET sock, int flag);
+void rb_w32_remove_socket(int fd);
 
 /*
 == ***CAUTION***
add_socket.1_9.patch (1.29 KB, text/x-diff)
Index: include/ruby/win32.h
===================================================================
--- include/ruby/win32.h	(revision 32136)
+++ include/ruby/win32.h	(working copy)
@@ -235,6 +235,8 @@
 extern rb_pid_t  rb_w32_pipe_exec(const char *, const char *, int, int *, int *);
 extern int    flock(int fd, int oper);
 extern int    rb_w32_has_cancel_io(void);
+extern int    rb_w32_add_socket(SOCKET, int);
+extern void   rb_w32_remove_socket(int);
 extern int    rb_w32_is_socket(int);
 extern int    WSAAPI rb_w32_accept(int, struct sockaddr *, int *);
 extern int    WSAAPI rb_w32_bind(int, const struct sockaddr *, int);
Index: win32/win32.c
===================================================================
--- win32/win32.c	(revision 32136)
+++ win32/win32.c	(working copy)
@@ -2177,6 +2177,26 @@
 }
 #endif
 
+int
+rb_w32_add_socket(SOCKET sock, int flag)
+{
+    int fd = rb_w32_open_osfhandle(sock, O_RDWR|O_BINARY|O_NOINHERIT);
+    if (fd != -1) {
+        st_insert(socklist, (st_data_t)sock, (st_data_t)flag);
+    }
+    return fd;
+}
+
+void
+rb_w32_remove_socket(int fd)
+{
+    SOCKET sock = TO_SOCKET(fd);
+    st_data_t key = (st_data_t)sock;
+    st_delete(socklist, &key, NULL);
+    _set_osfhnd(fd, (SOCKET)INVALID_HANDLE_VALUE);
+    _close(fd);
+}
+
 #undef getsockopt
 
 static int

In This Thread

Prev Next