#ifndef LM_INCLUDE_CONFIG
#define LM_INCLUDE_CONFIG


LM_SINGLE_MUTEX_MGR_AASL:   volatile, no_pre, no_post,
        reads   "@0::.ll_mutex" "@0::locked" "@0::locked_by" "@0::my_manager",
        writes  "@0::locked" "@0::locked_by",
        var     "BR_spinlock_t lm_ll_mutex;"
                "@.locked_by lm_thread_id;"
                "@r $$;",
        exec    "if (FAR($0)) { $$=FALSE;"
                "} else {"
                " lm_ll_mutex = ATTR(ATTR($0,$.ll_mutex),lck);"
                " BR_SPINLOCK_LOCK(lm_ll_mutex);"
                " if((void*)(ATTR($0,$.my_manager))!=(void*)($0)) { $$=FALSE;"
                " } else {"
                "  lm_thread_id = PSATHER_THREAD_ID;"
                "  if (ATTR($0,$.locked) == 0 || BR_THREAD_SAME(ATTR($0,$.locked_by),lm_thread_id)) {"
                "   ATTR($0,$.locked) ++; ATTR($0,$.locked_by) = lm_thread_id;"
                "   BR_SPINLOCK_UNLOCK(lm_ll_mutex);"
                "   $$ = TRUE;"
                "  } else { $$ = FALSE;}"
                " }"
                "}"
                "$$";

LM_SINGLE_MUTEX_MGR_ATSL:   volatile, no_pre, no_post,
        reads   "@0::.ll_mutex" "@0::locked" "@0::locked_by" "@0::my_manager",
        writes  "@0::locked" "@0::locked_by",
        var     "BR_spinlock_t lm_ll_mutex;"
                "@.locked_by lm_thread_id;"
                "@r $$;",
        exec    "if (FAR($0)) { $$=FALSE;"
                "} else {"
                " lm_ll_mutex = ATTR(ATTR($0,$.ll_mutex),lck);"
                " BR_SPINLOCK_LOCK(lm_ll_mutex);"
                " if((void*)(ATTR($0,$.my_manager))!=(void*)($0)) { $$ = -1;"
                " } else {"
                "  lm_thread_id = BR_THREAD_ID();"
                "  if (ATTR($0,$.locked) == 0 || BR_THREAD_SAME(ATTR($0,$.locked_by),lm_thread_id)) {"
                "   ATTR($0,$.locked) ++; ATTR($0,$.locked_by) = lm_thread_id;"
                "   $$ = 0;"
                "  } else { $$ = 1;}"
                "  BR_SPINLOCK_UNLOCK(lm_ll_mutex);"
                " }"
                "}"
                "$$";

LM_SINGLE_MUTEX_MGR_ARSL:   volatile, no_pre, no_post,
        reads   "@0::.ll_mutex"
                "@0::locked"
                "@0::my_manager"
                "@0::no_thread_waiting",
        writes  "@0::locked",
        var     "BR_spinlock_t lm_ll_mutex;"
                "@.locked_by lm_thread_id;"
                "@r $$;",
        exec    "if (FAR($0)) { $$=FALSE;"
                "} else {"
                " lm_ll_mutex = ATTR(ATTR($0,$.ll_mutex),lck);"
                " BR_SPINLOCK_LOCK(lm_ll_mutex);"
                " if((void*)(ATTR($0,$.my_manager))!=(void*)($0)) { $$ = FALSE;"
                " } else {"
                "  ATTR($0,$.locked) -= 1;"
                "  if (ATTR($0,$.locked) != 0) {"
                "   BR_SPINLOCK_UNLOCK(lm_ll_mutex);"
                "   $$ = TRUE;"
                "  } else {"
                "   if (ATTR($0,$.no_thread_waiting)) {"
                "    BR_SPINLOCK_UNLOCK(lm_ll_mutex);"
                "    $$ = TRUE;"
                "   } else { $$ = FALSE; }"
                "  }"
                " }"
                "}"
                "$$";

#endif
