Jabberd14-1.6.0/jabberd/mio.c/mio_init

Last-modified: 2007-03-18 (日) 22:23:18

このページを編集する際は,編集に関する方針に従ってください.

概要

/**
 * Initialize manged I/O handling
 *
 * This must be called before MIO is used
 */

実装

void mio_init(void) {
    pool p;
    pth_attr_t attr;
    xmlnode io = NULL;
    xmlnode karma = NULL;
    xmlnode tls = NULL;
    xht namespaces = NULL;
    namespaces = xhash_new(3);
    xhash_put(namespaces, "", NS_JABBERD_CONFIGFILE);
    io = xmlnode_get_list_item(xmlnode_get_tags(greymatter__, "io", namespaces), 0);
    karma = xmlnode_get_list_item(xmlnode_get_tags(io, "karma", namespaces), 0);
  • ssl関連有効な場合はmio_tls.c?mio_ssl.c?が使われる。
#ifdef SUPPORT_TLS
    tls = xmlnode_get_list_item(xmlnode_get_tags(io, "tls", namespaces), 0);
    if (tls == NULL) {
	 tls = xmlnode_get_list_item(xmlnode_get_tags(io, "ssl", namespaces) ,0);
	 if (tls != NULL) {
	     log_warn(NULL, "Please update your configuration. The <ssl/> elements have been renamed to <tls/>. Falling back to use <ssl/> for now: %s", xmlnode_serialize_string(tls, NULL, NULL, 0));
	 }
    }
    if (tls != NULL) {
	 mio_ssl_init(tls);
    }
#endif
  • mio__dataはグローバルオブジェクト。NULLの場合は起動時の処理、、って言っても、一回しか呼び出されないけど。
    if (mio__data == NULL) {
  • karmaのチェックを追加
	 register_beat(KARMA_HEARTBEAT, _karma_heartbeat, NULL);
	 /* malloc our instance object */
	 p            = pool_new();
	 mio__data    = pmalloco(p, sizeof(_ios));
	 mio__data->p = p;
	 mio__data->k = karma_new(p);
  • pipe(2)でパイプを作る。
	 pipe(mio__data->zzz);
	 /* start main accept/read/write thread */
	 attr = pth_attr_new();
  • このスレッドはjoinしない。
	 pth_attr_set(attr,PTH_ATTR_JOINABLE,FALSE);
#ifdef __CYGWIN__
	 pth_attr_set(attr,PTH_ATTR_STACK_SIZE, 128*1024);
#endif
  • 新しいスレッドの生成
	 mio__data->t=pth_spawn(attr,(void*)_mio_main,NULL);
	 pth_attr_destroy(attr);
  • libpthのpth_yieldのマニュアル読んでも英語よくわからん。。。
	 /* give time to init the signal handlers */
	 pth_yield(NULL);
    }
    /* where to bounce HTTP requests to */
    mio__data->bounce_uri = xmlnode_get_data(xmlnode_get_list_item(xmlnode_get_tags(io, "bounce", namespaces), 0));
  • karmaが存際しない場合、既定値で初期化
    if (karma != NULL) {
	 mio__data->k->val	  = j_atoi(xmlnode_get_data(xmlnode_get_list_item(xmlnode_get_tags(karma, "init", namespaces), 0)), KARMA_INIT);
	 mio__data->k->max         = j_atoi(xmlnode_get_data(xmlnode_get_list_item(xmlnode_get_tags(karma, "max", namespaces), 0)), KARMA_MAX);
	 mio__data->k->inc         = j_atoi(xmlnode_get_data(xmlnode_get_list_item(xmlnode_get_tags(karma, "inc", namespaces), 0)), KARMA_INC);
	 mio__data->k->dec         = j_atoi(xmlnode_get_data(xmlnode_get_list_item(xmlnode_get_tags(karma, "dec", namespaces), 0)), KARMA_DEC);
	 mio__data->k->penalty     = j_atoi(xmlnode_get_data(xmlnode_get_list_item(xmlnode_get_tags(karma, "penalty", namespaces), 0)), KARMA_PENALTY);
	 mio__data->k->restore     = j_atoi(xmlnode_get_data(xmlnode_get_list_item(xmlnode_get_tags(karma, "restore", namespaces), 0)), KARMA_RESTORE);
	 mio__data->k->reset_meter = j_atoi(xmlnode_get_data(xmlnode_get_list_item(xmlnode_get_tags(karma, "resetmeter", namespaces), 0)), KARMA_RESETMETER);
    }
  • rateの初期化
    mio__data->rate_t        = j_atoi(xmlnode_get_attrib_ns(xmlnode_get_list_item(xmlnode_get_tags(io, "rate", namespaces), 0), "time", NULL), 0);
    mio__data->rate_p        = j_atoi(xmlnode_get_attrib_ns(xmlnode_get_list_item(xmlnode_get_tags(io, "rate", namespaces), 0), "points", NULL), 0);
    xhash_free(namespaces);
}

呼出元

#related: relatedプラグインは廃止されました。