return xcall;
err:
- osdep_xencall_close(xcall);
xentoolcore__deregister_active_handle(&xcall->tc_ah);
+ osdep_xencall_close(xcall);
xtl_logger_destroy(xcall->logger_tofree);
free(xcall);
return NULL;
if ( !xcall )
return 0;
- rc = osdep_xencall_close(xcall);
xentoolcore__deregister_active_handle(&xcall->tc_ah);
+ rc = osdep_xencall_close(xcall);
buffer_release_cache(xcall);
xtl_logger_destroy(xcall->logger_tofree);
free(xcall);
err:
xtl_logger_destroy(dmod->logger_tofree);
- xencall_close(dmod->xcall);
xentoolcore__deregister_active_handle(&dmod->tc_ah);
+ xencall_close(dmod->xcall);
free(dmod);
return NULL;
}
rc = osdep_xendevicemodel_close(dmod);
- xencall_close(dmod->xcall);
xentoolcore__deregister_active_handle(&dmod->tc_ah);
+ xencall_close(dmod->xcall);
xtl_logger_destroy(dmod->logger_tofree);
free(dmod);
return rc;
return xce;
err:
- osdep_evtchn_close(xce);
xentoolcore__deregister_active_handle(&xce->tc_ah);
+ osdep_evtchn_close(xce);
xtl_logger_destroy(xce->logger_tofree);
free(xce);
return NULL;
if ( !xce )
return 0;
- rc = osdep_evtchn_close(xce);
xentoolcore__deregister_active_handle(&xce->tc_ah);
+ rc = osdep_evtchn_close(xce);
xtl_logger_destroy(xce->logger_tofree);
free(xce);
return rc;
return fmem;
err:
- osdep_xenforeignmemory_close(fmem);
xentoolcore__deregister_active_handle(&fmem->tc_ah);
+ osdep_xenforeignmemory_close(fmem);
xtl_logger_destroy(fmem->logger_tofree);
free(fmem);
return NULL;
if ( !fmem )
return 0;
- rc = osdep_xenforeignmemory_close(fmem);
xentoolcore__deregister_active_handle(&fmem->tc_ah);
+ rc = osdep_xenforeignmemory_close(fmem);
xtl_logger_destroy(fmem->logger_tofree);
free(fmem);
return rc;
return xgt;
err:
- osdep_gnttab_close(xgt);
xentoolcore__deregister_active_handle(&xgt->tc_ah);
+ osdep_gnttab_close(xgt);
xtl_logger_destroy(xgt->logger_tofree);
free(xgt);
return NULL;
if ( !xgt )
return 0;
- rc = osdep_gnttab_close(xgt);
xentoolcore__deregister_active_handle(&xgt->tc_ah);
+ rc = osdep_gnttab_close(xgt);
xtl_logger_destroy(xgt->logger_tofree);
free(xgt);
return rc;
* fail (even though such a call is potentially meaningful).
* (If called again with a different domid, it will necessarily fail.)
*
+ * Note for multi-threaded programs: If xentoolcore_restrict_all is
+ * called concurrently with a function which /or closes Xen library
+ * handles (e.g. libxl_ctx_free, xs_close), the restriction is only
+ * guaranteed to be effective after all of the closing functions have
+ * returned, even if that is later than the return from
+ * xentoolcore_restrict_all. (Of course if xentoolcore_restrict_all
+ * it is called concurrently with opening functions, the new handles
+ * might or might not be restricted.)
+ *
* ====================================================================
* IMPORTANT - IMPLEMENTATION STATUS
*
* 4. ONLY THEN actually open the relevant fd or whatever
*
* III. during the "close handle" function
- * 1. FIRST close the relevant fd or whatever
- * 2. call xentoolcore__deregister_active_handle
+ * 1. FIRST call xentoolcore__deregister_active_handle
+ * 2. close the relevant fd or whatever
+ *
+ * [ III(b). Do the same as III for error exit from the open function. ]
*
* IV. in the restrict_callback function
* * Arrange that the fd (or other handle) can no longer by used
saved_errno = errno;
if (h) {
+ xentoolcore__deregister_active_handle(&h->tc_ah);
if (h->fd >= 0)
close(h->fd);
- xentoolcore__deregister_active_handle(&h->tc_ah);
}
free(h);
close(h->watch_pipe[1]);
}
- close(h->fd);
xentoolcore__deregister_active_handle(&h->tc_ah);
+ close(h->fd);
free(h);
}