我在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。這是一個很好的做法嗎?
我也嘗試過使用自定義文件源組件作爲源代碼。除非我發送「停止()」的流結束,否則會發生同樣的問題。