deepstreamIO / deepstream.io-client-java

The Java/Android Client for deepstream.io
Other
35 stars 38 forks source link

getRecord() method hangs on simultaneous request. #137

Open zebpaynikunj opened 5 years ago

zebpaynikunj commented 5 years ago

` @ObjectiveCName("getRecord:") public Record getRecord( String name ) { Record record = null;

    recordsLock.lock();
    try {
        record = records.get( name );
        if( record == null ) {
            record = createRecord(name);
            recordsLock.unlock();
            record.start();
        } else if (record.getAndIncrementUsage() <= 0) {
            // Some other thread is discarding this record. We need the record out of the records
            // map before we can put the new record there so we will finish the discard here. Either this
            // thread or the other thread will end up finishing the discard.
            record.finishDiscard();

            assert records.get(name) == null;
            record = createRecord(name);
            recordsLock.unlock();
            record.start();
        }
    } finally {
        if (recordsLock.isHeldByCurrentThread()) {
            recordsLock.unlock();
        }
    }

    if (!record.isReady()) {
        final CountDownLatch readyLatch = new CountDownLatch(1);
        record.whenReady(new Record.RecordReadyListener() {
            @Override
            public void onRecordReady(String recordName, Record record) {
                readyLatch.countDown();
            }
        });
        try {
            readyLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    return record;
}`

this method does not return record object when more than one thread tried to access it.