#ifndef LOCKMANAGER_H
#define LOCKMANAGER_H

#include "persifs.h"
#include "inodelog.h"
#include <qhash.h>

/**
 * Simple lock manager inspired by lab 1 (but without RPC).
 *
 * Really this should probably all be templatized. But...
 */

struct lockRequest 
{
  inumber lockId;
  callback<void>::ref cb;
  tailq_entry<lockRequest> llink;

  lockRequest(inumber lockId, callback<void>::ref cb)
    : lockId(lockId), cb(cb)
    {
    }
};

struct lockStatus
{
  inumber lockId;
  ihash_entry<lockStatus> hlink;
  tailq<lockRequest, &lockRequest::llink> queue;
};


class lockManager
{
public:
  lockManager();
  ~lockManager();
  
  void acquire(inumber lockId, callback<void>::ref cb);
  void release(inumber lockId);
  
private:
  ihash<inumber, lockStatus, &lockStatus::lockId,
        &lockStatus::hlink> locks;
  void grantLock(lockStatus *lock, lockRequest *req);
};

#endif
