HIRAUCHI Hideyuki
hira****@verys*****
2004年 2月 21日 (土) 03:10:56 JST
ちょっと末尾のソースを見て欲しいのですが、私のアイデアってこんな感じです。 これでリファクタリングのつもりなんですが、 この時点で何か勘違いなどありましたら、ご指摘ください。 私はこれから、Unix環境の準備にかかるとします。 Cygwinじゃスレッドまわりのテストできないって、今になって気付きました。 いちおう最適化オプション-O3(インライン展開する)でコンパイルは通りました。 ホントに展開されているかどうかは未確認です。 gccのマニュアルはここを参考にしました(ちと古いかも)。 - 最適化を制御するオプション http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html#SEC10 以下、ソースの抜粋。Putbの部分。 --hira /* Convenience macro */ #define CLOSE_CHECK(port) \ do { \ if (SCM_PORT_CLOSED_P(port)) { \ UNLOCK(p); \ Scm_Error("I/O attempted on closed port: %S", (port)); \ } \ } while (0) #define CLOSE_CHECK_UNSAFE(port) \ do { \ if (SCM_PORT_CLOSED_P(port)) { \ Scm_Error("I/O attempted on closed port: %S", (port)); \ } \ } while (0) /*================================================================= * Putb */ #ifdef SAFE_PORT_OP inline void Scm_PutbUnsafe(ScmByte b, ScmPort *p) { CLOSE_CHECK_UNSAFE(p); switch (SCM_PORT_TYPE(p)) { case SCM_PORT_FILE: if (p->src.buf.current >= p->src.buf.end) { bufport_flush(p, 1, FALSE); } SCM_ASSERT(p->src.buf.current < p->src.buf.end); *p->src.buf.current++ = b; if (p->src.buf.mode == SCM_PORT_BUFFER_NONE) { bufport_flush(p, 1, FALSE); } break; case SCM_PORT_OSTR: SCM_DSTRING_PUTB(&p->src.ostr, b); break; case SCM_PORT_PROC: p->src.vt.Putb(b, p); break; default: Scm_Error("bad port type for output: %S", p); } } void Scm_Putb(ScmByte b, ScmPort *p) { VMDECL; LOCK(p); PORT_SAFE_CALL(p, Scm_PutbUnsafe(b, p)); UNLOCK(p); } #endif