[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[Libevent-users] Multithreading -- bev release?



Hello,

   Say I do something along the line of:

--------------------------------
static void do_error(struct bufferevent *bev, short error, void *ctx)
{
  int release = 0;

  if(error & BEV_EVENT_EOF)
  {
    release = 1;
  }
  else if(error & BEV_EVENT_ERROR)
  {
    release = 1;
  }

  if(release)
  {
    parserctx_t *pctx = ctx;

    /* ...  */

    free(pctx);
    bufferevent_free(bev);
  }
}

static void do_read(struct bufferevent *bev, void *ctx)
{
  struct evbuffer *input;
  parserctx_t *pctx = ctx;


  /* ... */

  input = bufferevent_get_input(bev);

  /* ... */

  if(got_complete_message)
  {
    launch_worker_thread(pctx);
  }

  /* ... */
}

void *worker_thread(parserctx_t *pctx)
{
  struct bufferevent *bev = pctx->bev
  struct evbuffer *output;
  /* ... */

  output = bufferevent_get_output(bev);

  /* ... */

  evbuffer_add_printf(output, "Results: %s", results);

  /* ... */
}
--------------------------------

   If the client closes the socket, do_error() will release bev, which -
I would assume - cause the worker_thread() to croak next time it
accesses bev/output.

   There are a few solutions to this, the one I'm leaning towards is to
not release bev in do_error(), but rather flag it for deletion, and let
worker_thread() do it (if it has started; otherwise do_error() does it).
But it got me wondering if there are some mechanisms in libevent to
assist in these types of situations?

   Are there any special caveats with releasing bev in a separate
thread? (Will it cause do_error() to be called on the base thread?).

-- 
Kind regards,
Jan Danielsson

***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.