Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #93896

Re: Generic read/write function - casting vs union

From Noob <root@127.0.0.1>
Newsgroups comp.lang.c
Subject Re: Generic read/write function - casting vs union
Date 2016-09-22 15:36 +0200
Organization A noiseless patient Spider
Message-ID <ns0moe$7td$1@dont-email.me> (permalink)
References <ns08ge$o5v$1@dont-email.me> <ns0hps$mc6$1@dont-email.me> <ns0jt5$tfh$1@dont-email.me> <ns0l81$2mb$1@dont-email.me>

Show all headers | View raw


On 22/09/2016 15:10, David Brown wrote:

> On 22/09/16 14:46, Noob wrote:
> 
>> As you allude to, there is some context between PROLOG and EPILOG.
>>
>> PROLOG does several "setup" operations, which must be "torn down"
>> in the reverse order in EPILOG, with proper error-handling, meaning
>> we cannot tear down a resource that has not been set up.
>>
>> PROLOG:
>>   alloc #1
>>   if (failure) goto L1;
>>   alloc #2
>>   if (failure) goto L2;
>>   alloc #3
>>   if (failure) goto L3;
>>
>> EPILOG:
>>   tear_down(#3);
>> L3:
>>   tear_down(#2);
>> L2:
>>   tear_down(#1);
>> L1:
>>   return err;
>>
>> Also I'm not a fan of separating PROLOG and EPILOG, because they
>> are obviously closely related, and it doesn't make sense to call
>> one without the other. But it's interesting to have other points
>> of view.
> 
> How portable does your code need to be?  If you can use gcc extensions,

This code will be submitted to the Linux kernel. So C++ is out ;-)
They do use many gcc extensions (e.g. updating void pointers)
but git grep '((cleanup))' returns nothing for Linux 4.7

https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html

> cleanup (cleanup_function)
> 
> The cleanup attribute runs a function when the variable goes out of
> scope. This attribute can only be applied to auto function scope
> variables; it may not be applied to parameters or variables with
> static storage duration. The function must take one parameter, a
> pointer to a type compatible with the variable. The return value of
> the function (if any) is ignored.
> 
> If -fexceptions is enabled, then cleanup_function is run during the
> stack unwinding that happens during the processing of the exception.
> Note that the cleanup attribute does not allow the exception to be
> caught, only to perform an action. It is undefined what happens if
> cleanup_function does not return normally.

"Exceptions" means C++ right? (not C)

I'm not familiar with this attribute. Thanks for pointing it out.
Does that mean one has to define a function for every variable
that is to be allocated? And test in every function before
actually cleaning up?


> you could consider using "cleanup" functions as a sort of C++
> destructor.  Then your code becomes:
> 
> PROLOG:
> 	alloc #1 with cleanup function 1
> 	if (failure) return err;
> 	alloc #2 with cleanup function 2
> 	if (failure) return err;
> 	alloc #3 with cleanup function 3
> 	if (failure) return err;
> 
> ...
> 
> EPILOG:
> 	return success
> 
> Your cleanup functions are called in reverse order, and only if your
> code has got as far as declaring them.

Regards.

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Generic read/write function - casting vs union Noob <root@127.0.0.1> - 2016-09-22 11:33 +0200
  Re: Generic read/write function - casting vs union Richard Heathfield <rjh@cpax.org.uk> - 2016-09-22 11:07 +0100
    Re: Generic read/write function - casting vs union Noob <root@127.0.0.1> - 2016-09-22 12:36 +0200
      Re: Generic read/write function - casting vs union Richard Heathfield <rjh@cpax.org.uk> - 2016-09-22 14:07 +0100
    Re: Generic read/write function - casting vs union Keith Thompson <kst-u@mib.org> - 2016-09-22 11:48 -0700
    Re: Generic read/write function - casting vs union raltbos@xs4all.nl (Richard Bos) - 2016-09-23 19:42 +0000
  Re: Generic read/write function - casting vs union BartC <bc@freeuk.com> - 2016-09-22 13:11 +0100
    Re: Generic read/write function - casting vs union Noob <root@127.0.0.1> - 2016-09-22 14:46 +0200
      Re: Generic read/write function - casting vs union David Brown <david.brown@hesbynett.no> - 2016-09-22 15:10 +0200
        Re: Generic read/write function - casting vs union Noob <root@127.0.0.1> - 2016-09-22 15:36 +0200
          Re: Generic read/write function - casting vs union Malcolm McLean <malcolm.mclean5@btinternet.com> - 2016-09-22 19:28 -0700
          Re: Generic read/write function - casting vs union David Brown <david.brown@hesbynett.no> - 2016-09-23 09:59 +0200
      Re: Generic read/write function - casting vs union Barry Schwarz <schwarzb@dqel.com> - 2016-09-22 20:11 -0700
      Re: Generic read/write function - casting vs union Richard Damon <Richard@Damon-Family.org> - 2016-09-23 11:13 -0400
  Re: Generic read/write function - casting vs union Tim Rentsch <txr@alumni.caltech.edu> - 2016-09-22 08:35 -0700
    Re: Generic read/write function - casting vs union Noob <root@127.0.0.1> - 2016-09-25 23:17 +0200
    Re: Generic read/write function - casting vs union Noob <root@127.0.0.1> - 2016-09-26 14:54 +0200
      Re: Generic read/write function - casting vs union boon <root@localhost.localdomain> - 2016-09-26 19:47 +0200
      Re: Generic read/write function - casting vs union Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-26 19:23 +0100
      Re: Generic read/write function - casting vs union Tim Rentsch <txr@alumni.caltech.edu> - 2016-09-27 13:10 -0700
      Re: Generic read/write function - casting vs union David Thompson <dave.thompson2@verizon.net> - 2016-10-16 18:08 -0400
  Re: Generic read/write function - casting vs union Anton Shepelev <anton.txt@gmail.com> - 2016-10-17 23:40 +0300
  Re: Generic read/write function - casting vs union albert@cherry.spenarnc.xs4all.nl (Albert van der Horst) - 2016-12-11 15:20 +0100
    Re: Generic read/write function - casting vs union supercat@casperkitty.com - 2016-12-11 09:38 -0800

csiph-web