#define wait_on_pr(__pr, __condition__) \
- while (__condition__){ \
+ do { \
ta--; \
__get_mapper_io(pr)->active = 0;\
XSEGLOG2(&lc, D, "Waiting on pr %lx, ta: %u", pr, ta); \
st_cond_wait(__pr->cond); \
- }
+ } while (__condition__)
#define wait_on_mapnode(__mn, __condition__) \
- while (__condition__){ \
+ do { \
ta--; \
__mn->waiters++; \
XSEGLOG2(&lc, D, "Waiting on map node %lx %s, waiters: %u, \
ta: %u", __mn, __mn->object, __mn->waiters, ta); \
st_cond_wait(__mn->cond); \
- }
+ } while (__condition__)
#define wait_on_map(__map, __condition__) \
- while (__condition__){ \
+ do { \
ta--; \
__map->waiters++; \
XSEGLOG2(&lc, D, "Waiting on map %lx %s, waiters: %u, ta: %u",\
__map, __map->volume, __map->waiters, ta); \
st_cond_wait(__map->cond); \
- }
+ } while (__condition__)
#define signal_pr(__pr) \
do { \
if (mn) {
//make sure all pending operations on all objects are completed
//this should never happen...
- wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
+ if (mn->flags & MF_OBJECT_NOT_READY)
+ wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
mn->flags |= MF_OBJECT_DESTROYED;
put_mapnode(mn); //matchin mn->ref = 1 on mn init
put_mapnode(mn); //matcing get_mapnode;
if (mn->flags & MF_OBJECT_NOT_READY){
if (!can_wait)
continue;
- wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
+ if (mn->flags & MF_OBJECT_NOT_READY)
+ wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
if (mn->flags & MF_OBJECT_DESTROYED){
mio->err = 1;
continue;
}
can_wait = 1;
}
- wait_on_pr(pr, mio->copyups > 0);
+ if (mio->copyups > 0)
+ wait_on_pr(pr, mio->copyups > 0);
}
if (mio->err){
if (mn) {
if (!(mn->flags & MF_OBJECT_DESTROYED)){
//make sure all pending operations on all objects are completed
- wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
+ if (mn->flags & MF_OBJECT_NOT_READY)
+ wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
mn->flags |= MF_OBJECT_DESTROYED;
}
put_mapnode(mn);
* this should be nr_ops of the blocker, but since we don't know
* that, we assume based on our own nr_ops
*/
- wait_on_pr(pr, mio->snap_pending >= peer->nr_ops);
+ if (mio->snap_pending >= peer->nr_ops)
+ wait_on_pr(pr, mio->snap_pending >= peer->nr_ops);
mn = get_mapnode(map, i);
if (!mn)
continue;
}
// make sure all pending operations on all objects are completed
- wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
+ if (mn->flags & MF_OBJECT_NOT_READY)
+ wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
/* TODO will this ever happen?? */
if (mn->flags & MF_OBJECT_DESTROYED){
/* do not put_mapnode here. cb does that */
}
- wait_on_pr(pr, mio->snap_pending > 0);
+ if (mio->snap_pending > 0)
+ wait_on_pr(pr, mio->snap_pending > 0);
mio->cb = NULL;
if (mio->err)
* this should be nr_ops of the blocker, but since we don't know
* that, we assume based on our own nr_ops
*/
- wait_on_pr(pr, mio->del_pending >= peer->nr_ops);
+ if (mio->del_pending >= peer->nr_ops)
+ wait_on_pr(pr, mio->del_pending >= peer->nr_ops);
mn = get_mapnode(map, i);
if (!mn)
}
// make sure all pending operations on all objects are completed
- wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
+ if (mn->flags & MF_OBJECT_NOT_READY)
+ wait_on_mapnode(mn, mn->flags & MF_OBJECT_NOT_READY);
req = __delete_object(pr, mn);
if (!req){
/* do not put_mapnode here. cb does that */
}
- wait_on_pr(pr, mio->del_pending > 0);
+ if (mio->del_pending > 0)
+ wait_on_pr(pr, mio->del_pending > 0);
mio->cb = NULL;
map->flags &= ~MF_MAP_DELETING;