#include <stdio.h>
struct NormalContext {};
struct InterruptContext {};
template <typename Context>
struct LockHelper {
template <typename Func, typename... Args>
static void call (Func f, Args... args)
{
printf("CLI\n");
//cli();
f(InterruptContext(), args...);
//sei();
printf("SEI\n");
}
};
template <>
struct LockHelper<InterruptContext> {
template <typename Func, typename... Args>
static void call (Func f, Args... args)
{
f(InterruptContext(), args...);
}
};
#define CRITICAL_SECTION(this_context, lock_context, body) \
LockHelper<decltype(this_context)>::call([&](InterruptContext lock_context) body)
template <typename Context>
void function1 (Context c)
{
CRITICAL_SECTION(c, lock_c, {
// do your stuff
// could also call other functions, but use lock_c
// function3(lock_c, ...);
// lock_c is always an InterruptContext() so no cli/sei will be done from inside here
});
}
template <typename Context>
void function2 (Context c)
{
function1(c);
}
int main ()
{
{
printf("Calling function from NormalContext, this one does CLI/SEI\n");
NormalContext c;
function2(c);
}
{
printf("Calling function from InterruptContext, this one doesn't do CLI/SEI\n");
InterruptContext c;
function2(c);
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3QgTm9ybWFsQ29udGV4dCB7fTsKc3RydWN0IEludGVycnVwdENvbnRleHQge307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGV4dD4Kc3RydWN0IExvY2tIZWxwZXIgewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lLi4uIEFyZ3M+CiAgICBzdGF0aWMgdm9pZCBjYWxsIChGdW5jIGYsIEFyZ3MuLi4gYXJncykKICAgIHsKICAgICAgICBwcmludGYoIkNMSVxuIik7CiAgICAgICAgLy9jbGkoKTsKICAgICAgICBmKEludGVycnVwdENvbnRleHQoKSwgYXJncy4uLik7CiAgICAgICAgLy9zZWkoKTsKICAgICAgICBwcmludGYoIlNFSVxuIik7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgTG9ja0hlbHBlcjxJbnRlcnJ1cHRDb250ZXh0PiB7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUuLi4gQXJncz4KICAgIHN0YXRpYyB2b2lkIGNhbGwgKEZ1bmMgZiwgQXJncy4uLiBhcmdzKQogICAgewogICAgICAgIGYoSW50ZXJydXB0Q29udGV4dCgpLCBhcmdzLi4uKTsKICAgIH0KfTsKCiNkZWZpbmUgQ1JJVElDQUxfU0VDVElPTih0aGlzX2NvbnRleHQsIGxvY2tfY29udGV4dCwgYm9keSkgXAogICAgTG9ja0hlbHBlcjxkZWNsdHlwZSh0aGlzX2NvbnRleHQpPjo6Y2FsbChbJl0oSW50ZXJydXB0Q29udGV4dCBsb2NrX2NvbnRleHQpIGJvZHkpCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGV4dD4Kdm9pZCBmdW5jdGlvbjEgKENvbnRleHQgYykKewogICAgQ1JJVElDQUxfU0VDVElPTihjLCBsb2NrX2MsIHsKICAgICAgICAvLyBkbyB5b3VyIHN0dWZmCiAgICAgICAgLy8gY291bGQgYWxzbyBjYWxsIG90aGVyIGZ1bmN0aW9ucywgYnV0IHVzZSBsb2NrX2MKICAgICAgICAvLyBmdW5jdGlvbjMobG9ja19jLCAuLi4pOwogICAgICAgIC8vIGxvY2tfYyBpcyBhbHdheXMgYW4gSW50ZXJydXB0Q29udGV4dCgpIHNvIG5vIGNsaS9zZWkgd2lsbCBiZSBkb25lIGZyb20gaW5zaWRlIGhlcmUKICAgIH0pOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGV4dD4Kdm9pZCBmdW5jdGlvbjIgKENvbnRleHQgYykKewogICAgZnVuY3Rpb24xKGMpOwp9CgppbnQgbWFpbiAoKQp7CiAgICB7CiAgICAgICAgcHJpbnRmKCJDYWxsaW5nIGZ1bmN0aW9uIGZyb20gTm9ybWFsQ29udGV4dCwgdGhpcyBvbmUgZG9lcyBDTEkvU0VJXG4iKTsKICAgICAgICBOb3JtYWxDb250ZXh0IGM7CiAgICAgICAgZnVuY3Rpb24yKGMpOwogICAgfQogICAgCiAgICB7CiAgICAgICAgcHJpbnRmKCJDYWxsaW5nIGZ1bmN0aW9uIGZyb20gSW50ZXJydXB0Q29udGV4dCwgdGhpcyBvbmUgZG9lc24ndCBkbyBDTEkvU0VJXG4iKTsKICAgICAgICBJbnRlcnJ1cHRDb250ZXh0IGM7CiAgICAgICAgZnVuY3Rpb24yKGMpOwogICAgfQp9Cgo=