concrete library-code example (was: C++ and posix threads)

Nathan Myers ncm at cantrip.org
Wed Dec 24 17:05:17 UTC 2003


On Wed, Dec 24, 2003 at 08:09:57AM -0500, Jason Merrill wrote:
> On Tue, 23 Dec 2003 11:03:14 -0500, Ted Baker <baker at cs.fsu.edu> wrote:
> 
> > How do you propose to modify read() to throw an exception and
> > still have backwards compatability with applications that expect
> > read() to always return (more specifically, to return -1 if it
> > fails)?
> 
> read() already doesn't return if it's acting on a cancellation request.
> Throwing an exception is just a different way of not returning.

Enlarging on this question...

Here is a more-or-less concrete example, for discussion purposes.
It's meant as a generic example of code written according to the 
existing contract offered by C libraries.

  int affect_world(struct state* s)
  {
    int result;
    violate_invariants_or_claim_resources(s);
    result = c_function_or_system_call(s->member);
    if (result < 0) {
      clean_up(s, result);
      return result;
    }
    act_on_result(s, result);
    restore_invariants_and_release_resources(s);
    return 0;
  }

This pattern is extremely common in both C and C++ libraries.  If 
read() were to throw (or to "just ... not return"), the program state 
would be corrupted.  A redefinition of c_function_or_system_call 
semantics that breaks this code breaks many thousands of existing 
thread-safe C and C++ libraries.

(The cancellation model described in
  http://www.codesourcery.com/archives/c++-pthreads/msg00021.html
is designed to preserve libraries that contain code that follows 
this pattern.)

Jason, do you not consider those libraries worth preserving?

Nathan Myers
ncm at cantrip.org




More information about the c++-pthreads mailing list