void pc_client_destroy(pc_client_t *client) { if(PC_ST_INITED == client->state) { pc__client_clear(client); goto finally; } if(PC_ST_CLOSED == client->state) { pc__client_clear(client); goto finally; } // 1. asyn worker thread // 2. wait work thread exit // 3. free client uv_async_send(client->close_async); pc_client_join(client); if(PC_ST_CLOSED != client->state) { pc_client_stop(client); // wait uv_loop_t stop sleep(1); pc__client_clear(client); } finally: if(client->uv_loop) { uv_loop_delete(client->uv_loop); client->uv_loop = NULL; } free(client); }
void pc_client_destroy(pc_client_t *client) { pc_client_state state; uv_mutex_lock(&client->state_mutex); state = client->state; uv_mutex_unlock(&client->state_mutex); if(PC_ST_INITED == client->state) { goto finally; } if(PC_ST_CLOSED == client->state) { goto finally; } pc_client_disconnect(client); pc_client_join(client); finally: pc__client_clear(client); if(client->uv_loop) { uv_loop_delete(client->uv_loop); client->uv_loop = NULL; } pc_jsonp_free(client); }