[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00400] Re: jserver の接続数上限



大阪教育大の青野です。鳩貝さん、鵜川さん、ありがとうございます。

<20000616.170329.46113892.ukawa@nara.sbc.sharp.co.jp>の記事において
ukawa@sbc.nara.sharp.co.jpさんは書きました。

>> 自分で作業していないのになんですが、、
>> HAVE_RLIMITなり、HAVE_GETDTABLESIZEなりで処理を分ける方が良いかなと思います。
>> どうでしょ?

私も少しいじっていたのですが、以下のような感じでいかがでしょ
うか。ちょっと最後にmax_clientと比較するデバッグメッセージ
を追加してます(内容はいい加減です)。Solaris 2.4で
(jserverのみですが)コンパイルできることは確認しました。
#ほかにconfigure.inやconfig.h.inにエントリを足す必要があ
#ります。

wnn-users MLの議論も見ていたのですが、可能ならsetrlimit() 
でmax_clientに合わせて最大fdを増やす(不可能な場合は警告を
出す)ようにした方が分かりやすいのかもしれません。

--- ../orig/Wnn/jserver/de.c	Tue Mar 21 01:31:43 2000
+++ Wnn/jserver/de.c	Fri Jun 16 17:46:47 2000
@@ -70,9 +70,8 @@
 
 #include "msg.h"
 
-#ifdef BSD42
-#undef NOFILE
-#define NOFILE getdtablesize()
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
 #endif
 
 #ifdef HITACHI
@@ -339,7 +338,30 @@
 {
   int sel_w;                    /* long word(==int) width of all_socks */
 
+  /* 各種手段を使って同時オープンできるファイル数を調べる */
+#if defined(HAVE_GETDTABLESIZE)
+  nofile = getdtablesize();
+#elif defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE)
+  {
+    struct rlimit rlim;
+    if(!getrlimit(RLIMIT_NOFILE, &rlim)) {
+      nofile = rlim.rlim_cur;
+    } else {
+      nofile = NOFILE;
+    }
+  }
+#else
+  /* これまでの条件に合致する場合、HITACHI で不具合が起きるかもしれない */
   nofile = NOFILE;
+#endif	/* defined(HAVE_SYSCONF) && defined(_SO_OPEN_MAX) */
+  /* for DEBUG : max_client との比較もしてみる */
+  fprintf(stderr, "This system can use %d file descriptors.\n", nofile);
+  if(max_client > nofile) {
+    fprintf(stderr,
+	    "Warning: I cannot serve max_client(%d) requests, sorry...\n",
+	    max_client);
+  }
+
   sel_w = (nofile - 1) / BINTSIZE + 1;
   all_socks = (int *) calloc (sel_w, (sizeof (int)));
   ready_socks = (int *) malloc (sel_w * (sizeof (int)));

getdtablesizeが使われているところはほかにuum/jhlp.cもある
のですが、ここもなおせばNOFILEに関する機種依存部分がすっき
りしそうです。
----
大阪教育大学 情報処理センター
青野智樹	(aono@cc.osaka-kyoiku.ac.jp)
#情報処理センターに関するお問い合わせは 
#center@cc.osaka-kyoiku.ac.jp へお願いします。