<div class="gmail_quote">On Tue, Jun 7, 2011 at 00:03, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div id=":1hw">{ PetscInt statey = ((PetscObject)y)->state;<br>
  ierr = (*y->ops->axpy)(y,alpha,x);CHKERRQ(ierr);<br>
   if (((PetscObject)y)->state ==  statey) SETERRQ("did not increase state!"}</div></blockquote></div><br><div><br></div><div>Hmm, you could have 1,2,3 variants for multiple modifications. I think those are quite rare at present.</div>
<div><br></div><div>This macro is not a very good citizen, but it gets the job done. It could be made nicer if we had C99 variadic macros. (SETERRQ*, PetscInfo*, etc. could be made nicer too.)</div><div><br></div><div><br>
</div><div>#define PetscCallAndMonitorState(inc,obj,method,args) do { \</div><div>  PetscInt save_ ## inc = ((PetscObject)inc)->state; \</div><div>  if (!obj->ops->method) SETERRQ(...); \</div><div>  ierr = (*obj->ops->method) args;CHKERRQ(ierr); \</div>
<div>  if (save_ ## inc == ((PetscObject)inc)->state) SETERRQ(...); \</div><div>} while(0)</div><div><br></div><div><br></div><div>used like</div><div><br></div><div>PetscCallAndMonitorState(y,y,axpy,(y,alpha,x));</div>
<div><br></div>