On Mon, Mar 16, 2020 at 4:29 PM Christian Grothoff <groth...@gnunet.org>
wrote:

> This seems kind-of OK (I personally think pthread_detach is always messy
> and in 99.9% of cases a bad idea).


Hm... Could you point the disadvantages of using detached threads? I'm a
little newbie with this feature of pthreads.

I'm going to use suspend/resume and pthread in requests that takes a long
time processing read-only data (e.g. report generation) that could block
the main loop, but "discard" them if the server stops.

hat you do need to (somehow) ensure
> is that you do MHD_resume_connection() (and let it finish) *before*
> calling MHD_stop_daemon().
>

The current design looks like this:

static void *bar_cb(void *cls) {
  *MHD_resume_connection*(... con sent with cls above ...);
  ... calls the user-defined callback sent with cls above ...
  pthread_exit(NULL);
  return NULL;
}

// foo() is called inside a MHD_AccessHandlerCallback

int foo(... some params ...) {
  ... some param checking ...
  *MHD_suspend_connection*(con);
  ret =
    pthread_create(detached_thread, NULL, bar_cb, cls);
  if (ret != 0)
    goto error;
  ret = pthread_detach(detached_thread);
  if (ret != 0)
    goto error;
  return 0;
error:
  ... some error handling ...
  return ret;
}

The MHD_resume_connection() was called before calling the user-defined
callback to avoid "MHD_stop_daemon() called while we have suspended
connections". :-)

BTW I'm OK to remove the pthread_detach() if it could raise future problems
in my application.

--
Silvio Clécio

Reply via email to