Skip to content
This repository has been archived by the owner on Mar 3, 2023. It is now read-only.

Commit

Permalink
Fix most of the sef fault by deleting C++ object on exit of context m…
Browse files Browse the repository at this point in the history
…anager. Update unittests.
  • Loading branch information
xlz-jbleclere committed Jan 10, 2022
1 parent 35ba3ab commit 3542d41
Show file tree
Hide file tree
Showing 14 changed files with 346 additions and 166 deletions.
1 change: 1 addition & 0 deletions include/accelize/drm/ParameterKey.def
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,4 @@ PARAMETERKEY_ITEM( num_license_loaded ) ///< Read-only, read the num
PARAMETERKEY_ITEM( derived_product ) ///< Read-write, read and write the derived product information with the format: "vendor/library/name"
PARAMETERKEY_ITEM( ws_connection_timeout ) ///< Read-(write), read (and write) the maximum period of time in seconds for the client to connect to the server. Can be set only from configuration file (no override from user's code)
PARAMETERKEY_ITEM( log_ctrl_verbosity ) ///< Read-write, read and write the logging verbosity on the stdout/stderr: 0=trace, 4=error
PARAMETERKEY_ITEM( is_drm_software ) ///< Read-only, indicate if DRM Controller is software (1) or hardware (0)
9 changes: 8 additions & 1 deletion python/src/_accelize_drm.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -152,15 +152,22 @@ cdef class DrmManager:
except RuntimeError as exception:
_handle_exceptions(exception)

def __dealloc__(self):
def free(self):
if self._drm_manager is NULL:
return
with nogil:
del self._drm_manager
self._drm_manager = NULL

def __dealloc__(self):
self.free()

def __enter__(self):
return self

def __exit__(self, exc_type, exc_val, exc_tb):
self.deactivate()
self.free()

def activate(self, const bool resume_session_request=False):
"""
Expand Down
7 changes: 6 additions & 1 deletion python/src/_accelize_drmc.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -152,20 +152,25 @@ cdef class DrmManager:
if return_code:
_raise_from_error(self._drm_manager.error_message, return_code)

def __dealloc__(self):
def free(self):
if self._drm_manager is NULL:
return
cdef int return_code
with nogil:
return_code = DrmManager_free(&self._drm_manager)
self._drm_manager = NULL
if return_code:
_raise_from_error(self._drm_manager.error_message, return_code)

def __dealloc__(self):
self.free()

def __enter__(self):
return self

def __exit__(self, exc_type, exc_val, exc_tb):
self.deactivate()
self.free()

def activate(self, const bint resume_session_request=False):
"""
Expand Down
12 changes: 10 additions & 2 deletions source/drm_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1849,7 +1849,7 @@ std::cout << "pnc_session_request ret = " << ret << std::endl;
}

if ( mIsHybrid ){
Debug( "SW DRM Controller: no frequency detection is performed (method 4)" );
Debug( "SW DRM Controller: no frequency detection is performed" );
mFreqDetectionMethod = 0;
mBypassFrequencyDetection = true;
mFrequencyCurr = 0.001;
Expand Down Expand Up @@ -2481,6 +2481,8 @@ std::cout << "pnc_session_request ret = " << ret << std::endl;
{
TRY
Debug( "Calling Impl public constructor" );
if ( f_user_asynch_error )
f_asynch_error = f_user_asynch_error;
mIsHybrid = pnc_initialize_drm_ctrl_ta();
if ( mIsHybrid ) {
// Set logging
Expand All @@ -2499,7 +2501,6 @@ std::cout << "pnc_session_request ret = " << ret << std::endl;
f_read_register = f_user_read_register;
f_write_register = f_user_write_register;
}
f_asynch_error = f_user_asynch_error;
if ( !f_read_register )
Throw( DRM_BadArg, "Read register callback function must not be NULL. " );
if ( !f_write_register )
Expand Down Expand Up @@ -2988,6 +2989,13 @@ std::cout << "pnc_session_request ret = " << ret << std::endl;
logVerbosity );
break;
}
case ParameterKey::is_drm_software: {
bool is_drm_sw = mIsHybrid;
json_value[key_str] = is_drm_sw;
Debug( "Get value of parameter '{}' (ID={}): {}", key_str, key_id,
is_drm_sw );
break;
}
case ParameterKey::ParameterKeyCount: {
uint32_t count = static_cast<uint32_t>( ParameterKeyCount );
json_value[key_str] = count;
Expand Down
2 changes: 1 addition & 1 deletion tests/test_async_health.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ def test_health_retry_modification(accelize_drm, conf_json, cred_json,
wait_func_true(lambda: get_context()['exit'],
timeout=(retry_timeout+3) * 2)
drm_manager.deactivate()
error_gap = drm_manager.get('health_retry_sleep') + 1

async_cb.assert_NoError()
data_list = get_context()['data']
Expand All @@ -226,7 +227,6 @@ def test_health_retry_modification(accelize_drm, conf_json, cred_json,
start = data_list[0][1]
end = data_list[-1][2]
delta = parser.parse(end) - parser.parse(start)
error_gap = drm_manager.get('health_retry_sleep') + 1
assert retry_timeout - error_gap <= int(delta.total_seconds()) <= retry_timeout + error_gap
assert get_proxy_error() is None

Expand Down
15 changes: 11 additions & 4 deletions tests/test_controller_memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
from re import search, IGNORECASE


@pytest.mark.nosom
def test_wrong_drm_controller_address(accelize_drm, conf_json, cred_json, async_handle,
log_file_factory):
"""Test when a wrong DRM Controller offset is given"""
if accelize_drm.is_ctrl_sw:
pytest.skip("Test skipped on SoM target")

async_cb = async_handler.create()
async_cb.reset()
driver = accelize_drm.pytest_fpga_driver[0]
Expand Down Expand Up @@ -94,9 +96,11 @@ def test_mailbox_type_error(accelize_drm, conf_json, cred_json, async_handler,
async_cb.reset()


@pytest.mark.nosom
def test_empty_product_id(accelize_drm, conf_json, cred_json, async_handler, log_file_factory):
"""Test error with a design having an empty Product ID"""
if accelize_drm.is_ctrl_sw:
pytest.skip("Test skipped on SoM target")

refdesign = accelize_drm.pytest_ref_designs
driver = accelize_drm.pytest_fpga_driver[0]
fpga_image_bkp = driver.fpga_image
Expand Down Expand Up @@ -130,9 +134,11 @@ def test_empty_product_id(accelize_drm, conf_json, cred_json, async_handler, log
logfile.remove()


@pytest.mark.nosom
def test_malformed_product_id(accelize_drm, conf_json, cred_json, async_handler):
"""Test error with a design having a malformed Product ID"""
if accelize_drm.is_ctrl_sw:
pytest.skip("Test skipped on SoM target")

refdesign = accelize_drm.pytest_ref_designs
driver = accelize_drm.pytest_fpga_driver[0]
fpga_image_bkp = driver.fpga_image
Expand Down Expand Up @@ -192,9 +198,10 @@ def test_2_drm_manager_concurrently(accelize_drm, conf_json, cred_json, async_ha


@pytest.mark.hwtst
@pytest.mark.nosom
def test_drm_manager_bist(accelize_drm, conf_json, cred_json, async_handler):
"""Test register access BIST"""
if accelize_drm.is_ctrl_sw:
pytest.skip("Test skipped on SoM target")

driver = accelize_drm.pytest_fpga_driver[0]
async_cb = async_handler.create()
Expand Down
3 changes: 2 additions & 1 deletion tests/test_drm_bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@ def stringify(h):


@pytest.mark.awsxrt
@pytest.mark.nosom
def test_vitis_1activator_125_som(accelize_drm, async_handler, log_file_factory):
"""
Test drm controller bridge used for SoM projects: single clock at 125MHz
"""
if accelize_drm.is_ctrl_sw:
pytest.skip("Test skipped on SoM target")
# Program board with design
design_name = 'vitis_1activator_125_som'
ref_designs = accelize_drm.pytest_ref_designs
Expand Down
Loading

0 comments on commit 3542d41

Please sign in to comment.