/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* bos720 src/bos/usr/include/arm4ewlm.h 1.6 */ /* */ /* Licensed Materials - Property of IBM */ /* */ /* COPYRIGHT International Business Machines Corp. 2003 */ /* All Rights Reserved */ /* */ /* US Government Users Restricted Rights - Use, duplication or */ /* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ /* */ /* IBM_PROLOG_END_TAG */ /* @(#)91 1.6 src/bos/usr/include/arm4ewlm.h, sysewlm, bos720 4/26/04 09:25:13 */ /* * COMPONENT_NAME: sysewlm * * ORIGINS: 27 */ #ifndef _H_EWLM_ARM4EWLM #define _H_EWLM_ARM4EWLM #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #define EWLM_SUBBUFFER_SOCKET_INFO -30000 #define EWLMARM_ACCEPTQ_CLASSIFY_OUTPUT_SIZE 32 typedef arm_int16_t ewlm_hopcount_t; typedef arm_int16_t ewlm_classification_id_t; typedef arm_uint8_t ewlm_netclass_t; typedef arm_int64_t ewlm_socket_desc_t; typedef arm_int32_t ewlm_boolean_t; typedef struct ewlm_subbuffer_socket_info { arm_subbuffer_t header; ewlm_boolean_t nc_valid; ewlm_socket_desc_t socket_desc; ewlm_netclass_t opaque[EWLMARM_ACCEPTQ_CLASSIFY_OUTPUT_SIZE]; } ewlm_subbuffer_socket_info_t; arm_error_t ewlm_classify_correlator( arm_app_start_handle_t app_handle, arm_id_t *tran_id, arm_int32_t flags, arm_buffer4_t *buffer4, arm_correlator_t *classify_correlator); typedef arm_error_t (* ewlm_classify_correlator_t)( arm_app_start_handle_t app_handle, arm_id_t *tran_id, arm_int32_t flags, arm_buffer4_t *buffer4, arm_correlator_t *classify_correlator); /* ------------------------------------------------------------------------- */ /* -------------------- EWLM ARM4 adapter services section ----------------- */ /* ------------------------------------------------------------------------- */ #define EWLM_ADAPTER_API_DYNAMIC(type) type #define EWLM_ADAPTER_API_CALL #define EWLM_AGENT_TRACE (0x00000001) #define EWLM_CORR_SUFFIX_MAX_LENGTH 128 typedef arm_int32_t ewlm_adap_error_t; typedef arm_uint64_t ewlm_time_t; typedef arm_correlator_length_t ewlm_pcorr_suffoffset_t; typedef arm_uint8_t ewlm_corr_suffix_len_t; typedef struct ewlm_correlator_suffix { arm_uint8_t opaque[EWLM_CORR_SUFFIX_MAX_LENGTH]; } ewlm_correlator_suffix_t; typedef ewlm_correlator_suffix_t ewlm_corr_suffix_t; typedef struct ewlm_ad_start_tran_inparms{ arm_app_start_handle_t app_handle; arm_id_t *tran_id; arm_correlator_t *parent_correlator; ewlm_pcorr_suffoffset_t pcorr_suffix_offset; arm_tran_start_handle_t start_handle; ewlm_time_t ewlm_time; ewlm_classification_id_t tran_class_id; ewlm_hopcount_t hop_count; arm_int32_t flags; arm_buffer4_t *buffer4; } ewlm_ad_start_tran_inparms_t; typedef struct ewlm_ad_generate_correlator_inparms{ arm_app_start_handle_t app_handle; arm_id_t *tran_id; arm_correlator_t *parent_correlator; ewlm_pcorr_suffoffset_t pcorr_suffix_offset; arm_int32_t flags; arm_buffer4_t *buffer4; } ewlm_ad_generate_correlator_inparms_t; typedef struct ewlm_ad_register_metric_inparms{ arm_id_t *app_id; arm_char_t *name; arm_metric_format_t format; arm_metric_usage_t usage; arm_char_t *unit; arm_id_t *input_metric_id; arm_int32_t flags; arm_buffer4_t *buffer4; } ewlm_ad_register_metric_inparms_t; typedef struct ewlm_ad_report_tran_inparms{ arm_app_start_handle_t app_handle; arm_id_t *tran_id; arm_int32_t tran_status; arm_int64_t response_time; arm_stop_time_t stop_time; arm_correlator_t *parent_correlator; ewlm_pcorr_suffoffset_t pcorr_suffix_offset; arm_correlator_t *current_correlator; ewlm_pcorr_suffoffset_t ccorr_suffix_offset; arm_int32_t flags; arm_buffer4_t *buffer4; } ewlm_ad_report_tran_inparms_t; /* ------------------------------------------------------------------------- */ /* --------------------- EWLM ARM4 Adapter API section --------------------- */ /* ------------------------------------------------------------------------- */ EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_register_application( arm_id_t *input_app_id, arm_char_t *app_name, arm_id_t *app_id, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_register_transaction( arm_id_t *input_tran_id, arm_id_t *app_id, arm_char_t *tran_name, arm_id_t *tran_id, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_start_application( arm_id_t *app_id, arm_app_start_handle_t app_handle, arm_char_t *app_group_name, arm_char_t *app_instance_name, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_start_transaction( ewlm_ad_start_tran_inparms_t *inparms, arm_int32_t *out_flags, ewlm_corr_suffix_len_t *corr_suffix_len, ewlm_corr_suffix_t *corr_suffix); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_block_transaction( arm_tran_start_handle_t start_handle, arm_tran_block_handle_t block_handle, ewlm_time_t ewlm_time, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_unblock_transaction( arm_tran_start_handle_t start_handle, arm_tran_block_handle_t block_handle, ewlm_time_t ewlm_time, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_stop_transaction( arm_tran_start_handle_t start_handle, arm_int32_t tran_status, ewlm_time_t ewlm_time, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_discard_transaction( arm_tran_start_handle_t start_handle, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_stop_application( arm_app_start_handle_t app_handle, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_destroy_application( arm_id_t *app_id, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_bind_thread( arm_tran_start_handle_t start_handle, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_unbind_thread( arm_tran_start_handle_t start_handle, arm_int32_t flags, arm_buffer4_t *buffer4); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_generate_correlator( ewlm_ad_generate_correlator_inparms_t *inparms, arm_int32_t *out_flags, ewlm_corr_suffix_len_t *corr_suffix_len, ewlm_corr_suffix_t *corr_suffix); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_register_metric( ewlm_ad_register_metric_inparms_t *inparms, arm_id_t *output_metric_id); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_report_transaction( ewlm_ad_report_tran_inparms_t *inparms); EWLM_ADAPTER_API_DYNAMIC(ewlm_adap_error_t) adap_update_transaction( arm_tran_start_handle_t start_handle, arm_int32_t flags, arm_buffer4_t *buffer4); /* ------------------------------------------------------------------------- */ /* ------------------ EWLM ARM4 Adapter function pointers------------------- */ /* ------------------------------------------------------------------------- */ /* register meta data API function pointer types */ typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_register_application_t)( arm_id_t *input_app_id, arm_char_t *app_name, arm_id_t *app_id, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_register_transaction_t)( arm_id_t *input_tran_id, arm_id_t *app_id, arm_char_t *tran_name, arm_id_t *tran_id, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_start_application_t)( arm_id_t *app_id, arm_app_start_handle_t app_handle, arm_char_t *app_group_name, arm_char_t *app_instance_name, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_start_transaction_t)( ewlm_ad_start_tran_inparms_t *imparms, arm_int32_t *out_flags, ewlm_corr_suffix_len_t *corr_suffix_len, ewlm_corr_suffix_t *corr_suffix); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_block_transaction_t)( arm_tran_start_handle_t start_handle, arm_tran_block_handle_t block_handle, ewlm_time_t ewlm_time, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_unblock_transaction_t)( arm_tran_start_handle_t start_handle, arm_tran_block_handle_t block_handle, ewlm_time_t ewlm_time, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_stop_transaction_t)( arm_tran_start_handle_t start_handle, arm_int32_t tran_status, ewlm_time_t ewlm_time, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_discard_transaction_t)( arm_tran_start_handle_t start_handle, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_stop_application_t)( arm_app_start_handle_t app_handle, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_destroy_application_t)( arm_id_t *app_id, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_bind_thread_t)( arm_tran_start_handle_t start_handle, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_unbind_thread_t)( arm_tran_start_handle_t start_handle, arm_int32_t flags, arm_buffer4_t *buffer4); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_generate_correlator_t)( ewlm_ad_generate_correlator_inparms_t *inparms, arm_int32_t *out_flags, ewlm_corr_suffix_len_t *corr_suffix_len, ewlm_corr_suffix_t *corr_suffix); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_register_metric_t)( ewlm_ad_register_metric_inparms_t *inparms, arm_id_t *output_metric_id); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_report_transaction_t)( ewlm_ad_report_tran_inparms_t *inparms); typedef ewlm_adap_error_t (EWLM_ADAPTER_API_CALL* adap_update_transaction_t)( arm_tran_start_handle_t start_handle, arm_int32_t flags, arm_buffer4_t *buffer4); /* ------------------------------------------------------------------------- */ /* --------------------- ARM4 Services Return Codes ------------------------ */ /* ------------------------------------------------------------------------- */ /* * Successful ARM service return codes are positive values. */ /* Successful ARM service completion */ #define ARM_RC_SUCCESS (0) /* #define EWLM_IRC_ARM_RANGE_START (1000) */ /* Successful arm_start_application with an application specified * system address subbuffer. EWLM does not capture data or manage * such applications */ #define ARM_RC_SYSADDR (1000) /* An ewlm_classify_correlator() created parent correlator was * ignored because the parent correlator was created with a * different EWLM policy than is currently active on the system. * Application should call ewlm_classify_correlator() again to * get a new pre-classified parent correlator for the current * EWLM policy. */ #define ARM_RC_CLASSIFY_CORR_IGNORED (1001) /* #define EWLM_IRC_ARM_RANGE_END (1999) */ /* * Unsuccessful ARM service return codes are negative values. */ /* #define EWLM_RC_ARM_RANGE_START (-1000) */ /* Application name missing or too long */ #define ARM_RC_APPL_NAME (-1001) /* Application group name too long */ #define ARM_RC_GRP_NAME (-1002) /* Application instance name too long */ #define ARM_RC_APPL_INST_NAME (-1003) /* Transaction name missing or too long */ #define ARM_RC_TRAN_NAME (-1004) /* Property name too long */ #define ARM_RC_PROP_NAME (-1005) /* Too many property names Some platforms may wish to treat negative property counts the same as zero*/ #define ARM_RC_PROP_NAME_MAX (-1006) /* Property value too long */ #define ARM_RC_PROP_VAL (-1007) /* URI name too long */ #define ARM_RC_URI_NAME (-1008) /* User name too long */ #define ARM_RC_USERNAME (-1009) /* Invalid negative buffer4 count */ #define ARM_RC_BUFFER4_COUNT (-1010) /* Invalid handle or id output address */ #define ARM_RC_HANDLE_ADDR (-1011) /* Invalid correlator output address */ #define ARM_RC_CORR_ADDR (-1012) /* Undefined flags bits specified */ #define ARM_RC_FLAGS_UNDEFINED (-1013) /* Invalid transaction status */ #define ARM_RC_TRAN_STATUS_INVALID (-1014) /* Calling process is not using ARM, it did not register an application */ /* Common team editorial: This is used by AIX for cases where an input ID or handle fails to resolve to an expected control structure. The essence is that the caller is therefore not a legitimate ARM API user. */ #define ARM_RC_NOT_USING_ARM (-1015) /* Registered application id does not exist in the calling process */ #define ARM_RC_REGAPP_ID (-1016) /* Started application handle does not exist in the calling process */ #define ARM_RC_STARTAPP_HANDLE (-1017) /* Registered transaction id does not exist in the calling process */ #define ARM_RC_REGTRAN_ID (-1018) /* Transaction handle does not exist in the calling process */ #define ARM_RC_TRAN_HANDLE (-1019) /* Block handle does not exist */ #define ARM_RC_BLOCK_HANDLE (-1020) /* Calling process is not authorized to use ARM */ #define ARM_RC_AUTH_ERROR (-1021) /* Maximum number of registered applications exceeded */ #define ARM_RC_REGAPP_MAX (-1022) /* Maximum number of started applications exceeded */ #define ARM_RC_STARTAPP_MAX (-1023) /* Maximum number of registered transactions exceeded */ #define ARM_RC_REGTRAN_MAX (-1024) /* Maximum number of started transactions exceeded */ #define ARM_RC_TRAN_MAX (-1025) /* Maximum number of registered applications per process exceeded */ #define ARM_RC_REGAPP_PROC_MAX (-1026) /* Maximum number of started applications per process exceeded */ #define ARM_RC_STARTAPP_PROC_MAX (-1027) /* Maximum number of registered transactions per process exceeded */ #define ARM_RC_REGTRAN_PROC_MAX (-1028) /* Maximum number of started transactions per process exceeded */ #define ARM_RC_TRAN_PROC_MAX (-1029) /* Maximum number of blocked threads per transaction exceeded */ #define ARM_RC_BLOCKED_MAX (-1030) /* Maximum ARM services memory limit exceeded */ #define ARM_RC_MAXMEM (-1031) /* Process or system out of memory */ #define ARM_RC_ENOMEM (-1032) /* Correlator size is not valid */ #define ARM_RC_CORR_BAD_SIZE (-1033) /* System Address buffer was provided */ /* Common team editorial: This is used for cases of arm_start_transaction() or ewlm_classify_correlator() when the started application instance associated with the input application handle is for out of process transactions (i.e., had a system address sub-buffer specified on the arm_start_application() call. */ #define ARM_RC_SYSADDR_BUFFER (-1034) /* This API is not functionally supported by EWLM */ #define ARM_RC_ENOSUPP (-1035) /* ARM support not enabled */ #define ARM_RC_NOT_ENABLED (-1036) /* ARM adapter processing failed */ #define ARM_RC_ADAP_FAIL (-1037) /* Unsupported character set */ #define ARM_RC_UNSUP_CHARSET (-1038) /* Unable to open character set coverter */ /* Common team editorial: AIX uses this when its libarm4 Init routine, following a load, is unable to successfully load its character set conversion program. Other platforms may or may not have this consideration. */ #define ARM_RC_CONVERT_INVAL (-1039) /* Invalid string to convert */ #define ARM_RC_INVAL_STRING (-1040) /* URI mismatch between transaction identity and context */ #define ARM_RC_URI_MISMATCH (-1041) /* An invalid NULL ARM parameter was detected */ /* Common team editorial: This return code applies to all situations where a string argument is required but not provided by the application. Examples of this are a null correlator specified on arm_get_correlator_flags(), arm_get_correlator_length() and arm_generate_correlator(), to name a few. DO NOT use this return code for the cases of missing application name on arm_register_application()(use -1001), or missing transaction name on arm_register_transaction() (use -1004). */ #define ARM_RC_NULL_PARM (-1042) /* Invalid correlator flag number */ #define ARM_RC_CORR_FLAGNUM (-1043) /* Invalid metric format */ /* Common team editorial: AIX has chosen to validate the arm_register_metric() API arguments. EWLM ARM implementations are not required to perform this validation, but if any platform chooses to do so, please conform to the following ARM_RC_METRIC_* return code uses. */ #define ARM_RC_METRIC_FORMAT (-1044) /* Invalid metric usage */ #define ARM_RC_METRIC_USAGE (-1045) /* Invalid metric name */ #define ARM_RC_METRIC_NAME (-1046) /* Invalid metric unit */ #define ARM_RC_METRIC_UNIT (-1047) /* No active EWLM agent or policy. */ /* Common team editorial: This return code is only applicable to ewlm_classify_correlator() for the case where there is not sufficient EWLM info/policy to derive a classify correlator. */ #define ARM_RC_NO_EWLM_AGENT (-1048) /* unexpected exception */ #define ARM_RC_INTERNAL_PROBLEM (-1049) #define ARM_RC_INITIALIZATION_ERROR (-1050) /* May be used by some platforms for any negative or greater than ARM_PROPERTY_MAX_COUNT value */ #define ARM_RC_INVALID_PROPERTY_COUNT (-1051) /* Mismatch between property names and property values */ #define ARM_RC_VALUE_NAME_MISMATCH (-1052) /* NULL pointer passed when identity property count is greater than zero */ #define ARM_RC_BAD_ID_PROP_ARRAY_PTR (-1053) /* NULL pointer passed when context property count is greater than zero */ #define ARM_RC_BAD_CTX_PROP_ARRAY_PTR (-1054) /* NULL pointer passed when subbuffer count is greater than zero */ #define ARM_RC_BAD_SUBBUFFER_ARRAY_PTR (-1055) /* Maximum number of bind threads per transaction exceeded */ #define ARM_RC_BIND_MAX (-1056) /* Improperly formatted subbuffer/invalid subbuffer */ #define ARM_RC_SUBBUFFER (-1058) /* The maximum number of ID subbuffers has been exceeded */ #define ARM_RC_MAX_ID_COUNT (-1066) /* Maximum number of application instance/transaction class combinations has been exceeded */ #define ARM_RC_AI_TC_MAX (-1067) /* #define EWLM_RC_ARM_RANGE_END (-1999) */ /* * The return codes below are for implementation internal errors. * They should not occur if the ARM application uses the system * provided libarm4 library. * * The values within the range -2000 to -2999 are reserved for AIX * specific circumstances. The range -1000 to -1999 is for common, * cross platform return codes. */ /* Invalid buffer type passed to syscall routine */ #define ARM_RC_INT_BADTYPE (-2000) /* Invalid buffer length passed to syscall routine */ #define ARM_RC_INT_BUF_LEN (-2001) /* Invalid buffer address passed to syscall routine */ #define ARM_RC_INT_BUF_ADDR (-2002) /* Invalid group name offset into buffer */ #define ARM_RC_INT_GRP_OFFSET (-2003) /* Invalid instance name offset into buffer */ #define ARM_RC_INT_INST_OFFSET (-2004) /* Invalid tranclass name offset into buffer */ #define ARM_RC_INT_TRAN_TYPE_OFFSET (-2005) /* Invalid property name offset into buffer */ #define ARM_RC_INT_PROP_OFFSET (-2006) /* Invalid property value offset into buffer */ #define ARM_RC_INT_PROP_VAL_OFFSET (-2007) /* Invalid uri offset into buffer */ #define ARM_RC_INT_URI_OFFSET (-2008) /* Internal error 0 */ #define ARM_RC_INT_ERROR_0 (-2009) /* Internal error in character set encoding */ #define ARM_RC_CHARSET_INT_ERROR_0 (-2010) /* Invalid application offset into buffer */ #define ARM_RC_INT_APP_OFFSET (-2011) /* Invalid buffer4 offset into buffer */ #define ARM_RC_INT_BUF4_OFFSET (-2012) /* Invalid buffer length */ #define ARM_RC_INT_BUF4_LEN (-2013) /* Invalid context table offset into buffer */ #define ARM_RC_INT_CTX_TBL_OFFSET (-2014) /* Invalid context table length */ #define ARM_RC_INT_CTX_TBL_LEN (-2015) /* Invalid system address offset into buffer */ #define ARM_RC_INT_ADDR_OFFSET (-2016) /* Invalid system address length */ #define ARM_RC_INT_ADDR_LEN (-2017) /* Invalid identity offset into buffer */ #define ARM_RC_INT_IDENT_OFFSET (-2018) /* Invalid identity length */ #define ARM_RC_INT_IDENT_LEN (-2019) /* Invalid correlator offset into buffer */ #define ARM_RC_INT_CORR_OFFSET (-2020) /* Invalid user offset into buffer */ #define ARM_RC_INT_USER_OFFSET (-2021) /* Invalid user length into buffer */ #define ARM_RC_INT_USER_LEN (-2022) /* Invalid user name offset into buffer */ #define ARM_RC_INT_USERNAME_OFFSET (-2023) /* Invalid time offset into buffer */ #define ARM_RC_INT_TIME_OFFSET (-2024) /* Invalid property table offset into buffer */ #define ARM_RC_INT_PROP_TBL_OFFSET (-2025) /* Property values are present, but not the names */ #define ARM_RC_INT_PROP_TBL_EINVAL (-2026) /* Invalid property table length */ #define ARM_RC_INT_PROP_TBL_LEN (-2027) /* Correlator creation internal failure */ #define ARM_RC_INT_CORR_CREATION (-2028) /* Invalid adapter buffer address provided to syscall */ #define ARM_RC_INT_ADAPBUF_ADDR (-2029) /* Undefined flags bits specified in internal flags */ #define ARM_RC_INT_FLAGS_UNDEFINED (-2030) /* Classification internal failure */ #define ARM_RC_INT_CLASSIFY_FAIL (-2031) /* * Return codes -20000 through -20999 inclusive are reserved * by the ARM4 standard for possible future standard use */ #define ARM4_RC_RESERVED_RANGE_START (-20000) #define ARM4_RC_RESERVED_RANGE_END (-20999) #ifdef __cplusplus } #endif #endif