// this is the lock server
// the lock client has a similar interface

#ifndef lock_server_h
#define lock_server_h

#include <string>
#include "lock_protocol.h"
#include "lock_client.h"
#include "rpc.h"


class rpc_lst {
    protected:
    pthread_mutex_t lst_mutex;
    std::map<int, int> lst;
    std::map<int, std::string> last_owners;
 public:
    rpc_lst();
    ~rpc_lst() {};
    bool find(int,lock_protocol::status &);
    bool find(int, std::string &);
    int put_result(int, lock_protocol::status, std::string);
    void print_list();
     
};

class lock_server {
 
 public:    
    lock_server();
    virtual ~lock_server() {};
    virtual lock_protocol::status subscribe(int,int &);
    virtual lock_protocol::status stat(std::string, int &);
    virtual lock_protocol::status acquire(std::string, int, int, int &);
    virtual lock_protocol::status release(std::string, int, int, int &);
    
 protected:    
    
    
    class named_lock{
    protected:
        std::string name;
        pthread_mutex_t lock_mutex;
        bool taken;
        int host;
        pthread_cond_t lock_cond;
        int times_acquired;
    public:
        named_lock();
        ~named_lock();
        void acquire();
        void release();
        int stat();
    };
    
    //int nacquire;
    pthread_mutex_t lock_lst_mutex;
    std::map<std::string,named_lock*> lock_lst;
    pthread_mutex_t rpc_lst_mutex;
    std::map<int,rpc_lst*> cl_rpc_lst;  
 

};

#endif 







