#include #include #include #include "lx.h" #include "internal.h" void lx__teardown_os(OPEN_STATE *os) { if (! os) return; if (os->pid != AIO_NOID) aio_remove_poll_of(os->conn->io,os->pid); if (os->bid != AIO_NOID) aio_remove_block_of(os->conn->io,os->bid); if (os->fd >= 0) close(os->fd); if (os->ai0) freeaddrinfo(os->ai0); free(os->ihdata); free(os->text); free(os); } void lx__teardown_xc(LX_CONN *xc) { int i; int j; if (xc->flags & XCF_OWN_LOOP) aio_poll_done_of(xc->io); aio_oq_flush(&xc->oq); free(xc->vendor); free(xc->pmformats); for (i=xc->nscreens-1;i>=0;i--) { SCREEN *s; s = xc->screens + i; for (j=s->ndepths-1;j>=0;j--) free(s->depths[j].visuals); free(s->depths); } free(xc->screens); if (xc->fd >= 0) close(xc->fd); if (xc->os) lx__teardown_os(xc->os); free(xc); } void lx_close(LX_CONN *xc) { if (xc->os) lx_abort(); lx__teardown_xc(xc); }