We are using this functionality and it is working for us. Here are some notes that I hope can help you, we haven't had a chance to dig through your code specifically.
1. After we receive some data in the access handler callback (*upload_data_size > 0) we decide whether we've buffered enough internally, and if so, we call MHD_suspend_connection()
We do not call this on the final callback with *upload_data_size == 0 since we will not get another callback from mHTTPD
2. In the background (on another thread), we process the data we have buffered. If the buffer shrinks enough, we call MHD_resume_connection()
3. We will get called back in the access handler after we resume, and we have also seen occasional callbacks while suspended, which we ignore; we keep track of our suspended state.
4. We are running the server with these options:
MHD_USE_SUSPEND_RESUME (which in turn implies MHD_USE_PIPE_FOR_SHUTDOWN)
MHD_USE_SELECT_INTERNALLY
and we have passed in a value for MHD_OPTION_THREAD_POOL_SIZE to use a thread pool
Hope this helps,
~Jared