// Read reads from the object a specific length starting at the given offset. The read data is stored in an io.Reader // and is appended at the end of the args passed to the onComplete and onSafe callbacks. func (ao *AsyncObject) Read(length, offset uint64) { go func() { oid := C.CString(ao.name) defer freeString(oid) bufAddr := bufferAddress(int(length)) ret := C.rados_aio_read(ao.ioContext, oid, ao.completion, bufAddr, C.size_t(length), C.uint64_t(offset)) hasErr := ao.processError(ret, fmt.Sprintf("Unable to read from object %s", ao.name)) if hasErr { return } go func() { C.rados_aio_wait_for_complete(ao.completion) ret = C.rados_aio_get_return_value(ao.completion) data := bufToReader(bufAddr, ret) ao.args = append(ao.args, data) argCopy := make([]interface{}, len(ao.args)) copy(argCopy, ao.args) ao.onComplete(argCopy...) }() go func() { C.rados_aio_wait_for_safe(ao.completion) ret = C.rados_aio_get_return_value(ao.completion) data := bufToReader(bufAddr, ret) ao.args = append(ao.args, data) argCopy := make([]interface{}, len(ao.args)) copy(argCopy, ao.args) ao.onSafe(argCopy...) }() }() }
// helper method to call the onComplete and onsafe callbacks. func (ao *AsyncObject) completeOperation() { go func() { if ao.onComplete != nil { C.rados_aio_wait_for_complete(ao.completion) argCopy := make([]interface{}, len(ao.args)) copy(argCopy, ao.args) ao.onComplete(argCopy...) } }() go func() { if ao.onSafe != nil { C.rados_aio_wait_for_safe(ao.completion) argCopy := make([]interface{}, len(ao.args)) copy(argCopy, ao.args) ao.onSafe(argCopy...) } }() }
func (c *AioCompletion) WaitForComplete() { C.rados_aio_wait_for_complete(c.completion) }