comparison src/os/solaris/vm/os_solaris.cpp @ 4717:11c26bfcf8c7

7091417: recvfrom's 6th input should be of type socklen_t Summary: Revamp class os's socket method formal args to match socket.h, insert casts in appropriate places, and copyin-copyout int*'s that s/b socklen_t*'s in jvm.cpp. Reviewed-by: coleenp, dholmes Contributed-by: erik.gahlin@oracle.com, rickard.backman@oracle.com, nils.loodin@oracle.com, markus.gronlund@oracle.com
author phh
date Wed, 21 Dec 2011 15:48:16 -0500
parents 36b057451829
children 4b18532913c7
comparison
equal deleted inserted replaced
4716:4502fd5c7698 4717:11c26bfcf8c7
6361 6361
6362 int os::socket_close(int fd) { 6362 int os::socket_close(int fd) {
6363 RESTARTABLE_RETURN_INT(::close(fd)); 6363 RESTARTABLE_RETURN_INT(::close(fd));
6364 } 6364 }
6365 6365
6366 int os::recv(int fd, char *buf, int nBytes, int flags) { 6366 int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
6367 INTERRUPTIBLE_RETURN_INT(::recv(fd, buf, nBytes, flags), os::Solaris::clear_interrupted); 6367 INTERRUPTIBLE_RETURN_INT((int)::recv(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
6368 } 6368 }
6369 6369
6370 6370 int os::send(int fd, char* buf, size_t nBytes, uint flags) {
6371 int os::send(int fd, char *buf, int nBytes, int flags) { 6371 INTERRUPTIBLE_RETURN_INT((int)::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
6372 INTERRUPTIBLE_RETURN_INT(::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted); 6372 }
6373 } 6373
6374 6374 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
6375 int os::raw_send(int fd, char *buf, int nBytes, int flags) { 6375 RESTARTABLE_RETURN_INT((int)::send(fd, buf, nBytes, flags));
6376 RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, flags));
6377 } 6376 }
6378 6377
6379 // As both poll and select can be interrupted by signals, we have to be 6378 // As both poll and select can be interrupted by signals, we have to be
6380 // prepared to restart the system call after updating the timeout, unless 6379 // prepared to restart the system call after updating the timeout, unless
6381 // a poll() is done with timeout == -1, in which case we repeat with this 6380 // a poll() is done with timeout == -1, in which case we repeat with this
6406 } 6405 }
6407 } else return res; 6406 } else return res;
6408 } 6407 }
6409 } 6408 }
6410 6409
6411 int os::connect(int fd, struct sockaddr *him, int len) { 6410 int os::connect(int fd, struct sockaddr *him, socklen_t len) {
6412 int _result; 6411 int _result;
6413 INTERRUPTIBLE_NORESTART(::connect(fd, him, len), _result, 6412 INTERRUPTIBLE_NORESTART(::connect(fd, him, len), _result,\
6414 os::Solaris::clear_interrupted); 6413 os::Solaris::clear_interrupted);
6415 6414
6416 // Depending on when thread interruption is reset, _result could be 6415 // Depending on when thread interruption is reset, _result could be
6417 // one of two values when errno == EINTR 6416 // one of two values when errno == EINTR
6418 6417
6419 if (((_result == OS_INTRPT) || (_result == OS_ERR)) 6418 if (((_result == OS_INTRPT) || (_result == OS_ERR))
6420 && (errno == EINTR)) { 6419 && (errno == EINTR)) {
6421 /* restarting a connect() changes its errno semantics */ 6420 /* restarting a connect() changes its errno semantics */
6422 INTERRUPTIBLE(::connect(fd, him, len), _result, 6421 INTERRUPTIBLE(::connect(fd, him, len), _result,\
6423 os::Solaris::clear_interrupted); 6422 os::Solaris::clear_interrupted);
6424 /* undo these changes */ 6423 /* undo these changes */
6425 if (_result == OS_ERR) { 6424 if (_result == OS_ERR) {
6426 if (errno == EALREADY) { 6425 if (errno == EALREADY) {
6427 errno = EINPROGRESS; /* fall through */ 6426 errno = EINPROGRESS; /* fall through */
6428 } else if (errno == EISCONN) { 6427 } else if (errno == EISCONN) {
6432 } 6431 }
6433 } 6432 }
6434 return _result; 6433 return _result;
6435 } 6434 }
6436 6435
6437 int os::accept(int fd, struct sockaddr *him, int *len) { 6436 int os::accept(int fd, struct sockaddr* him, socklen_t* len) {
6438 if (fd < 0) 6437 if (fd < 0) {
6439 return OS_ERR; 6438 return OS_ERR;
6440 INTERRUPTIBLE_RETURN_INT((int)::accept(fd, him,\ 6439 }
6441 (socklen_t*) len), os::Solaris::clear_interrupted); 6440 INTERRUPTIBLE_RETURN_INT((int)::accept(fd, him, len),\
6442 } 6441 os::Solaris::clear_interrupted);
6443 6442 }
6444 int os::recvfrom(int fd, char *buf, int nBytes, int flags, 6443
6445 sockaddr *from, int *fromlen) { 6444 int os::recvfrom(int fd, char* buf, size_t nBytes, uint flags,
6446 //%%note jvm_r11 6445 sockaddr* from, socklen_t* fromlen) {
6447 INTERRUPTIBLE_RETURN_INT((int)::recvfrom(fd, buf, nBytes,\ 6446 INTERRUPTIBLE_RETURN_INT((int)::recvfrom(fd, buf, nBytes, flags, from, fromlen),\
6448 flags, from, fromlen), os::Solaris::clear_interrupted); 6447 os::Solaris::clear_interrupted);
6449 } 6448 }
6450 6449
6451 int os::sendto(int fd, char *buf, int len, int flags, 6450 int os::sendto(int fd, char* buf, size_t len, uint flags,
6452 struct sockaddr *to, int tolen) { 6451 struct sockaddr* to, socklen_t tolen) {
6453 //%%note jvm_r11 6452 INTERRUPTIBLE_RETURN_INT((int)::sendto(fd, buf, len, flags, to, tolen),\
6454 INTERRUPTIBLE_RETURN_INT((int)::sendto(fd, buf, len, flags,\ 6453 os::Solaris::clear_interrupted);
6455 to, tolen), os::Solaris::clear_interrupted);
6456 } 6454 }
6457 6455
6458 int os::socket_available(int fd, jint *pbytes) { 6456 int os::socket_available(int fd, jint *pbytes) {
6459 if (fd < 0) 6457 if (fd < 0) {
6460 return OS_OK; 6458 return OS_OK;
6461 6459 }
6462 int ret; 6460 int ret;
6463 6461 RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret);
6464 RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret); 6462 // note: ioctl can return 0 when successful, JVM_SocketAvailable
6465 6463 // is expected to return 0 on failure and 1 on success to the jdk.
6466 //%% note ioctl can return 0 when successful, JVM_SocketAvailable 6464 return (ret == OS_ERR) ? 0 : 1;
6467 // is expected to return 0 on failure and 1 on success to the jdk. 6465 }
6468 6466
6469 return (ret == OS_ERR) ? 0 : 1; 6467 int os::bind(int fd, struct sockaddr* him, socklen_t len) {
6470 }
6471
6472
6473 int os::bind(int fd, struct sockaddr *him, int len) {
6474 INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\ 6468 INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\
6475 os::Solaris::clear_interrupted); 6469 os::Solaris::clear_interrupted);
6476 } 6470 }