Что касается libdill, dill_brecv должен быть в том же dill_coroutine, что и dill_tcp_connect? - PullRequest
0 голосов
/ 17 апреля 2019

Код теста ниже:

#include <stdio.h>
#include <libdill.h>

static dill_coroutine void
test_1(void)
{
  int ret;

  while(dill_msleep(dill_now() + 1000) == 0)
  {
    printf("test_1: %d\n", ret);
  }
}

static int bndl;
static int socket;

static dill_coroutine void
test_process_tx(void)
{
  while(1)
  {
    if (dill_bsend(socket, "Hello\n", 6, -1) < 0)
    {
      break;
    }
    if (dill_msleep(dill_now() + 1000) < 0)
    {
      break;
    }
  }
}

static dill_coroutine void
test_process_rx(void)
{
  uint8_t c;

  while(dill_brecv(socket, &c, 1, -1) == 0)
  {
    printf("rx: 0x%02x\n", c);
  }
  printf("=================== test_process_rx done !!!\n");
}

static dill_coroutine void
test_tcp_ok(void)
{
  struct dill_ipaddr addr;

  if (dill_ipaddr_remote(&addr, "127.0.0.1", 2345, 0, dill_now() + 5000) < 0)
  {
    printf("server addr not reachable\n");
    return;
  }
  socket = dill_tcp_connect(&addr, dill_now() + 10 * 1000);
  if (socket < 0)
  {
    printf("server connect failed\n");
    return;
  }

  dill_bundle_go(bndl, test_process_tx());

  test_process_rx();

  dill_tcp_close(socket, -1);
}

static dill_coroutine void
test_tcp_failed(void)
{
  struct dill_ipaddr addr;

  if (dill_ipaddr_remote(&addr, "127.0.0.1", 2345, 0, dill_now() + 5000) < 0)
  {
    printf("server addr not reachable\n");
    return;
  }
  socket = dill_tcp_connect(&addr, dill_now() + 10 * 1000);
  if (socket < 0)
  {
    printf("server connect failed\n");
    return;
  }

  dill_bundle_go(bndl, test_process_rx());

  test_process_tx();

  dill_tcp_close(socket, -1);
}


int
main(void)
{
  bndl = dill_bundle();

  dill_bundle_go(bndl, test_1());
  //dill_bundle_go(bndl, test_tcp_ok());
  dill_bundle_go(bndl, test_tcp_failed());

  dill_msleep(dill_now() + 10 * 1000);

  dill_hclose(bndl);

  return 0;
}
  • В порядке test_tcp_ok, dill_brecv находится в том же dill_coroutine, что и dill_tcp_connect. Когда dill_hclose (bndl); вызывается, затем выводится «test_process_rx done». ~ # ./test_dill test_1: 0 test_1: 0 test_1: 0 rx: 0x73 rx: 0x64 rx: 0x66 rx: 0x67 rx: 0x73 rx: 0x64 rx: 0x66 rx: 0x67 rx: 0x0a test_1: 0 test_1: 0 test_1: 0 test_1: 0 test_1: 0 test_1: 0 =================== test_process_rx done !!!

  • test_tcp_failed - неудачный случай, dill_brecv запускается в другой dill_coroutine. Когда dill_hclose (bndl); вызван, «test_process_rx done» не распечатан, но в fd.c произошел сбой подтверждения ~ # ./test_dill test_1: 0 test_1: 0 test_1: 0 test_1: 0 test_1: 0 rx: 0x73 rx: 0x61 rx: 0x64 rx: 0x66 rx: 0x61 test_1: 0 test_1: 0 test_1: 0 test_1: 0 Assert failed: rc == 0 (fd.c:388) Aborted

...