/**
     * Reseeds this random object, using the bytes contained in the given long seed.
     */
    void SecureRandom::setSeed(int seed)   
    {
        // All forward facing gear which manipulates internal state acquires the object lock
        MutexLock lock(getObjectLock());

        ASSERT(m_impl.get() != nullptr);
        m_impl->setSeedImpl((const byte*)&seed, sizeof(seed));
    }
    /**
     * Generates a user-specified number of random bytes.
     */
    void SecureRandom::nextBytes(byte bytes[], size_t size)   
    {
        // All forward facing gear which manipulates internal state acquires the object lock
        MutexLock lock(getObjectLock());

        ASSERT(m_impl.get() != nullptr);
        m_impl->nextBytesImpl(bytes, size);
    }
    /**
     * Returns the security level associated with the SecureRandom object. Used
     * by KeyGenerator to determine the appropriate key size for init.
     */
    unsigned int SecureRandom::getSecurityLevel() const   
    {
        // All forward facing gear which manipulates internal state acquires the object lock
        MutexLock lock(getObjectLock());

        ASSERT(m_impl.get() != nullptr);
        return m_impl->getSecurityLevelImpl();
    }
    /**
     * Returns the name of the algorithm implemented by this SecureRandom object.
     */
    NarrowString SecureRandom::getAlgorithm() const   
    {
        // All forward facing gear which manipulates internal state acquires the object lock
        MutexLock lock(getObjectLock());

        ASSERT(m_impl.get() != nullptr);
        return m_impl->getAlgorithmImpl();
    }  
    /**
     * Returns the given number of seed bytes, computed using the seed generation algorithm that this class uses to seed itself.
     */
    SecureByteArray SecureRandom::generateSeed(unsigned int numBytes)   
    {
        // All forward facing gear which manipulates internal state acquires the object lock
        MutexLock lock(getObjectLock());

        ASSERT(m_impl.get() != nullptr);
        return m_impl->generateSeedImpl(numBytes);
    }
    /**
     * Reseeds this random object.
     */
    void SecureRandom::setSeed(const byte seed[], size_t size)   
    {
        // All forward facing gear which manipulates internal state acquires the object lock
        MutexLock lock(getObjectLock());

        // No need to lock RandomPool - it provides its own
        RandomPool::GetSharedInstance().Reseed();

        // Reseed the SecureRandom object
        ASSERT(m_impl.get() != nullptr);
        m_impl->setSeedImpl(seed, size);
    }
// Adds an LP to the schedule queue, and returns the new mapped objId for it
int ThreadedTimeWarpMultiSetLTSF::addLP(int oldLockOwner)
{
	if( scheduleQScheme == "MULTISET" ) {
		lowestObjectPosition.push_back(scheduleQueue->end());
	} else if ( scheduleQScheme == "LADDERQ" ) {
		lowestLadderObjectPosition.push_back(ladderQ->end());
	} else if( scheduleQScheme == "SPLAYTREE" ) {
		lowestLadderObjectPosition.push_back(splayTree->end());
	} else {
		cout << "Invalid schedule queue scheme" << endl;
	}

	objectStatusLock.push_back(new LockState());
	if (oldLockOwner != -1) { // -1 if not locked
		getObjectLock(oldLockOwner, objectCount);
		cout << "Obtaining object lock on " << objectCount << endl;
	}

	// Expand array sizes
	return ++objectCount;
}
const Event* ThreadedTimeWarpMultiSetLTSF::peekIt(int threadId)
{
	const Event* ret = NULL;
	this->getScheduleQueueLock(threadId);

	if( scheduleQScheme == "MULTISET" ) {
		if (scheduleQueue->size() > 0) {
			utils::debug<<"( "<< threadId << " T ) Peeking from Schedule Queue"<<endl;

			ret = *(scheduleQueue->begin());
			//cout << "T" << threadId << ": Getting event with timestamp " << ret->getReceiveTime().getApproximateIntTime() << endl;
			unsigned int objId = LTSFObjId[ret->getReceiver().getSimulationObjectID()][0];
			utils::debug <<" ( "<< threadId << ") Locking the Object " <<objId <<endl;
	
			getObjectLock(threadId, objId);
			//remove the object out of schedule
			scheduleQueue->erase(scheduleQueue->begin());
			//set the indexer/pointer to NULL
			lowestObjectPosition[objId] = scheduleQueue->end();
			/*		utils::debug << "( "
		 	<< mySimulationManager->getSimulationManagerID()
		 	<< " ) Object - " << objId
		 	<< " is removed out for schedule by the thread - "
		 	<< threadId << "\n";*/
		}
	} else if ( scheduleQScheme == "LADDERQ" ) {
		if( !ladderQ->empty() ) {
			utils::debug<<"( "<< threadId << " T ) Peeking from Schedule Queue"<<endl;
			ret = ladderQ->dequeue();
			if(ret == NULL) {
				cout << "dequeue() func returned NULL" << endl;
				this->releaseScheduleQueueLock(threadId);
				return ret;
			}
			unsigned int newMinTime = ret->getReceiveTime().getApproximateIntTime();
			if ( newMinTime < minReceiveTime )
				cout << "Event received out of order" << endl;
			unsigned int objId = LTSFObjId[ret->getReceiver().getSimulationObjectID()][0];

			utils::debug <<" ( "<< threadId << ") Locking the Object " <<objId <<endl;

			this->getObjectLock(threadId, objId);

			//set the indexer/pointer to NULL
			lowestLadderObjectPosition[objId] = ladderQ->end();


		}
	} else if( scheduleQScheme == "SPLAYTREE" ) {
		if( splayTree->peekEvent() ) {
			utils::debug<<"( "<< threadId << " T ) Peeking from Schedule Queue"<<endl;
			if(NULL == (ret = splayTree->getEvent()) ) {
				cout << "getEvent() func returned NULL" << endl;
				this->releaseScheduleQueueLock(threadId);
				return ret;
			}
			unsigned int objId = LTSFObjId[ret->getReceiver().getSimulationObjectID()][0];

			utils::debug <<" ( "<< threadId << ") Locking the Object " <<objId <<endl;

			this->getObjectLock(threadId, objId);

			//set the indexer/pointer to NULL
			lowestLadderObjectPosition[objId] = splayTree->end();
		}
	} else {
		cout << "Invalid schedule queue scheme" << endl;
	}

	this->releaseScheduleQueueLock(threadId);
	return ret;
}