Skip to content

Commit

Permalink
lcnt: Let runq locks reflect actual call location
Browse files Browse the repository at this point in the history
  • Loading branch information
Rick Reed authored and psyeugenic committed Apr 10, 2012
1 parent 7693334 commit efefd4b
Showing 1 changed file with 39 additions and 0 deletions.
39 changes: 39 additions & 0 deletions erts/emulator/beam/erl_process.h
Original file line number Diff line number Diff line change
Expand Up @@ -1400,10 +1400,14 @@ ERTS_GLB_INLINE Eterm erts_get_current_pid(void);
ERTS_GLB_INLINE Uint erts_get_scheduler_id(void);
ERTS_GLB_INLINE ErtsRunQueue *erts_get_runq_proc(Process *p);
ERTS_GLB_INLINE ErtsRunQueue *erts_get_runq_current(ErtsSchedulerData *esdp);
#ifndef ERTS_ENABLE_LOCK_COUNT
ERTS_GLB_INLINE void erts_smp_runq_lock(ErtsRunQueue *rq);
#endif
ERTS_GLB_INLINE int erts_smp_runq_trylock(ErtsRunQueue *rq);
ERTS_GLB_INLINE void erts_smp_runq_unlock(ErtsRunQueue *rq);
#ifndef ERTS_ENABLE_LOCK_COUNT
ERTS_GLB_INLINE void erts_smp_xrunq_lock(ErtsRunQueue *rq, ErtsRunQueue *xrq);
#endif
ERTS_GLB_INLINE void erts_smp_xrunq_unlock(ErtsRunQueue *rq, ErtsRunQueue *xrq);
ERTS_GLB_INLINE void erts_smp_runqs_lock(ErtsRunQueue *rq1, ErtsRunQueue *rq2);
ERTS_GLB_INLINE void erts_smp_runqs_unlock(ErtsRunQueue *rq1, ErtsRunQueue *rq2);
Expand Down Expand Up @@ -1492,6 +1496,12 @@ erts_get_runq_current(ErtsSchedulerData *esdp)
#endif
}

#ifdef ERTS_ENABLE_LOCK_COUNT

#define erts_smp_runq_lock(rq) erts_smp_mtx_lock_x(&(rq)->mtx, __FILE__, __LINE__)

#else

ERTS_GLB_INLINE void
erts_smp_runq_lock(ErtsRunQueue *rq)
{
Expand All @@ -1500,6 +1510,8 @@ erts_smp_runq_lock(ErtsRunQueue *rq)
#endif
}

#endif

ERTS_GLB_INLINE int
erts_smp_runq_trylock(ErtsRunQueue *rq)
{
Expand All @@ -1518,6 +1530,31 @@ erts_smp_runq_unlock(ErtsRunQueue *rq)
#endif
}

#ifdef ERTS_ENABLE_LOCK_COUNT

#define erts_smp_xrunq_lock(rq, xrq) erts_smp_xrunq_lock_x((rq), (xrq), __FILE__, __LINE__)

ERTS_GLB_INLINE void
erts_smp_xrunq_lock_x(ErtsRunQueue *rq, ErtsRunQueue *xrq, char* file, int line)
{
#ifdef ERTS_SMP
ERTS_SMP_LC_ASSERT(erts_smp_lc_mtx_is_locked(&rq->mtx));
if (xrq != rq) {
if (erts_smp_mtx_trylock(&xrq->mtx) == EBUSY) {
if (rq < xrq)
erts_smp_mtx_lock_x(&xrq->mtx, file, line);
else {
erts_smp_mtx_unlock(&rq->mtx);
erts_smp_mtx_lock_x(&xrq->mtx, file, line);
erts_smp_mtx_lock_x(&rq->mtx, file, line);
}
}
}
#endif
}

#else

ERTS_GLB_INLINE void
erts_smp_xrunq_lock(ErtsRunQueue *rq, ErtsRunQueue *xrq)
{
Expand All @@ -1537,6 +1574,8 @@ erts_smp_xrunq_lock(ErtsRunQueue *rq, ErtsRunQueue *xrq)
#endif
}

#endif

ERTS_GLB_INLINE void
erts_smp_xrunq_unlock(ErtsRunQueue *rq, ErtsRunQueue *xrq)
{
Expand Down

0 comments on commit efefd4b

Please sign in to comment.