static void usebuf_ref_put(struct usebuf_output *output, struct mref_object *mref) { struct usebuf_input *input = output->brick->inputs[0]; struct usebuf_mref_aspect *mref_a; struct usebuf_mref_aspect *sub_mref_a; struct mref_object *sub_mref; mref_a = usebuf_mref_get_aspect(output->brick, mref); if (unlikely(!mref_a)) { MARS_FAT("cannot get aspect\n"); return; } sub_mref_a = mref_a->sub_mref_a; if (!sub_mref_a) { MARS_FAT("sub_mref_a is missing\n"); return; } sub_mref = sub_mref_a->object; if (!sub_mref) { MARS_FAT("sub_mref is missing\n"); return; } if (!_mref_put(mref)) return; GENERIC_INPUT_CALL(input, mref_put, sub_mref); usebuf_free_mref(mref); }
static void _usebuf_endio(struct generic_callback *cb) { struct usebuf_mref_aspect *mref_a = cb->cb_private; struct mref_object *mref; struct usebuf_mref_aspect *sub_mref_a; struct mref_object *sub_mref; LAST_CALLBACK(cb); CHECK_PTR(mref_a, done); mref = mref_a->object; CHECK_PTR(mref, done); sub_mref_a = mref_a->sub_mref_a; CHECK_PTR(sub_mref_a, done); sub_mref = sub_mref_a->object; CHECK_PTR(sub_mref, done); //MARS_INF("HALLO %p %p len = %d may_write = %d rw = %d flags = %d\n", mref, sub_mref, sub_mref->ref_len, sub_mref->ref_may_write, sub_mref->ref_rw, sub_mref->ref_flags); if (mref->ref_data != sub_mref->ref_data && cb->cb_error >= 0) { if (sub_mref->ref_may_write == 0) { if (sub_mref->ref_flags & MREF_UPTODATE) { _usebuf_copy(mref, sub_mref, 0); mref->ref_flags |= MREF_UPTODATE; } #ifndef FAKE_ALL } else if (sub_mref->ref_rw == 0) { MARS_IO("re-kick %p\n", sub_mref); sub_mref->ref_rw = 1; _usebuf_copy(mref, sub_mref, 1); mref->ref_flags |= MREF_UPTODATE; GENERIC_INPUT_CALL(mref_a->input, mref_io, sub_mref); return; #endif } } #if 1 if (mref_a->yyy++ > 0) MARS_ERR("yyy = %d\n", mref_a->yyy - 1); if (cb->cb_error < 0) MARS_ERR("error = %d\n", cb->cb_error); #endif CHECKED_CALLBACK(mref, cb->cb_error, done); if (!_mref_put(mref)) return; #if 1 _mref_put(sub_mref); #endif usebuf_free_mref(mref); done:; }
static void dummy_ref_io(struct dummy_output *output, struct mref_object *mref) { struct dummy_input *input = output->brick->inputs[0]; GENERIC_INPUT_CALL(input, mref_io, mref); }
static int dummy_ref_get(struct dummy_output *output, struct mref_object *mref) { struct dummy_input *input = output->brick->inputs[0]; return GENERIC_INPUT_CALL(input, mref_get, mref); }
static int dummy_get_info(struct dummy_output *output, struct mars_info *info) { struct dummy_input *input = output->brick->inputs[0]; return GENERIC_INPUT_CALL(input, mars_get_info, info); }
static void usebuf_ref_io(struct usebuf_output *output, struct mref_object *mref) { struct usebuf_input *input = output->brick->inputs[0]; struct usebuf_mref_aspect *mref_a; struct usebuf_mref_aspect *sub_mref_a; struct mref_object *sub_mref; int error = -EILSEQ; might_sleep(); _mref_check(mref); mref_a = usebuf_mref_get_aspect(output->brick, mref); if (unlikely(!mref_a)) { MARS_FAT("cannot get aspect\n"); goto err; } sub_mref_a = mref_a->sub_mref_a; if (!sub_mref_a) { MARS_FAT("sub_mref is missing\n"); goto err; } sub_mref = sub_mref_a->object; if (!sub_mref) { MARS_FAT("sub_mref is missing\n"); goto err; } if (mref->ref_rw != 0 && sub_mref->ref_may_write == 0) { MARS_ERR("mref_may_write was not set before\n"); goto err; } _mref_get(mref); sub_mref->ref_rw = mref->ref_rw; sub_mref->ref_len = mref->ref_len; mref_a->input = input; /* Optimization: when buffered IO is used and buffer is already * uptodate, skip real IO operation. */ if (mref->ref_rw != 0) { #ifdef DIRECT_WRITE sub_mref->ref_rw = 1; #else // normal case sub_mref->ref_rw = 0; if (sub_mref->ref_flags & MREF_UPTODATE) { sub_mref->ref_rw = 1; } #endif } else if (sub_mref->ref_flags & MREF_UPTODATE) { MARS_IO("direct _usebuf_endio\n"); _usebuf_endio(sub_mref->object_cb); return; } if (mref->ref_data != sub_mref->ref_data) { if (sub_mref->ref_rw != 0) { _usebuf_copy(mref, sub_mref, 1); mref->ref_flags |= MREF_UPTODATE; } } #ifdef FAKE_ALL _usebuf_endio(sub_mref->ref_cb); return; #endif GENERIC_INPUT_CALL(input, mref_io, sub_mref); return; err: SIMPLE_CALLBACK(mref, error); return; }
static int usebuf_ref_get(struct usebuf_output *output, struct mref_object *mref) { struct usebuf_input *input = output->brick->inputs[0]; struct usebuf_mref_aspect *mref_a; struct usebuf_mref_aspect *sub_mref_a; struct mref_object *sub_mref; int status = 0; might_sleep(); mref_a = usebuf_mref_get_aspect(output->brick, mref); if (unlikely(!mref_a)) { MARS_FAT("cannot get aspect\n"); return -EILSEQ; } sub_mref_a = mref_a->sub_mref_a; if (!sub_mref_a) { sub_mref = usebuf_alloc_mref(output->brick); if (unlikely(!sub_mref)) { MARS_FAT("cannot get sub_mref\n"); return -ENOMEM; } sub_mref_a = usebuf_mref_get_aspect(output->brick, sub_mref); if (unlikely(!sub_mref_a)) { MARS_FAT("cannot get aspect\n"); return -EILSEQ; } mref_a->sub_mref_a = sub_mref_a; sub_mref->ref_pos = mref->ref_pos; sub_mref->ref_len = mref->ref_len; sub_mref->ref_may_write = mref->ref_may_write; #ifdef DIRECT_IO // shortcut solely for testing: do direct IO if (!mref->ref_data) MARS_ERR("NULL.......\n"); sub_mref->ref_data = mref->ref_data; #else // normal case: buffered IO sub_mref->ref_data = NULL; #endif SETUP_CALLBACK(sub_mref, _usebuf_endio, mref_a); mref->ref_flags = 0; } else { sub_mref = sub_mref_a->object; #if 1 MARS_ERR("please do not use this broken feature\n"); #endif } status = GENERIC_INPUT_CALL(input, mref_get, sub_mref); if (status < 0) { return status; } mref->ref_len = sub_mref->ref_len; //MARS_INF("GOT %p %p flags = %d\n", mref, sub_mref, sub_mref->ref_flags); if (!mref->ref_data) { MARS_INF("uiiiiiiiiiii\n"); mref->ref_data = sub_mref->ref_data; } _mref_get(mref); return status; }