Commit b98d1b05 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Pass the objcore to VBO_waitlen() instead of deriving it from the busyobj

parent 8656fec9
......@@ -671,7 +671,8 @@ double BAN_Time(const struct ban *ban);
struct busyobj *VBO_GetBusyObj(struct worker *, const struct req *);
void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj);
void VBO_extend(struct busyobj *, ssize_t);
ssize_t VBO_waitlen(struct worker *, struct busyobj *, ssize_t l);
ssize_t VBO_waitlen(struct worker *, struct objcore *, struct busyobj *,
ssize_t l);
void VBO_setstate(struct busyobj *bo, enum busyobj_state_e next);
void VBO_waitstate(struct busyobj *bo, enum busyobj_state_e want);
......
......@@ -236,20 +236,22 @@ VBO_extend(struct busyobj *bo, ssize_t l)
}
ssize_t
VBO_waitlen(struct worker *wrk, struct busyobj *bo, ssize_t l)
VBO_waitlen(struct worker *wrk, struct objcore *oc, struct busyobj *bo,
ssize_t l)
{
ssize_t rv;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
xxxassert(bo->fetch_objcore == oc);
Lck_Lock(&bo->mtx);
rv = ObjGetLen(wrk, bo->fetch_objcore);
rv = ObjGetLen(wrk, oc);
while (1) {
assert(l <= rv || bo->state == BOS_FAILED);
if (rv > l || bo->state >= BOS_FINISHED)
break;
(void)Lck_CondWait(&bo->cond, &bo->mtx, 0);
rv = ObjGetLen(wrk, bo->fetch_objcore);
rv = ObjGetLen(wrk, oc);
}
Lck_Unlock(&bo->mtx);
return (rv);
......
......@@ -257,7 +257,7 @@ sml_iterator(struct worker *wrk, struct objcore *oc,
while (1) {
ol = len;
nl = VBO_waitlen(wrk, bo, ol);
nl = VBO_waitlen(wrk, oc, bo, ol);
if (bo->state == BOS_FAILED) {
ret = -1;
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment