トップ «前の日記(2004年04月14日) 最新 次の日記(2004年04月16日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2004年04月15日

goto

gotoの綺麗でクールな使い方 linux-2.4.24/drivers/acorn/scsi/eesox.c から引用
eesoxscsi_probe(struct expansion_card *ec)
{
途中すげー略してあります。
        ret = fas216_init(host);
        if (ret)                  //エラー
                goto out_free;
 
        ret = request_irq(host->irq, eesoxscsi_intr, 0, "eesox", &info->info);
        if (ret) {                //エラー
                printk("scsi%d: IRQ%d not free: %d\n",
                       host->host_no, host->irq, ret);
                goto out_remove;
        }
 
        ret = fas216_add(host);
        if (ret == 0)
                goto out;		// ここが正常ルート
//エラー発生時
        if (host->dma_channel != NO_DMA)
                free_dma(host->dma_channel);   // dma開放
        free_irq(host->irq, host);             // 割込み開放
 
 out_remove:
        fas216_remove(host);
 
 out_free:
        scsi_unregister(host);                 //scsi登録開放
 
 out_region:
        release_region(base + EESOX_FAS216_OFFSET, 16 << EESOX_FAS216_SHIFT);   // I/Oポート開放
 
 out:
        return ret;
}
登録A>登録B>登録C とやってエラーが出たときに 解除C>解除B>解除A としなければならない。こんな場面で goto を使うと美しく書けるので linuxカーネルでは goto を良く使います。

サルサ

『最近サルサの話が少ない〜』とサル友から言われましたが、害のあることもかけないので害のない事を書きましょ。

ぺんぎnという生物です。好きな技はツバサです。飛べません。