From owner-doc-jp@jp.freebsd.org  Sun Jan 31 03:32:52 1999
Received: (from daemon@localhost)
	by jaz.jp.freebsd.org (8.9.1+3.1W/8.7.3) id DAA10119;
	Sun, 31 Jan 1999 03:32:52 +0900 (JST)
	(envelope-from owner-doc-jp@jp.FreeBSD.org)
Received: from rr.iij4u.or.jp (h197.p060.iij4u.or.jp [210.130.60.197])
	by jaz.jp.freebsd.org (8.9.1+3.1W/8.7.3) with SMTP id DAA10104
	for <doc-jp@jp.freebsd.org>; Sun, 31 Jan 1999 03:32:47 +0900 (JST)
	(envelope-from sada@rr.iij4u.or.jp)
Received: (qmail 4318 invoked by uid 1000); 31 Jan 1999 03:32:46 +0900
Date: 31 Jan 1999 03:32:46 +0900
Message-ID: <19990130183246.4317.sada@rr.iij4u.or.jp>
To: doc-jp@jp.freebsd.org
In-Reply-To: Your message of "Wed, 27 Jan 1999 10:35:45 JST".
	<199901270135.KAA25215@uranus.kt.rim.or.jp>
From: sada@rr.IIJ4U.OR.JP (SADA Kenji)
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
X-Mailer: mnews [version 1.21] 1997-12/23(Tue)
Reply-To: doc-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+981115
X-Sequence: doc-jp 5885
Subject: [doc-jp 5885] Re: Tutorials - ddwg.sgml 
Errors-To: owner-doc-jp@jp.freebsd.org
Sender: owner-doc-jp@jp.freebsd.org
X-Originator: sada@rr.IIJ4U.OR.JP

$B:4ED$G$9!#F|K\8l(B sgml $BHG$X$N%j%s%/$rD>$7$F$$$?$@$$$?$N$G!"(B
$B$&$A$+$o$5$s$N=$@5$rH?1G$7$F(B ddwg.sgml 1.4 -> 1.6 $B$N(B diff $B$H$7$^$7$?!#(B
$B$h$m$7$/$G$9(B > Sugi

--- ddwg.sgml.orig	Sun Jan 31 03:02:55 1999
+++ ddwg.sgml	Sun Jan 31 03:12:00 1999
@@ -158,7 +158,103 @@
 <sect3> d_stop()
 <sect3> d_reset()
 <sect3> d_devtotty()
-<sect3> d_select()
+<sect3> d_poll() (3.0 $B0J9_(B) $B$b$7$/$O(B d_select() (2.2)
+<p>
+d_poll() $B$,$H$k0z?t$O0J2<$NDL$j$G$9(B:
+<code>
+void
+d_poll(dev_t dev, int events, struct proc *p)
+</code>
+<p> d_poll() $B$O%G%P%$%9$KF~=PNO$NMQ0U$,$G$-$F$$$k$+D4$Y$k$?$a$K;H$$$^$9(B.
+$BNc$O(B, $B%G!<%?$,%M%C%H%o!<%/$+$i<hF@2DG=$K$J$k$+(B,
+$B$"$k$$$O%f!<%6$,%-!<$r2!$9$^$GBT$D$b$N$G$9(B.
+$B$3$l$O(B userland $B$K$*$1$k(B poll() $B$KAjEv$7$^$9(B.
+
+<p>d_poll() $B$N8F$S=P$7$O(B
+$B%$%Y%s%H%^%9%/$G;XDj$5$l$k%$%Y%s%H$r4F;k$7$J$/$F$O$$$1$^$;$s(B.
+$B$b$7MW5a$5$l$?%$%Y%s%H$,$9$Y$FL58z$G$O$"$k$,8e$GM-8z$K$J$jF@$k>l9g(B,
+$B%+!<%M%k$,8e$G;H$&$?$a$K5-O?$7$F$*$+$J$/$F$O$J$j$^$;$s(B.
+$B$=$N$?$a$K(B d_poll() $B$O$3$N%G%P%$%9$N(B selinfo $B9=B$BN$r0z?t$K$7$F(B
+selrecord() $B$r8F$S=P$7$^$9(B.
+$B$3$3$^$G$NF0:n$K$D$$$F$^$H$a$k$H0J2<$N$h$&$K$J$j$^$9(B:
+
+<code>
+static struct my_softc {
+       struct queue rx_queue;  /* As example only - not required */
+       struct queue tx_queue;  /* As example only - not required */
+       struct selinfo selp;    /* Required */
+} my_softc[NMYDEV];
+
+...
+
+static int
+mydevpoll(dev_t dev, int events, struct proc *p)
+{
+       int revents = 0;        /* Events we found */
+       int s;
+       struct my_softc *sc = &amp;my_softc[dev];
+
+       /* We can only check for IN and OUT */
+       if ((events &amp; (POLLIN|POLLOUT)) == 0)
+               return(POLLNVAL);
+       
+       s = splhigh();
+       /* Writes are if the transmit queue can take them */
+       if ((events &amp; POLLOUT) &amp;&amp;
+           !IF_QFULL(sc->tx_queue))
+               revents |= POLLOUT;
+       /* ... while reads are OK if we have any data */
+       if ((events &amp; POLLIN) &amp;&amp;
+           !IF_QEMPTY(sc->rx_queue))
+               revents |= POLLIN;
+       if (revents == 0)
+               selrecord(p, &amp;sc->selp);
+       splx(s);
+       return revents;
+}
+</code>
+
+<p>
+d_select() $B$O(B FreeBSD 2.2 $B$*$h$S$=$l0JA0$N%P!<%8%g%s$KB8:_$7$^$7$?(B.
+'events' $B$G$O$J$/0l$D$N@0?t(B 'rw' $B$r<h$j$^$9(B.
+rw$B$NCM$O(B, read$B$N>l9g$O(B ($BA0=R$N(B POLLIN $B$N$h$&$K(B) FREAD $B$H$J$j(B,
+write$B$N>l9g$O(B ($BA0=R$N(B POLLOUT $B$N$h$&$K(B) FWRITE $B$H$J$j$^$9(B.
+'exception' $B$9$J$o$A2?$+FCJL>l9g(B, $BNc$($P(B PC $B%+!<%I%I%i%$%P$K$*$$$F(B
+$B%+!<%I$NA^H4$N$h$&$J$3$H$,5/$3$C$?$H$-$K$O(B 0 $B$K$J$j$^$9(B.
+
+<p>select $B$G$O(B, $B>e5-$N%3!<%I$NItJ,$O<!$N$h$&$K$J$k$G$7$g$&(B:
+
+<code>
+static int
+mydevselect(dev_t dev, int rw, struct proc *p)
+{
+       int ret = 0;
+       int s;
+       struct my_softc *sc = &amp;my_softc[dev];
+
+       s = splhigh();
+       switch (rw) {
+       case FWRITE:
+               /* Writes are if the transmit queue can take them */
+               if (!IF_QFULL(sc->tx_queue))
+                       ret = 1;
+               break;
+       case FREAD:
+               /* ... while reads are OK if we have any data */
+               if (!IF_QEMPTY(sc->rx_queue))
+                       ret = 1;
+               break;
+       case 0:
+               /* This driver never get any exceptions */
+               break;
+       }
+       if(ret == 0)
+               selrecord(p, &amp;sc->selp);
+       splx(s);
+       return(revents);
+}
+</code>
+
 <sect3> d_mmap()
 <sect3> d_strategy()
 <p>
