loop-until-done function