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; }