/*=========================================================================
 * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
 * This product is protected by U.S. and international copyright
 * and intellectual property laws. Pivotal products are covered by
 * one or more patents listed at http://www.pivotal.io/patents.
 *=========================================================================
 */
/*
 * CacheTransactionManagerImpl.h
 *
 *  Created on: 04-Feb-2011
 *      Author: ankurs
 */

#ifndef CACHETRANSACTIONMANAGERIMPL_H_
#define CACHETRANSACTIONMANAGERIMPL_H_

#include "../CacheTransactionManager.hpp"
#include "../HashSetOfSharedBase.hpp"
#include "TXCommitMessage.hpp"
#include "../Log.hpp"
#include "SuspendedTxExpiryHandler.hpp"

namespace gemfire {

enum status { STATUS_COMMITTED=3, STATUS_ROLLEDBACK=4 };
enum commitOp { BEFORE_COMMIT, AFTER_COMMIT };

class CacheTransactionManagerImpl: public virtual gemfire::CacheTransactionManager {
public:
	CacheTransactionManagerImpl(Cache* cache);
	virtual ~CacheTransactionManagerImpl();

	virtual void begin();
	virtual void commit();
	virtual void rollback();
	virtual bool exists();
	virtual TransactionIdPtr suspend();
  virtual void resume(TransactionIdPtr transactionId);
  virtual bool isSuspended(TransactionIdPtr transactionId);
  virtual bool tryResume(TransactionIdPtr transactionId);
  bool tryResume(TransactionIdPtr transactionId, bool cancelExpiryTask);
  virtual bool tryResume(TransactionIdPtr transactionId, int32_t waitTimeInMillisec);
  virtual bool exists(TransactionIdPtr transactionId);

  virtual TransactionIdPtr getTransactionId();

//    virtual void setWriter(TransactionWriterPtr writer);
//    virtual TransactionWriterPtr getWriter();

//    virtual void addListener(TransactionListenerPtr aListener);
//    virtual void removeListener(TransactionListenerPtr aListener);

    inline static int32_t hasher( const SharedBasePtr& p )
    {
    	return (int32_t)reinterpret_cast<intptr_t>(p.ptr());
    }

    inline static bool equal_to( const SharedBasePtr& x, const SharedBasePtr& y )
    {
    	return x.ptr() == y.ptr();
    }
    TXState* getSuspendedTx(int32_t txId);
    
protected:
    ThinClientPoolDM* getDM();
    Cache* getCache();

private:
    Cache* m_cache;
    //TransactionListenerPtr m_listener;

//    void noteCommitFailure(TXState* txState, const TXCommitMessagePtr& commitMessage);
//    void noteCommitSuccess(TXState* txState, const TXCommitMessagePtr& commitMessage);
//    void noteRollbackSuccess(TXState* txState, const TXCommitMessagePtr& commitMessage);
    void resumeTxUsingTxState(TXState* txState, bool cancelExpiryTask = true);
    GfErrType rollback(TXState* txState, bool callListener);
    void addSuspendedTx( int32_t txId, TXState *txState);
    TXState* removeSuspendedTx(int32_t txId);
    TXState* removeSuspendedTxUntil(int32_t txId, int32_t waitTimeInSec);
    bool isSuspendedTx(int32_t txId) ;
    void addTx( int32_t txId);
    bool removeTx(int32_t txId);
    bool findTx(int32_t txId);
    std::map<int32_t, TXState*> m_suspendedTXs;
    ACE_Recursive_Thread_Mutex m_suspendedTxLock;
    std::vector<int32_t> m_TXs;
    ACE_Recursive_Thread_Mutex m_txLock;
    ACE_Condition < ACE_Recursive_Thread_Mutex > m_txCond;
      
    friend class TXCleaner;
};

}

#endif /* CACHETRANSACTIONMANAGERIMPL_H_ */
