callback takes (chan, condition, user_data) not (user_data, chan, condition)