void gcd_api_rollback( GCD_PCB *pcb ) { pcb->api.name = "IIapi_rollback()"; pcb->api.parm.roll.rb_genParm.gp_callback = gcd_roll_cmpl; pcb->api.parm.roll.rb_genParm.gp_closure = (PTR)pcb; pcb->api.parm.roll.rb_tranHandle = pcb->ccb->cib->tran; if ( pcb->data.tran.savepoint != NULL ) pcb->api.parm.roll.rb_savePointHandle = pcb->data.tran.savepoint; else { pcb->api.parm.roll.rb_savePointHandle = NULL; pcb->ccb->cib->tran = NULL; pcb->result.flags |= PCB_RSLT_XACT_END; } IIapi_rollback( &pcb->api.parm.roll ); return; }
static void IIdemo_rollback( II_PTR *tranHandle ) { IIAPI_ROLLBACKPARM rollbackParm; IIAPI_WAITPARM waitParm = { -1 }; printf( "IIdemo_rollback: rolling back transaction\n" ); rollbackParm.rb_genParm.gp_callback = NULL; rollbackParm.rb_genParm.gp_closure = NULL; rollbackParm.rb_tranHandle = *tranHandle; rollbackParm.rb_savePointHandle = NULL; IIapi_rollback( &rollbackParm ); while( rollbackParm.rb_genParm.gp_completed == FALSE ) IIapi_wait( &waitParm ); *tranHandle = NULL; return; }