ukazkove zdrojaky
Premysl Hruby
lin-konf na post.cz
Pátek Březen 3 22:49:45 CET 2006
Dalibor Straka wrote:
> On Fri, Mar 03, 2006 at 10:06:46PM +0100, Jan Kasprzak wrote:
>
>>int mydev_probe(...)
>>{
>> if (!(mydev_priv = kmalloc(...))
>> goto out1;
>> ....
>> if (!register_interrupt(...))
>> goto out2;
>> ....
>> if (!register_chrdev(...))
>> goto out3;
>> ....
>>
>> return 0;
>>out3:
>> unregister_interrupt(...);
>>out2:
>> kfree(...);
>>out1:
>> return -ENODEV;
>>}
>>
>>Pokud byste tohle psal bez goto, utopil byste se ve vnorenych
>>blocich. A presne proto je v tomto miste goto rozumne a zvysujici citelnost.
>
> Nic proti kernelu, ale neutopil
>
> {
> if (!out && !mydev_priv = kmalloc(...))
> out = out1;
> ...
> if (!out && !register_interrupt(...))
> out = out2;
> ...
> if (!out && !register_chrdev(...))
> out = out3;
> ...
> return SUCCESS;
>
> switch(out){
> case out3: unregister_interrupt(...); /* no break! */
> case out2: kfree(...);
> case out1: return -ENODEV;
> }
> }
>
> Docela bych se vsadil, ze vysledny kod bude identicky,
> -- Dalibor Straka
>
Hmm uzasne zvyseni prehlednosti! Myslim ze se celkem dost dobre zapomene
na nejake !out a navic, po vsech tech inicializacich by jste musel cely
vnitrni -funkcni- kod funkce obalit jedni velkym if-em if (!out) { ... }
coz taky nevidim jako dobre reseni. Navic i napohled jsou ty ify mene
citelne, nestaci se podivat a hned vim na co je, musim jeste preskocit
za !out &&.
Btw v tom vasem switchi chybi jeste pred vsemi temi "case" default. V
pripade, ze by se cela funkce projela bez chyby by se totiz nic neuvolnilo.
PS: tak me jeste napada, ze by se musela nekde definovat horda outXXX
promenych (at uz konstanty nebo jenom #define) a taky promenna out samotna.
Ph.
Další informace o konferenci Linux