static int rping_run_server(struct rping_cb *cb) { struct ibv_recv_wr *bad_wr; int ret; ret = rping_bind_server(cb); if (ret) return ret; sem_wait(&cb->sem); if (cb->state != CONNECT_REQUEST) { fprintf(stderr, "wait for CONNECT_REQUEST state %d\n", cb->state); return -1; } ret = rping_setup_qp(cb, cb->child_cm_id); if (ret) { fprintf(stderr, "setup_qp failed: %d\n", ret); return ret; } ret = rping_setup_buffers(cb); if (ret) { fprintf(stderr, "rping_setup_buffers failed: %d\n", ret); goto err1; } ret = ibv_post_recv(cb->qp, &cb->rq_wr, &bad_wr); if (ret) { fprintf(stderr, "ibv_post_recv failed: %d\n", ret); goto err2; } pthread_create(&cb->cqthread, NULL, cq_thread, cb); ret = rping_accept(cb); if (ret) { fprintf(stderr, "connect error %d\n", ret); goto err2; } ret = rping_test_server(cb); if (ret) { fprintf(stderr, "rping server failed: %d\n", ret); goto err3; } ret = 0; err3: rdma_disconnect(cb->child_cm_id); pthread_join(cb->cqthread, NULL); rdma_destroy_id(cb->child_cm_id); err2: rping_free_buffers(cb); err1: rping_free_qp(cb); return ret; }
static int rping_run_persistent_server(struct rping_cb *listening_cb) { int ret; struct rping_cb *cb; pthread_attr_t attr; ret = rping_bind_server(listening_cb); if (ret) return ret; /* * Set persistent server threads to DEATCHED state so * they release all their resources when they exit. */ ret = pthread_attr_init(&attr); if (ret) { perror("pthread_attr_init"); return ret; } ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ret) { perror("pthread_attr_setdetachstate"); return ret; } while (1) { sem_wait(&listening_cb->sem); if (listening_cb->state != CONNECT_REQUEST) { fprintf(stderr, "wait for CONNECT_REQUEST state %d\n", listening_cb->state); return -1; } cb = clone_cb(listening_cb); if (!cb) return -1; ret = pthread_create(&cb->persistent_server_thread, &attr, rping_persistent_server_thread, cb); if (ret) { perror("pthread_create"); return ret; } } return 0; }
static int rping_run_persistent_server(struct rping_cb *listening_cb) { int ret; struct rping_cb *cb; ret = rping_bind_server(listening_cb); if (ret) return ret; while (1) { sem_wait(&listening_cb->sem); if (listening_cb->state != CONNECT_REQUEST) { fprintf(stderr, "wait for CONNECT_REQUEST state %d\n", listening_cb->state); return -1; } cb = clone_cb(listening_cb); if (!cb) return -1; pthread_create(&cb->persistent_server_thread, NULL, rping_persistent_server_thread, cb); } return 0; }