Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Sep 1995 16:58:44 -0500 (CDT)
From:      Mike Pritchard <mpp@mpp.minn.net>
To:        terry@lambert.org (Terry Lambert)
Cc:        terry@lambert.org, nate@rocky.sri.MT.net, davidg@root.com, hackers@freefall.freebsd.org
Subject:   Re: Coding style ( was Re: why is this not a bug in namei?)
Message-ID:  <199509202158.QAA12896@mpp.minn.net>
In-Reply-To: <199509201711.KAA01075@phaeton.artisoft.com> from "Terry Lambert" at Sep 20, 95 10:11:52 am

next in thread | previous in thread | raw e-mail | index | archive | help
Terry Lambert wrote:
> 
> Why not:
> 
> 		XXX_LOCK();
> 		...
> 		if (error_condition) {
> 			error = EWHATEVER;
> 			goto err_with_lock_held;
> 		}
> 		...
> 	err_with_lock_held:
> 		XXX_UNLOCK():
> 	err:
> 		return (error);
> 
> Or better yet:
> 
> 		XXX_LOCK();
> 		...
> 		if (error_condition) {
> 			error = EWHATEVER;
> 		} else {
> 			...
> 		}
> 		XXX_UNLOCK():
> 	err:
> 		return (error);
> 
> I don't understand the need for the local lock state variable in your
> second example.

My previous example was very simplistic.  Having to lock multiple objects 
during a function wasn't not uncommon.
E.g.

	XXX_LOCK();
	...
	if (error_condition) {
		XXX_UNLOCK();
		return (EWHATEVER);
	}
	...
	XXX_UNLOCK();
	...
	if (error_condition2)
		return (EHWATEVER);
	...
	YYY_LOCK();
	...
	if (error_condition2) {
		YYY_UNLOCK();
		return (EWHATEVER);
	}
	...
	YYY_UNLOCK();
	return (0);

In the above example, with gotos you would need 4 exit points:  1 for 
an exit without any error.  And one each for each of the 3 error 
conditions, since they all have different requirements.  2 of them have
different locks, and 1 has no locks at all.
-- 
Mike Pritchard
mpp@mpp.minn.net
"Go that way.  Really fast.  If something gets in your way, turn"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199509202158.QAA12896>