On Sat, Jul 07, 2007 at 03:11:52AM +0100, Al Viro wrote: > Still not expressive enough... Consider e.g. > > struct foo *lookup_foo(char *s); // lookup by name, return NULL if failed > // or pointer to struct foo with ->mutex > // held. Caller should unlock. > > It's legitimate, not particulary rare and AFAICS can't be expressed. Another fun problem: consider a structure with pair of methods - ->start() and ->stop(). The only locking requirement is that calls are inverse wrt locking (i.e. foo->start();foo->stop(); leaves the locking state unchanged). Different instances may deal with different locks, different _kinds_ of locks or no locks at all. How do you annotate ->start() and ->stop()? We have just such a beast in the kernel - seq_operations (see fs/seq_file.c for code that calls these methods and grep for seq_operations to see users). - To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html