2017-05-10 48 views
0

我在CentOS 7上使用REDHAWK 2.1.0,並在Python沙盒中使用ossie.utils.sb運行組件。自REDHAWK 2.1.0發佈組件以來的問題

有時當我調用「component.releaseObject()」時,它只是掛起。 releaseObject的C++實現實際上不會被調用。在以前的REDHAWK版本中沒有遇到過這種情況。

該設置是連接到某個組件的rh.SigGen。只有當SigGen上的「sri_blocking」設置爲True,並且連接組件在serviceFunction()中花費更多時間時,纔會出現此問題。

當rh.FileReader是源代碼時,我不會得到同樣的問題。我很好奇,如果這是與組件停止時結束流的FileReader相關。 SigGen不會結束當前流。

我創建了一個test_component,帶有一個屬性「delay」。它的serviceFunction()如下所示:

bulkio::InFloatPort::dataTransfer *pkt = dataFloat_in->getPacket(bulkio::Const::NON_BLOCKING); 

if (not pkt) { 
    return NOOP; 
} 

if (pkt->sriChanged) { 
    dataFloat_out->pushSRI(pkt->SRI); 
} 

if (pkt->inputQueueFlushed) { 
    LOG_WARN(test_component_i, "INPUT QUEUE FLUSHED!"); 
} 

usleep(delay); 

dataFloat_out->pushPacket(&pkt->dataBuffer[0], pkt->dataBuffer.size(), pkt->T, pkt->EOS, pkt->streamID); 

delete pkt; 
return NORMAL; 

延遲用於模擬處理的時間長度。在我的情況下,當使用SigGen作爲源時,100次使用延遲導致下面的腳本完全退出。然而,1000微秒導致了第一個「releaseObject()」呼叫掛起:

#!/usr/bin/python 

from ossie.utils import sb 
import numpy as np 


def setupSigGen(): 
    c = sb.launch('rh.SigGen') 
    c.sri_blocking = True 
    c.throttle = False 
    c.xfer_len = 10000 
    return c, 'dataFloat_out' 


def setupFileReader(): 
    np.array(range(10000), dtype=np.float).tofile('/tmp/fileReaderInput.32f') 
    c = sb.launch('rh.FileReader') 
    c.advanced_properties.throttle_rate = '-1' 
    c.advanced_properties.ignore_header_metadata = True 
    c.advanced_properties.looping = True 
    c.sample_rate = '1Gsps' 
    c.file_format = 'FLOAT' 
    c.source_uri = 'file:///tmp/fileReaderInput.32f' 
    return c, 'dataFloat_out' 


def startSigGen(c): 
    c.start() 


def startFileReader(c): 
    c.start() 
    c.playback_state = 'PLAY' 


def setupComp(config=None): 
    c = sb.launch('test_component') 
    if config is not None: 
     c.configure(config) 
    return c, 'dataFloat_in' 


if __name__ == '__main__': 
    import argparse 

    parser = argparse.ArgumentParser() 

    parser.add_argument(
     '-f', 
     '--use-file-reader', 
     default = False, 
     action = 'store_true') 

    parser.add_argument(
     '-d', 
     '--delay', 
     type = int, 
     default = 1000) 

    args = parser.parse_args() 

    if args.use_file_reader == True: 
     setupSource = setupFileReader 
     startSource = startFileReader 
     print 'Using rh.FileReader' 
    else: 
     setupSource = setupSigGen 
     startSource = startSigGen 
     print 'Using rh.SigGen' 
    src, usesPortName = setupSource() 
    comp, providesPortName = setupComp({'delay': args.delay}) 
    src.connect(comp, 
       usesPortName=usesPortName, 
       providesPortName=providesPortName) 
    comp.start() 
    startSource(src) 
    raw_input('Enter any key to stop...') 
    src.stop() 
    comp.stop() 
    src.releaseObject() # <--- hangs here when src is an rh.SigGen 
    comp.releaseObject() 

如果我刪除了「停止()」調用,而不是僅僅用「releaseObject()」,那麼腳本還完全退出。

就實現源組件而言,這是否意味着源組件應該發送「stop()」結束流? (「stop()」總是指STOP,還是可能是暫停?)rh.FileReader使用「playback_state」屬性來提供PAUSING。這是一個很好的做法嗎?

我也嘗試過使用自定義文件源組件作爲源代碼。除非我發送「停止()」的流結束,否則會發生同樣的問題。

回答

0

所示的場景無疑會鎖定。問題是當沙箱在發佈之前清理組件時,test_component的輸入隊列已滿(並且未被服務)。作爲清理的一部分,沙箱會斷開組件的連接。作爲斷開連接的一部分,端口基類將發送EOS設置爲true的零長度數據包,以指示流已完成;該通話被鎖定。推動組件或沙箱的組件都不會超時,從而導致鎖定狀態。這只是沙盒問題,不應該是運行域的問題。

在REDHAWK 2.1.0中,我建議在停止數據源組件後設置睡眠。這應該清空隊列(您只需要一個空插槽),並且可以爲與斷開連接關聯的呼叫提供服務。

此問題已在REDHAWK 2.1.1中修復(https://github.com/redhawksdr/redhawk/releases/tag/2.1.1