Class: Nmsg::Socket
- Inherits:
-
Object
- Object
- Nmsg::Socket
- Defined in:
- ext/nmsg/rubyext.c
Class Method Summary collapse
Instance Method Summary collapse
- #bind(addr) ⇒ Object
- #close ⇒ Object
- #connect(addr) ⇒ Object
- #get_fd ⇒ Object
- #get_option(level, option) ⇒ Object
- #get_sysfd ⇒ Object
- #initialize(domain, protocol) ⇒ Object constructor
- #poll(mask, timeout) ⇒ Object
- #recv_msg ⇒ Object
- #send_msg(obj) ⇒ Object
- #send_msg_block(obj) ⇒ Object
- #set_option(level, option, value) ⇒ Object
- #shutdown(how) ⇒ Object
Constructor Details
#initialize(domain, protocol) ⇒ Object
73 74 75 76 77 78 79 80 |
# File 'ext/nmsg/rubyext.c', line 73 VALUE rb_socket_initialize(VALUE self, VALUE domain, VALUE protocol) { GET_SOCKET(self); if (!S) return Qnil; S->fd = nn_socket(NUM2INT(domain), NUM2INT(protocol)); return self; } |
Class Method Details
.device(so1, so2) ⇒ Object
266 267 268 269 270 271 272 273 274 275 276 277 |
# File 'ext/nmsg/rubyext.c', line 266 VALUE rb_socket_device(VALUE klass, VALUE so1, VALUE so2) { Socket *S1; Data_Get_Struct(so1, Socket, S1); Socket tmp = { .fd = -1 }; Socket *S2 = &tmp; if (so2 != Qnil) // FIXME Data_Get_Struct(so2, Socket, S2); return nn_device(S1->fd, S2->fd); } |
.term ⇒ Object
261 262 263 264 |
# File 'ext/nmsg/rubyext.c', line 261 VALUE rb_socket_term(VALUE klass) { nn_term(); return klass; } |
Instance Method Details
#bind(addr) ⇒ Object
82 83 84 85 86 87 88 89 90 |
# File 'ext/nmsg/rubyext.c', line 82 VALUE rb_socket_bind(VALUE self, VALUE addr) { GET_SOCKET(self); if (!S || S->fd == -1) return Qnil; const char *addr_c = StringValueCStr(addr); const int endpoint_id = nn_bind(S->fd, addr_c); return (endpoint_id == -1) ? Qnil : INT2NUM(endpoint_id); } |
#close ⇒ Object
227 228 229 230 231 232 233 234 235 |
# File 'ext/nmsg/rubyext.c', line 227 VALUE rb_socket_close(VALUE self) { GET_SOCKET(self); if (S && S->fd > 0) { nn_close(S->fd); S->fd = -1; } return self; } |
#connect(addr) ⇒ Object
92 93 94 95 96 97 98 99 100 |
# File 'ext/nmsg/rubyext.c', line 92 VALUE rb_socket_connect(VALUE self, VALUE addr) { GET_SOCKET(self); if (!S || S->fd == -1) return Qnil; const char *addr_c = StringValueCStr(addr); const int endpoint_id = nn_connect(S->fd, addr_c); return (endpoint_id == -1) ? Qnil : INT2NUM(endpoint_id); } |
#get_fd ⇒ Object
247 248 249 250 |
# File 'ext/nmsg/rubyext.c', line 247 VALUE rb_socket_get_fd(VALUE self) { GET_SOCKET(self); return rb_int_new(S->fd); } |
#get_option(level, option) ⇒ Object
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'ext/nmsg/rubyext.c', line 196 VALUE rb_socket_get_opt(VALUE self, VALUE level, VALUE option) { GET_SOCKET(self); if (!S || S->fd < 0) return Qnil; // TODO/FIXME: string values int lvl = NUM2INT(level); int opt = NUM2INT(option); int val = -1; size_t sz = sizeof(val); const int res = nn_getsockopt(S->fd, lvl, opt, &val, &sz); return (res == 0) ? INT2NUM(val) : Qnil; } |
#get_sysfd ⇒ Object
252 253 254 255 256 257 258 259 |
# File 'ext/nmsg/rubyext.c', line 252 VALUE rb_socket_get_sysfd(VALUE self) { GET_SOCKET(self); int optval; size_t optval_len = sizeof(int); const int res = nn_getsockopt(S->fd, NN_SOL_SOCKET, NN_RCVFD, (void *)&optval, &optval_len); return INT2NUM((res == 0) ? optval : -1); } |
#poll(mask, timeout) ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'ext/nmsg/rubyext.c', line 102 VALUE rb_socket_poll(VALUE self, VALUE mask, VALUE timeout) { GET_SOCKET(self); if (!S || S->fd == -1) return Qnil; if (timeout == Qnil) timeout = INT2NUM(0); struct nn_pollfd pfd; pfd.fd = S->fd; pfd.events = NUM2INT(mask); const int res = nn_poll(&pfd, 1, NUM2INT(timeout)); if (res == -1) // error return Qnil; else if (res == 0) // timeout return Qfalse; return (pfd.revents & NUM2INT(mask)) ? Qtrue : Qfalse; } |
#recv_msg ⇒ Object
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'ext/nmsg/rubyext.c', line 123 VALUE rb_socket_recv_msg(VALUE self) { GET_SOCKET(self); if (!S || S->fd == -1) return Qnil; void *buffer; const int nbytes = nn_recv(S->fd, &buffer, NN_MSG, NN_DONTWAIT); if (nbytes < 0) return Qnil; VALUE rs = rb_tainted_str_new(buffer, nbytes); nn_freemsg(buffer); return rs; } |
#send_msg(obj) ⇒ Object
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'ext/nmsg/rubyext.c', line 139 VALUE rb_socket_send_msg(VALUE self, VALUE obj) { GET_SOCKET(self); if (!S || S->fd == -1) return Qnil; const int msg_bytes = RSTRING_LEN(obj); const char *data = RSTRING_PTR(obj); void *msg = nn_allocmsg(msg_bytes, 0); if (!msg) return Qnil; memcpy(msg, data, msg_bytes); const int nbytes = nn_send(S->fd, &msg, NN_MSG, NN_DONTWAIT); if (nbytes < 0) { nn_freemsg(msg); return Qnil; } return (nbytes == msg_bytes) ? Qtrue : Qfalse; } |
#send_msg_block(obj) ⇒ Object
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'ext/nmsg/rubyext.c', line 172 VALUE rb_socket_send_msg_block(VALUE self, VALUE obj) { GET_SOCKET(self); if (!S || S->fd == -1) return Qnil; const int msg_bytes = RSTRING_LEN(obj); const char *data = RSTRING_PTR(obj); void *msg = nn_allocmsg(msg_bytes, 0); if (!msg) return Qnil; memcpy(msg, data, msg_bytes); struct nogvl_msg wrapper = { S->fd, &msg }; const int nbytes = (int)rb_thread_call_without_gvl(nogvl_send_msg, &wrapper, RUBY_UBF_IO, 0); if (nbytes < 0) { nn_freemsg(msg); return Qnil; } return (nbytes == msg_bytes) ? Qtrue : Qfalse; } |
#set_option(level, option, value) ⇒ Object
212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'ext/nmsg/rubyext.c', line 212 VALUE rb_socket_set_opt(VALUE self, VALUE level, VALUE option, VALUE value) { GET_SOCKET(self); if (!S || S->fd < 0) return Qnil; // TODO/FIXME: string values int lvl = NUM2INT(level); int opt = NUM2INT(option); int val = NUM2INT(value); const int res = nn_setsockopt(S->fd, lvl, opt, &val, sizeof(val)); return (res == 0) ? self : Qnil; } |
#shutdown(how) ⇒ Object
237 238 239 240 241 242 243 244 245 |
# File 'ext/nmsg/rubyext.c', line 237 VALUE rb_socket_shutdown(VALUE self, VALUE how) { GET_SOCKET(self); if (S && S->fd > 0) { nn_shutdown(S->fd, NUM2INT(how)); S->fd = -1; } return self; } |