| 722 | } |
| 723 | |
| 724 | cs_error_t sam_finalize (void) |
| 725 | { |
| 726 | cs_error_t ret; |
| 727 | |
| 728 | ret = CS_OK; |
| 729 | |
| 730 | pthread_mutex_lock (&sam_internal_data.lock); |
| 731 | |
| 732 | if (sam_internal_data.internal_status != SAM_INTERNAL_STATUS_INITIALIZED && |
| 733 | sam_internal_data.internal_status != SAM_INTERNAL_STATUS_REGISTERED && |
| 734 | sam_internal_data.internal_status != SAM_INTERNAL_STATUS_STARTED) { |
| 735 | ret = CS_ERR_BAD_HANDLE; |
| 736 | goto exit_mutex_unlock; |
| 737 | } |
| 738 | |
| 739 | if (sam_internal_data.internal_status == SAM_INTERNAL_STATUS_STARTED) { |
| 740 | ret = sam_stop_nolock (); |
| 741 | if (ret != CS_OK) { |
| 742 | goto exit_mutex_unlock; |
| 743 | } |
| 744 | } |
| 745 | |
| 746 | sam_internal_data.internal_status = SAM_INTERNAL_STATUS_FINALIZED; |
| 747 | |
| 748 | free (sam_internal_data.user_data); |
| 749 | sam_internal_data.user_data = NULL; |
| 750 | sam_internal_data.user_data_allocated = 0; |
| 751 | sam_internal_data.user_data_size = 0; |
| 752 | |
| 753 | exit_mutex_unlock: |
| 754 | pthread_mutex_unlock (&sam_internal_data.lock); |
| 755 | |
| 756 | return (ret); |
| 757 | } |
| 758 | |
| 759 | cs_error_t sam_mark_failed (void) |
| 760 | { |