void bmk_platform_cpu_block(bmk_time_t until) { block_domain(until); minios_force_evtchn_callback(); }
int xencons_ring_send_no_notify(struct consfront_dev *dev, const char *data, unsigned len) { int sent = 0; struct xencons_interface *intf; XENCONS_RING_IDX cons, prod; if (!dev) intf = xencons_interface(); else intf = dev->ring; if (!intf) return sent; while (sent < len) { cons = intf->out_cons; prod = intf->out_prod; mb(); BUG_ON((prod - cons) > sizeof(intf->out)); while ((sent < len) && ((prod - cons) < sizeof(intf->out))) intf->out[MASK_XENCONS_IDX(prod++, intf->out)] = data[sent++]; wmb(); intf->out_prod = prod; if (sent < len) { block_domain(MILLISECS(10)); } } return sent; }
CAMLprim value caml_block_domain(value v_until) { CAMLparam1(v_until); block_domain((s_time_t)(Double_val(v_until) * 1000000000)); CAMLreturn(Val_unit); }