#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/interprocess/sync/named_mutex.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/thread/thread.hpp>

// g++-mp-4.3 -I /opt/local/include/ -Wl,-L/opt/local/lib y.cpp -Wl,-lboost_thread-xgcc40-mt
// cl -Zi -I c:\local\boost\boost_1_35_0 y.cpp -EHsc -link -libpath:c:\local\boost\boost_1_35_0\lib-x86

namespace ipc= boost::interprocess;
namespace bptime= boost::posix_time;

typedef ipc::scoped_lock<ipc::named_mutex> ipc_lock;

void timelogmsg(bptime::ptime& t0, const char*msg)
{
    bptime::ptime t1(bptime::microsec_clock::universal_time());

    printf("%8d %s\n", (long)(t1-t0).total_milliseconds(), msg);
    t0= t1;
}
int main(int argc,char**)
{
    if (argc>1) {
        // server
        ipc::named_mutex::remove("itsmesmutex");
        printf("removed\n");
        ipc::named_mutex mtx(ipc::open_or_create, "itsmesmutex");
        printf("svr created\n");

        bptime::ptime t0(bptime::microsec_clock::universal_time());

        for (int i=0 ; i<10 ; i++)
        {
            if (1)
            {
                ipc_lock lock(mtx);

                timelogmsg(t0, "svr locked");
                boost::this_thread::sleep(bptime::milliseconds(2000));
            }
            timelogmsg(t0, "svr unlocked");
            boost::this_thread::sleep(bptime::milliseconds(1200));
        }
    }
    else {
        // client
        ipc::named_mutex mtx(ipc::open_only,"itsmesmutex");
        printf("clt opened\n");

        bptime::ptime t0(bptime::microsec_clock::universal_time());
        for (int i=0 ; i<10 ; i++)
        {
            if (1)
            {
                ipc_lock lock(mtx);

                timelogmsg(t0, "clt locked");
                boost::this_thread::sleep(bptime::milliseconds(1500));
            }
            timelogmsg(t0, "clt unlocked");
            boost::this_thread::sleep(bptime::milliseconds(1700));
        }
    }
}
