static int reply_ok_binary(descriptor_t *desc, char *ptr, int beg_offset, int length) { ErlDrvTermData msg[24]; int i = 0; int res; i = LOAD_PORT(msg, i, driver_mk_port(desc->port)); i = LOAD_ATOM(msg, i, am_ok); i = LOAD_BINARY(msg, i, edtk_alloced_ptr2ErlDrvBinary(ptr), beg_offset, length); i = LOAD_TUPLE(msg, i, 3); edtk_debug("%s: i = %d, ptr = 0x%lx, start = %d, end = %d", __FUNCTION__, i, ptr, beg_offset, length); res = driver_output_term(desc->port, msg, i); /* driver_output_term() incrs refc, and we're done, so decr refc */ /* ** We _know_ that "ptr" points to memory allocated by ** edtk_driver_alloc_wrapper(), so edtk_alloced_ptr2ErlDrvBinary() ** is safe in this case. If it weren't safe, then the binary ** must be returned by an xtra_return, which means we ** reply_ok_binary()) are never called! */ driver_free_binary(edtk_alloced_ptr2ErlDrvBinary(ptr)); edtk_debug("%s: res = %d", __FUNCTION__, res); return res; }
void edtk_driver_free_wrapper(void *p) { ErlDrvBinary *eb; edtk_debug("%s: top", __FUNCTION__); if ((eb = edtk_alloced_ptr2ErlDrvBinary(p)) != NULL) { edtk_debug("%s: eb = 0x%lx p = 0x%lx", __FUNCTION__, eb, p); driver_free_binary(eb); } }
void * edtk_driver_realloc_wrapper(void *p, size_t size) { ErlDrvBinary *eb, *neweb; edtk_debug("%s: top", __FUNCTION__); if ((eb = edtk_alloced_ptr2ErlDrvBinary(p)) != NULL) { if ((neweb = driver_realloc_binary(eb, size)) != NULL) { return neweb->orig_bytes; } else { return NULL; } } else { return NULL; } }