// RPC stubs for clients to talk to lock_server

#include "lock_client.h"
#include "rpc.h"

lock_client::lock_client(sockaddr_in xdst)
  : dst(xdst)
{
  printf("new lock client\n");
  request_id = 0;
  assert(pthread_mutex_init(&request_id_mutex,0) == 0);
  int r;
  //assert(cl.call(dst, lock_protocol::subscribe,0, r) == lock_protocol::OK);
  id = r;  
}

int
lock_client::stat(std::string name)
{
  printf("lock_client: stat lock %s\n",name.c_str());
  int r;
  int ret = cl.call(dst, lock_protocol::stat, name, r);
  assert (ret == lock_protocol::OK);
  return r;
}

lock_protocol::status
lock_client::acquire(std::string name)
{
  printf("lock_client: acquire lock %s\n",name.c_str());
  int r;
  int rid;
  assert(pthread_mutex_lock(&request_id_mutex) == 0);
  request_id++;
  rid = request_id;
  assert(pthread_mutex_unlock(&request_id_mutex) == 0);
  lock_protocol::status ret = cl.call(dst, lock_protocol::acquire, name, id, rid,r);
  //printf("acquired lock %s\n",name.c_str());
  return ret;
}

lock_protocol::status
lock_client::release(std::string name)
{
  int r;
  int rid;
  printf("lock_client: release lock %s\n",name.c_str());
  assert(pthread_mutex_lock(&request_id_mutex) == 0);
  request_id++;
  rid = request_id;
  assert(pthread_mutex_unlock(&request_id_mutex) == 0);
  lock_protocol::status ret = cl.call(dst, lock_protocol::release, name, id, rid,r);
  //printf("released lock %s\n",name.c_str());
  return ret;
}

