err_t qbytes_create_generic(qbytes_t** out, void* give_data, int64_t len, qbytes_free_t free_function) { qbytes_t* ret = NULL; ret = (qbytes_t*) qio_calloc(1, sizeof(qbytes_t)); if( ! ret ) return ENOMEM; _qbytes_init_generic(ret, give_data, len, free_function); *out = ret; return 0; }
// On return, the ref count is 1. qioerr qbytes_create_generic(qbytes_t** out, void* give_data, int64_t len, qbytes_free_t free_function) { qbytes_t* ret = NULL; ret = (qbytes_t*) qio_calloc(1, sizeof(qbytes_t)); if( ! ret ) return QIO_ENOMEM; // On return the ref count is 1. _qbytes_init_generic(ret, give_data, len, free_function); *out = ret; return 0; }
err_t qbytes_create_calloc(qbytes_t** out, int64_t len) { qbytes_t* ret = NULL; void* data; ret = (qbytes_t*) qio_calloc(1, sizeof(qbytes_t) + len); if( ! ret ) return ENOMEM; data = ret + 1; // ie ret + sizeof(qbytes_t) _qbytes_init_generic(ret, data, len, qbytes_free_null); *out = ret; return 0; }
// The ref count returned in 'out' is initially 1. // The caller is responsible for calling qbytes_release on it. qioerr qbytes_create_calloc(qbytes_t** out, int64_t len) { qbytes_t* ret = NULL; void* data; ret = (qbytes_t*) qio_calloc(1, sizeof(qbytes_t) + len); if( ! ret ) { *out = NULL; return QIO_ENOMEM; } data = ret + 1; // ie ret + sizeof(qbytes_t) // On return, the ref count in ret is 1. _qbytes_init_generic(ret, data, len, qbytes_free_null); *out = ret; return 0; }
err_t _qbytes_init_iobuf(qbytes_t* ret) { void* data = NULL; // allocate 4K-aligned (or page size aligned) // multiple of 4K data = valloc(qbytes_iobuf_size); if( !data ) return ENOMEM; // We used to use posix_memalign, but that didn't work on an old Mac; // also, this should be page-aligned (vs iobuf_size aligned). //err_t err = posix_memalign(&data, qbytes_iobuf_size, qbytes_iobuf_size); //if( err ) return err; memset(data, 0, qbytes_iobuf_size); _qbytes_init_generic(ret, data, qbytes_iobuf_size, qbytes_free_iobuf); return 0; }