Example #1
0
// 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...)
		}()
	}()

}
Example #2
0
// 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...)
		}
	}()

}
Example #3
0
func (c *AioCompletion) WaitForComplete() {
	C.rados_aio_wait_for_complete(c.completion)
}