static void *ui_shadow_eventcb(int event, void *data) { struct ui_resource_holder *rh; switch (event) { case XNSHADOW_CLIENT_ATTACH: rh = xnarch_alloc_host_mem(sizeof(*rh)); if (!rh) return ERR_PTR(-ENOMEM); initq(&rh->semq); initq(&rh->flgq); initq(&rh->mbxq); return &rh->ppd; case XNSHADOW_CLIENT_DETACH: rh = ppd2rholder((xnshadow_ppd_t *) data); ui_sem_flush_rq(&rh->semq); ui_flag_flush_rq(&rh->flgq); ui_mbx_flush_rq(&rh->mbxq); xnarch_free_host_mem(rh, sizeof(*rh)); return NULL; } return ERR_PTR(-EINVAL); }
void uimbx_cleanup(void) { ui_mbx_flush_rq(&__ui_global_rholder.mbxq); xnmap_delete(ui_mbx_idmap); }