這是6.0之前的poll模型。
          solaris\native\sun\nio\ch\SocketChannelImpl.c
          JNIEXPORT?jint?JNICALL
          Java_sun_nio_ch_SocketChannelImpl_checkConnect(JNIEnv?
          *env,?jobject?this,
          ???????????????????????????jobject?fdo,?jboolean?block,
          ???????????????????????????????????????????????jboolean?ready)
          {
          ????
          int?error?=?0;
          ????
          int?n?=?sizeof(int);
          ????jint?fd?
          =?fdval(env,?fdo);
          ????
          int?result?=?0;
          ????struct?pollfd?poller;

          ????poller.revents?
          =?1;
          ????
          if?(!ready)?{
          ????????poller.fd?
          =?fd;
          ????????poller.events?
          =?POLLOUT;
          ????????poller.revents?
          =?0;
          ????????result?
          =?poll(&poller,?1,?block???-1?:?0);
          ????????
          if?(result?<?0)?{
          ????????????JNU_ThrowIOExceptionWithLastError(env,?
          "Poll?failed");
          ????????????
          return?IOS_THROWN;
          ????????}
          ????
          if?(!block?&&?(result?==?0))
          ????????
          return?IOS_UNAVAILABLE;
          ????}

          ????
          if?(poller.revents)?{
          ????????errno?
          =?0;
          ????????result?
          =?getsockopt(fd,?SOL_SOCKET,?SO_ERROR,?&error,?&n);
          ????????
          if?(result?<?0)?{
          ????????????handleSocketError(env,?errno);
          ????????????
          return?JNI_FALSE;
          ????????}?
          else?if?(error)?{
          ????????????handleSocketError(env,?error);
          ????????????
          return?JNI_FALSE;
          ????????}
          ????????
          return?1;
          ????}
          ????
          return?0;
          }


          6.0缺省的模型是使用epoll
          E:\Java\jdk-6-rc-src\j2se\src\solaris\native\sun\nio\ch\EPollArrayWrapper.c

          JNIEXPORT?void?JNICALL
          Java_sun_nio_ch_EPollArrayWrapper_init(JNIEnv?
          *env,?jclass?this)?
          {
          ????epoll_create_func?
          =?(epoll_create_t)?dlsym(RTLD_DEFAULT,?"epoll_create");
          ????epoll_ctl_func????
          =?(epoll_ctl_t)????dlsym(RTLD_DEFAULT,?"epoll_ctl");
          ????epoll_wait_func???
          =?(epoll_wait_t)???dlsym(RTLD_DEFAULT,?"epoll_wait");
          ???????????????????????????????????????????????????????????????????????????????????????????????????
          ????
          if?((epoll_create_func?==?NULL)?||?(epoll_ctl_func?==?NULL)?||
          ????????(epoll_wait_func?
          ==?NULL))?{
          ????????JNU_ThrowInternalError(env,?
          "unable?to?get?address?of?epoll?functions,?pre-2.6?kernel?");
          ????}
          }


          具體程序的流程我還是不夠清楚,還有待進(jìn)一步深入了解。
          posted on 2006-11-22 01:34 溫少的日志 閱讀(5543) 評(píng)論(2)  編輯  收藏
          Comments
          • # re: 關(guān)于sun JDK nio在linux下的實(shí)現(xiàn)。
            BeanSoft
            Posted @ 2006-11-22 11:04
            看來(lái)真正的高手還是要精通各個(gè)平臺(tái)下的標(biāo)準(zhǔn)C啊, 例如 JDK 的 N 多 BUG, 最后都得修改 C 代碼. 還好 SUN 明年開(kāi)源 JDK, 這樣有實(shí)力的企業(yè)可以自己增強(qiáng) JDK.  回復(fù)  更多評(píng)論   
          • # re: 關(guān)于sun JDK nio在linux下的實(shí)現(xiàn)。[未登錄](méi)
            ken
            Posted @ 2008-01-01 02:35
            原來(lái)JKD1。6在LINUX下的NIO是實(shí)現(xiàn)自EPOLL的。。但是不知道怎么設(shè)置LT或ET模式?  回復(fù)  更多評(píng)論   

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
           
          主站蜘蛛池模板: 呈贡县| 崇左市| 九台市| 广德县| 峨眉山市| 新干县| 大姚县| 宁海县| 商水县| 宣恩县| 遵义市| 东源县| 清丰县| 衡山县| 兴业县| 镇远县| 江油市| 萨嘎县| 昌宁县| 肇庆市| 双辽市| 奇台县| 佛山市| 新营市| 林芝县| 炎陵县| 景谷| 镇坪县| 北票市| 普格县| 长岭县| 石柱| 清流县| 应城市| 盐亭县| 车险| 额尔古纳市| 保康县| 申扎县| 正定县| 香港|