⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 natselectorimplposix.cc

📁 gcc的组建
💻 CC
字号:
// natSelectorImplPosix.cc/* Copyright (C) 2002, 2003, 2004  Free Software Foundation   This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License.  Please consult the file "LIBGCJ_LICENSE" fordetails.  */#include <config.h>#include <platform.h>#include <errno.h>#include <string.h>#include <gnu/java/nio/VMSelector.h>#include <java/io/InterruptedIOException.h>#include <java/io/IOException.h>#include <java/lang/Thread.h>static voidhelper_put_filedescriptors (jintArray fdArray, fd_set& fds, int& max_fd){  jint* tmpFDArray = elements (fdArray);  for (int index = 0; index < JvGetArrayLength (fdArray); index++)    {      int fd = tmpFDArray [index];      if (fd > 0)        {          FD_SET (tmpFDArray [index], &fds);          if (tmpFDArray [index] > max_fd)            max_fd = tmpFDArray [index];        }    }}static voidhelper_get_filedescriptors (jintArray& fdArray, fd_set fds){  jint* tmpFDArray = elements (fdArray);    for (int index = 0; index < JvGetArrayLength (fdArray); index++)    {      int fd = tmpFDArray [index];      if (fd < 0 || !FD_ISSET (fd, &fds))        tmpFDArray [index] = 0;    }}static voidhelper_reset (jintArray& fdArray){  jint* tmpFDArray = elements (fdArray);    for (int index = 0; index < JvGetArrayLength (fdArray); index++)    tmpFDArray [index] = 0;}jintgnu::java::nio::VMSelector::select (jintArray read, jintArray write,                                    jintArray except, jlong timeout){  jint result;  int max_fd = 0;  fd_set read_fds;  fd_set write_fds;  fd_set except_fds;  struct timeval real_time_data;  struct timeval *time_data = NULL;  // If a legal timeout value isn't given, use NULL.  // This means an infinite timeout. The specification  // also says that a zero timeout should be treated  // as infinite. Otherwise (if the timeout value is legal),  // fill our timeval struct and use it for the select.  if (timeout > 0)    {      real_time_data.tv_sec = timeout / 1000;      real_time_data.tv_usec = (timeout % 1000) * 1000;      time_data = &real_time_data;    }  // Reset all fd_set structures  FD_ZERO (&read_fds);  FD_ZERO (&write_fds);  FD_ZERO (&except_fds);  // Fill the fd_set data structures for the _Jv_select() call.  helper_put_filedescriptors (read, read_fds, max_fd);  helper_put_filedescriptors (write, write_fds, max_fd);  helper_put_filedescriptors (except, except_fds, max_fd);  // Actually do the select  try    {      result = _Jv_select (max_fd + 1, &read_fds, &write_fds,                           &except_fds, time_data);    }  catch (::java::io::InterruptedIOException *e)    {      // The behavior of JRE 1.4.1 is that no exception is thrown      // when the thread is interrupted, but the thread's interrupt      // status is set. Clear all of our select sets and return 0,      // indicating that nothing was selected.      ::java::lang::Thread::currentThread ()->interrupt ();       helper_reset (read);       helper_reset (write);       helper_reset (except);       return 0;    }  if (result < 0)    {      char* strerr = strerror (errno);      throw new ::java::io::IOException (JvNewStringUTF (strerr));    }  // Set the file descriptors according to the values returned from select().  helper_get_filedescriptors (read, read_fds);  helper_get_filedescriptors (write, write_fds);  helper_get_filedescriptors (except, except_fds);  return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -