Project

General

Profile

Feature #11298 ยป 0001-socket-memoize-common-socket-families-in-fptr-mode.patch

normalperson (Eric Wong), 06/23/2015 07:18 PM

View differences:

ext/socket/ancdata.c
GetOpenFile(sock, fptr);
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
family = rsock_getfamily(fptr->fd);
family = rsock_getfamily(fptr);
#endif
data = vflags = dest_sockaddr = Qnil;
......
);
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
family = rsock_getfamily(fptr->fd);
family = rsock_getfamily(fptr);
if (mh.msg_controllen) {
char *msg_end = (char *)mh.msg_control + mh.msg_controllen;
for (cmh = CMSG_FIRSTHDR(&mh); cmh != NULL; cmh = CMSG_NXTHDR(&mh, cmh)) {
ext/socket/basicsocket.c
}
GetOpenFile(sock, fptr);
family = rsock_getfamily(fptr->fd);
family = rsock_getfamily(fptr);
level = rsock_level_arg(family, lev);
option = rsock_optname_arg(family, level, optname);
......
int family;
GetOpenFile(sock, fptr);
family = rsock_getfamily(fptr->fd);
family = rsock_getfamily(fptr);
level = rsock_level_arg(family, lev);
option = rsock_optname_arg(family, level, optname);
len = 256;
ext/socket/init.c
}
int
rsock_getfamily(int sockfd)
rsock_getfamily(rb_io_t *fptr)
{
union_sockaddr ss;
socklen_t sslen = (socklen_t)sizeof(ss);
int cached = fptr->mode & FMODE_SOCK;
if (cached) {
switch (cached) {
#ifdef AF_UNIX
case FMODE_UNIX: return AF_UNIX;
#endif
case FMODE_INET: return AF_INET;
case FMODE_INET6: return AF_INET6;
}
}
ss.addr.sa_family = AF_UNSPEC;
if (getsockname(sockfd, &ss.addr, &sslen) < 0)
if (getsockname(fptr->fd, &ss.addr, &sslen) < 0)
return AF_UNSPEC;
switch (ss.addr.sa_family) {
#ifdef AF_UNIX
case AF_UNIX: fptr->mode |= FMODE_UNIX; break;
#endif
case AF_INET: fptr->mode |= FMODE_INET; break;
case AF_INET6: fptr->mode |= FMODE_INET6; break;
}
return ss.addr.sa_family;
}
ext/socket/rubysocket.h
extern int rsock_cmsg_cloexec_state;
#define FMODE_NOREVLOOKUP 0x100
/* common socket families only */
#define FMODE_UNIX 0x00200000
#define FMODE_INET 0x00400000
#define FMODE_INET6 0x00800000
#define FMODE_SOCK (FMODE_UNIX|FMODE_INET|FMODE_INET6)
extern VALUE rb_cBasicSocket;
extern VALUE rb_cIPSocket;
extern VALUE rb_cTCPSocket;
......
int rsock_cmsg_type_arg(int family, int level, VALUE type);
int rsock_shutdown_how_arg(VALUE how);
int rsock_getfamily(int sockfd);
int rsock_getfamily(rb_io_t *fptr);
struct rb_addrinfo {
struct addrinfo *ai;
include/ruby/io.h
#define FMODE_TEXTMODE 0x00001000
/* #define FMODE_PREP 0x00010000 */
#define FMODE_SETENC_BY_BOM 0x00100000
/* #define FMODE_UNIX 0x00200000 */
/* #define FMODE_INET 0x00400000 */
/* #define FMODE_INET6 0x00800000 */
#define GetOpenFile(obj,fp) rb_io_check_closed((fp) = RFILE(rb_io_taint_check(obj))->fptr)
-
    (1-1/1)