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