⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 torture_su_root.c

📁 Sofia SIP is an open-source SIP User-Agent library, compliant with the IETF RFC3261 specification.
💻 C
📖 第 1 页 / 共 2 页
字号:
  }  for (i = 0; i < 5; i++) {    test_ep_t *ep = rt->rt_ep[i];    TEST_SIZE(su_sendto(s, msg, sizeof(msg), 0, ep->addr, ep->addrlen), 	      sizeof(msg));    test_run(rt);    TEST(rt->rt_received, i);    TEST(rt->rt_wakeup, i);  }  for (i = 0; i < 5; i++) {    TEST(su_root_unregister(rt->rt_root, rt->rt_ep[i]->wait, 			    wakeups[i], rt->rt_ep[i]), 	 rt->rt_ep[i]->registered);  }  END();}int wakeup_remove(root_test_t *rt, su_wait_t *w, test_ep_t *node){  char buffer[64];  ssize_t x;  test_ep_t *n = node->next;   su_wait_events(w, node->s);  x = recv(node->s, buffer, sizeof(buffer), 0);  if (x < 0)    fprintf(stderr, "%s: %s\n", "recv", su_strerror(su_errno()));  if (node->prev) {		/* first run */    *node->prev = n;    if (n) {      *node->prev = node->next;          node->next->prev = node->prev;      sendto(n->s, "foo", 3, 0, (void *)n->addr, n->addrlen);    }    node->next = NULL;    node->prev = NULL;        if (!*node->list) {      su_root_break(rt->rt_root);    }  }  else {			/* second run */    if (++rt->rt_woken == rt->rt_sockets)      su_root_break(rt->rt_root);  }  return 0;}int event_test(root_test_t rt[1]){  BEGIN();  int i = 0, N = 2048;  test_ep_t *n, *nodes, *list = NULL;  su_sockaddr_t su[1];  socklen_t sulen;    TEST_1(nodes = calloc(N, sizeof *nodes));    memset(su, 0, sulen = sizeof su->su_sin);  su->su_len = sizeof su->su_sin;  su->su_family = AF_INET;  su->su_sin.sin_addr.s_addr = htonl(0x7f000001); /* 127.0.0.1 */  for (i = 0; i < N; i++) {    n = nodes + i;    n->s = su_socket(AF_INET, SOCK_DGRAM, 0);    if (n->s == INVALID_SOCKET)      break;    n->addrlen = sizeof n->addr;    n->addr->su_len = sizeof n->addr;    if (bind(n->s, (void *)su, sulen) < 0) {      su_perror("bind()");      su_close(n->s);      break;    }          if (getsockname(n->s, (void *)n->addr, &n->addrlen)) {      su_perror("getsockname()");      su_close(n->s);      break;    }    if (su_wait_create(n->wait, n->s, SU_WAIT_IN)) {      su_perror("su_wait_create()");      su_close(n->s);      break;    }    n->registered = su_root_register(rt->rt_root, n->wait, wakeup_remove, n, 0);    if (n->registered < 0) {      su_wait_destroy(n->wait);      su_close(n->s);      break;    }        n->list = &list, n->prev = &list;    if ((n->next = list))      n->next->prev = &n->next;    list = n;  }  TEST_1(i >= 1);  N = i;  /* Wake up socket at a time */  n = list; sendto(n->s, "foo", 3, 0, (void *)n->addr, n->addrlen);  su_root_run(rt->rt_root);  for (i = 0; i < N; i++) {    n = nodes + i;    TEST_1(n->prev == NULL);    sendto(n->s, "bar", 3, 0, (void *)n->addr, n->addrlen);  }  rt->rt_sockets = N;  /* Wake up all sockets */  su_root_run(rt->rt_root);  for (i = 0; i < N; i++) {    n = nodes + i;    su_root_deregister(rt->rt_root, n->registered);    TEST_1(su_close(n->s) == 0);  }  free(nodes);  END();}int fail_init(su_root_t *root, root_test_t *rt){  rt->rt_fail_init = 1;  return -1;}void fail_deinit(su_root_t *root, root_test_t *rt){  rt->rt_fail_deinit = 1;}int success_init(su_root_t *root, root_test_t *rt){  rt->rt_success_init = 1;  return 0;}void success_deinit(su_root_t *root, root_test_t *rt){  rt->rt_success_deinit = 1;}void receive_a_reporter(root_test_t *rt, 			su_msg_r msg,			su_msg_arg_t *arg){  rt->rt_recv_reporter = 1;}void receive_recv_report(root_test_t *rt, 			 su_msg_r msg,			 su_msg_arg_t *arg){  rt->rt_reported_reporter = 1;}void send_a_reporter_msg(root_test_t *rt, 			 su_msg_r msg,			 su_msg_arg_t *arg){  su_msg_r m = SU_MSG_R_INIT;  if (su_msg_create(m,		    su_msg_from(msg),		    su_msg_to(msg),		    receive_a_reporter,		    0) == 0 &&      su_msg_report(m, receive_recv_report) == 0 &&      su_msg_send(m) == 0)    rt->rt_sent_reporter = 1;}static int set_execute_bit_and_return_3(void *void_rt){  root_test_t *rt = void_rt;  rt->rt_executed = 1;  return 3;}static void deinit_simple_msg(su_msg_arg_t *arg){  root_test_t *rt = *arg;  rt->rt_msg_destroyed++;}static void receive_simple_msg(root_test_t *rt, 			       su_msg_r msg,			       su_msg_arg_t *arg){  assert(rt == *arg);  rt->rt_msg_received =     su_task_cmp(su_msg_from(msg), su_task_null) == 0 &&    su_task_cmp(su_msg_to(msg), su_task_null) == 0;}static int clone_test(root_test_t rt[1]){  BEGIN();  su_msg_r m = SU_MSG_R_INIT;  int retval;  rt->rt_fail_init = 0;  rt->rt_fail_deinit = 0;  rt->rt_success_init = 0;  rt->rt_success_deinit = 0;  rt->rt_sent_reporter = 0;  rt->rt_recv_reporter = 0;  rt->rt_reported_reporter = 0;  TEST(su_clone_start(rt->rt_root,		      rt->rt_clone,		      rt,		      fail_init,		      fail_deinit), SU_FAILURE);  TEST_1(rt->rt_fail_init);  TEST_1(rt->rt_fail_deinit);  TEST(su_clone_start(rt->rt_root,		      rt->rt_clone,		      rt,		      success_init,		      success_deinit), SU_SUCCESS);  TEST_1(rt->rt_success_init);  TEST_1(!rt->rt_success_deinit);  retval = -1;  rt->rt_executed = 0;  TEST(su_task_execute(su_clone_task(rt->rt_clone),		       set_execute_bit_and_return_3, rt,		       &retval), 0);  TEST(retval, 3);  TEST_1(rt->rt_executed);  /* Deliver message with su_msg_send() */  TEST(su_msg_new(m, sizeof &rt), 0);  *su_msg_data(m) = rt;  rt->rt_msg_received = 0;  rt->rt_msg_destroyed = 0;    TEST(su_msg_deinitializer(m, deinit_simple_msg), 0);  TEST(su_msg_send_to(m, su_clone_task(rt->rt_clone), receive_simple_msg), 0);    while (rt->rt_msg_destroyed == 0)    su_root_step(rt->rt_root, 1);  TEST(rt->rt_msg_received, 1);  /* Make sure 3-way handshake is done as expected */  TEST(su_msg_create(m,		     su_clone_task(rt->rt_clone),		     su_root_task(rt->rt_root),		     send_a_reporter_msg,		     0), 0);  TEST(su_msg_send(m), 0);  TEST_VOID(su_clone_wait(rt->rt_root, rt->rt_clone));  TEST_1(rt->rt_success_deinit);  TEST_1(rt->rt_sent_reporter);  TEST_1(rt->rt_recv_reporter);  TEST_1(rt->rt_reported_reporter);    rt->rt_recv_reporter = 0;  /* Make sure we can handle messages done as expected */  TEST(su_msg_create(m,		     su_root_task(rt->rt_root),		     su_task_null,		     receive_a_reporter,		     0), 0);  TEST(su_msg_send(m), 0);  su_root_step(rt->rt_root, 0);  TEST_1(rt->rt_recv_reporter);  rt->rt_success_init = 0;  rt->rt_success_deinit = 0;  END();}void usage(int exitcode){  fprintf(stderr, 	  "usage: %s [-v] [-a]\n", 	  name);  exit(exitcode);}int main(int argc, char *argv[]){  root_test_t *rt, rt0[1] = {{{ SU_HOME_INIT(rt0) }}}, rt1[1];  int retval = 0;  int i;  struct {    su_port_create_f *create;    su_clone_start_f *start;    char const *name;  } prefer[] =      {	{ NULL, NULL, "default" },#if HAVE_EPOLL	{ su_epoll_port_create, su_epoll_clone_start, "epoll", },#endif#if HAVE_KQUEUE	{ su_kqueue_port_create, su_kqueue_clone_start, "kqueue", },#endif#if HAVE_SYS_DEVPOLL_H	{ su_devpoll_port_create, su_devpoll_clone_start, "devpoll", },#endif#if HAVE_POLL_PORT	{ su_poll_port_create, su_poll_clone_start, "poll" },#endif#if HAVE_SELECT	{ su_select_port_create, su_select_clone_start, "select" },#endif	{ NULL, NULL }      };  rt = rt0;  rt->rt_family = AF_INET;  for (i = 1; argv[i]; i++) {    if (strcmp(argv[i], "-v") == 0)      rt->rt_flags |= tst_verbatim;    else if (strcmp(argv[i], "-a") == 0)      rt->rt_flags |= tst_abort;#if SU_HAVE_IN6    else if (strcmp(argv[i], "-6") == 0)      rt->rt_family = AF_INET6;#endif    else      usage(1);  }#if HAVE_OPEN_C  rt->rt_flags |= tst_verbatim;#endif  i = 0;  su_init();  do {    rt = rt1, *rt = *rt0;    retval |= test_api(rt);    retval |= init_test(rt, prefer[i].name, prefer[i].create, prefer[i].start);    retval |= register_test(rt);    retval |= event_test(rt);    su_root_threading(rt->rt_root, 1);    retval |= clone_test(rt);    su_root_threading(rt->rt_root, 0);    retval |= clone_test(rt);    retval |= deinit_test(rt);  } while (prefer[++i].create);  su_deinit();  return retval;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -