more sensible unthreaded func