summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/syncop.c
diff options
context:
space:
mode:
authorKrishnan Parthasarathi <kparthas@redhat.com>2013-05-11 14:29:29 +0530
committerVijay Bellur <vbellur@redhat.com>2013-05-21 06:03:14 -0700
commitf8e19c6b6f21142aadabd2f30dc3b960a6ec1fa2 (patch)
tree76f6fc68048ccce6c95b3758b5461992accf54cc /libglusterfs/src/syncop.c
parent8abe8f794913daa81d9f1dc0ddab26c9c414abf8 (diff)
syncop: Update synctask state appropriately
Backport of http://review.gluster.org/4985 * Earlier, SYNCOP macro, the only consumer of synctask_yield, would set the task->state to SYNCTASK_SUSPEND. Today, we have glusterd having its own wrapper macros which don't set task's state. There is also the syncbarrier and synclock framework, which also participate in a synctask's scheduling (and need to keep a task's state up to date). It only makes more sense to leave a synctask's state to the synctask library, since its an internal affair. * Need to 'yawn' before 'yield' to avoid re-running tasks to set task->woken appropriately. Change-Id: Ic7a59e6ebcc46f03e53223ca237668d45a3cba40 BUG: 948686 Signed-off-by: Krishnan Parthasarathi <kparthas@redhat.com> Reviewed-on: http://review.gluster.org/5053 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'libglusterfs/src/syncop.c')
-rw-r--r--libglusterfs/src/syncop.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c
index dbc52259fe7..aa46f6219ce 100644
--- a/libglusterfs/src/syncop.c
+++ b/libglusterfs/src/syncop.c
@@ -89,6 +89,8 @@ synctask_yield (struct synctask *task)
task->proc->sched.uc_flags &= ~_UC_TLSBASE;
#endif
+ if (task->state != SYNCTASK_DONE)
+ task->state = SYNCTASK_SUSPEND;
if (swapcontext (&task->ctx, &task->proc->sched) < 0) {
gf_log ("syncop", GF_LOG_ERROR,
"swapcontext failed (%s)", strerror (errno));
@@ -238,6 +240,7 @@ synctask_new (struct syncenv *env, synctask_fn_t fn, synctask_cbk_t cbk,
newtask->gid = newtask->opframe->root->gid;
INIT_LIST_HEAD (&newtask->all_tasks);
+ INIT_LIST_HEAD (&newtask->waitq);
if (getcontext (&newtask->ctx) < 0) {
gf_log ("syncop", GF_LOG_ERROR,
@@ -530,6 +533,7 @@ __synclock_lock (struct synclock *lock)
/* called within a synctask */
list_add_tail (&task->waitq, &lock->waitq);
pthread_mutex_unlock (&lock->guard);
+ synctask_yawn (task);
synctask_yield (task);
/* task is removed from waitq in unlock,
* under lock->guard.*/
@@ -686,6 +690,7 @@ __syncbarrier_wait (struct syncbarrier *barrier, int waitfor)
list_add_tail (&task->waitq, &barrier->waitq);
{
pthread_mutex_unlock (&barrier->guard);
+ synctask_yawn (task);
synctask_yield (task);
pthread_mutex_lock (&barrier->guard);
}