[Asterisk-code-review] RFC ONLY: Module Loader Rewrite (asterisk[master])
Corey Farrell
asteriskteam at digium.com
Mon Jun 1 05:23:20 CDT 2015
Corey Farrell has uploaded a new change for review.
https://gerrit.asterisk.org/557
Change subject: RFC ONLY: Module Loader Rewrite
......................................................................
RFC ONLY: Module Loader Rewrite
This is a work in progress, it's not nearly ready for merge. I'm looking
to determine if this is a reasonable direction to pursue or if this should
be abandoned. Until that is decided, a detailed line by line review is
possibly a waste of time. If it is decided to proceed I will do what I
can to break this into multiple smaller changes.
The first decision to be made is if the scheme of ao2_weakproxy use should
be pursued further. This implementation makes heavy use of weakproxies to
control lifetime of module instances (running) and module libs (loaded).
The second decision should be regarding the new api_registry.c and
api_registry.h. This is used by a few sources that allow modules to
register interfaces. Proper use of api_registry should provide complete
protection against races involving use of an interface from a module that
is unloading. The registry automates unregistration when used by modules.
All module references in the core have been updated to use the new module
referencing scheme, but this is only a half fix. To fully fix most will
need to handle module references the way api_registry does, or be updated
to use API registry.
One complaint I have about api_registry is the way that it requires holding
two variables for holder + interface, or using an awkward macro to access
the interface through the holder. I'm open to ideas of how to solve this.
-------------------------------------
A slightly outdated wiki page exists:
https://wiki.asterisk.org/wiki/display/~coreyfarrell/Module+Loader+Ideas
This wiki has not been updated since I split reference counting of dlopen
handles from the reference counting of module instance objects. Some of
the section about module loading / unloading is inaccurate and some items
in the problems section have been addressed. See TODO section of this
commit message for the current known issues.
-------------
Build System:
* Add support for building of module manifest files.
* Add filters for menuselect-tree to hide elements that are not understood
by menuselect.
* Add module checksum to verify that a module.so and module.manifest where
built from the same sources.
Loader:
* Read all manifest files at startup, resolve dependencies.
* Implement module library and instance reference counted lifetime.
* Remove preload functionality. This is to be replaced by integration of
realtime drivers with module autoload functionality.
* Automatic, atomic and thread safe unregistration using api_registry.
- Config Engines
- Dialplan Functions
- Message Technologies
- PBX Switches
- RTP Engine's
- Timing Interfaces
* Automatic unregistration, these items still have some thread safety
issues, I believe no worse than previous versions of Asterisk:
- Bridge Technologies
- Channel Technologies
- CLI commands
- Device State Providers
- Dialplan Applications
- Format Definitions
- Manager actions
- PJSIP Service Modules
- RTP Glue
- Sorcery Wizards
- Tests
- Translators
* Automatic module instance references:
- Datastores
Core:
* Created api_registry make creation of interface registrar's simple, safe
and consistant.
* Modify astobj2 handling of ref_log shutdown to compensate for the fact
that references can be left open until very late in the exit process, in
some cases after atexit and __attribute__((destructor)) functions run.
System Wide:
* Update MODULEINFO and AST_MODULE_INFO blocks.
* Use uniform function names for module callbacks:
- load_module, reload_module, unload_module
* Remove module cleanup from all load_module error handling. unload_module
is always called before the module is closed.
* Remove checks for other loaded modules from all module loads. This is no
longer needed since the module loader takes care of it, and does a better
job.
* Remove redundant module references. For example res_pjsip registration
functions no longer add a reference to res_pjsip, the module calling that
registration is expected to already have an automatic reference to
res_pjsip due to the dependency.
* Remove all uses of ast_module_unref(AST_MODULE_SELF). This is not safe.
* Switch unload_module to 'void' return. ast_module_block_unload is now
used in cases where an error is detected during unload.
* Remove items from unload_module that are automatically handled, remove
empty load and unload functions all together.
----------
TODO list:
* More / Better Documentation.
- modules.conf
- Module upgrade guide
- Expand on comments before 'strcut ast_module' in
main/module_private.h, maybe move them to the public module.h.
- Doxygen pages with general info about the module loader and
api_registry systems.
* Need an ast_debug to output the address range of module code when dlopen
is run. This way we have something to look at for segmentation faults
that happen after dlclose. This might require BFD.
* Look into issue with *.i being produced even when DONT_OPTIMIZE is not
enabled. This is likely due to *.manifest dependencies.
* Look into ways to reduce impact to 3rd party modules that might want to
be built against latest 13 and 14.
- Backport build_tools/get_moduleinfo changes so modules can include
additional metadata without producing menuselect warnings in older
versions.
- Produce module_compat.h to do what we can. Unsure if this should be
provided in 14, 13, or both.
- Some changes cannot be dealt with directly. Ensure 3rd party modules
can use #if conditional code to deal with those situations.
* Update addons, utils, and other modules I can't build such as chan_dahdi
and app_meetme.
* Investigate libcurl link error. This could be an issue with my library,
I have not verified that func_curl works on my system against master.
* More Automatic module reference handling:
- audio / frame hooks
- certain threads
- HTTP handlers
- SRTP, RTP glue
* Investigate / fix all testsuite failures.
* Run the unit tests.
* Do better with channel technology and module references. Need to convert
to api_registry, need the channel to hold references to the holder. Need
a way to deal with channel technologies that do not get registered.
* Audit all uses of ast_module_block_unload.
- Some cases may be needed, others might be replaced with api_registry
style module references or just references to the lib.
- Some uses of ast_module_block_unload may look strange but these are
mostly fixes to segmentation faults after dlclose I've experienced
while testing this change.
- Find a better way to deal with module thread local storage. It is
not safe to dlclose a module until all thread local storage is freed,
which means all threads that used it have exited.
* Do a better job updating/using ast_module->status. Use it to reduce the
locking time of the ast_module.
* Make it so ast_module_load of the same module from two threads will block
the second thread until the process is completed on the first. Maybe
consider using a thread pool handle the load.
* Update CLI 'module load' command to build a list and load based on
priorities.
* Cleanup output from 'module unload', find a way to display appropriate
messages.
* Resolve all BUGBUG's.
* Make a way for module manifests to say that one module should be loaded
before another, but only if it was going to be loaded anyways. Similar
to priorities but granular. Priorities need to be considered during
system shutdown.
* Audit the unload_module functions that remain. With this update the
module loader always runs unload_module, even when load_module returns
an error. Module cleanup was removed from the error section of all
load_module functions, but we still need to ensure that unload_module
is safe to run even if the module wasn't fully initialized. May build
a test that will skip all load_module functions (pretend they failed)
to see how many errors are produced by unload_module functions.
- This was an issue in PJSIP modules, unregistering a pjsip_module
that is not currently registered results in a PJSIP assertion.
* Find a way to deal with optional_api modules. Module references are
needed to control unload order. It is also currently unsafe to load
any optional_api provider after any module that uses it.
- chan_sip was the only module that used res_http_websockets in an
optional way, so that module is no longer an optional_api. Need
a sip.conf option to enable/disable websocket service.
- Can other optional_api providers be non-optional?
- Maybe create an api_registry based system for optional api's?
This would require some additional code in load_module to
initialize providers and users, but would be safe.
* Realtime driver autoload. This will require loading modules config
much ealier in the startup so the config system will be able to find
realtime drivers before they are loaded.
--------------------
Preload Replacement:
The previous module loader required you to specify 'preload' modules to use
realtime config from the core. Preload has not yet been reimplemented, the
hope is that it will be unneeded. Need to split the module_init function
to one that is run early to load config / manifests, another to perform the
normal module load. Any core config that requires preload would be able to
ask the module loader to load the realtime driver. This will require some
reordering of startup.
--------------------
Granular priorities:
I'm thinking of adding a new MODULEINFO element to describe priorities in
the same way as dependencies.
All CDR packages would contain:
<provides type="virtual">cdr</provides>
All channel driver's could contain:
<use type="virtual">cdr</use>
If you disable autoload and load chan_sip and cdr_csv, this would imply
that chan_sip depends on cdr_csv. Setting autoload=yes would imply that
all channel drivers depend on all cdr modules, but adding noload or
neverload to a cdr module would remove that from the uses list. This
"virtual" provide/use relationship would likely need to be handled
separately from all other provide/use types.
Change-Id: I6a22fb95965a87a57b718eb8bbac8d013e943107
---
M .gitignore
M Makefile.moddir_rules
M addons/app_mysql.c
M addons/cdr_mysql.c
M addons/chan_mobile.c
M addons/chan_ooh323.c
M addons/format_mp3.c
M addons/ooh323cDriver.c
M addons/res_config_mysql.c
M apps/app_adsiprog.c
M apps/app_agent_pool.c
M apps/app_alarmreceiver.c
M apps/app_amd.c
M apps/app_authenticate.c
M apps/app_bridgewait.c
M apps/app_cdr.c
M apps/app_celgenuserevent.c
M apps/app_chanisavail.c
M apps/app_channelredirect.c
M apps/app_chanspy.c
M apps/app_confbridge.c
M apps/app_controlplayback.c
M apps/app_dahdiras.c
M apps/app_db.c
M apps/app_dial.c
M apps/app_dictate.c
M apps/app_directed_pickup.c
M apps/app_directory.c
M apps/app_disa.c
M apps/app_dumpchan.c
M apps/app_echo.c
M apps/app_exec.c
M apps/app_externalivr.c
M apps/app_fax.c
M apps/app_festival.c
M apps/app_flash.c
M apps/app_followme.c
M apps/app_forkcdr.c
M apps/app_getcpeid.c
M apps/app_ices.c
M apps/app_image.c
M apps/app_ivrdemo.c
M apps/app_jack.c
M apps/app_macro.c
M apps/app_meetme.c
M apps/app_milliwatt.c
M apps/app_minivm.c
M apps/app_mixmonitor.c
M apps/app_morsecode.c
M apps/app_mp3.c
M apps/app_nbscat.c
M apps/app_originate.c
M apps/app_osplookup.c
M apps/app_page.c
M apps/app_playback.c
M apps/app_playtones.c
M apps/app_privacy.c
M apps/app_queue.c
M apps/app_read.c
M apps/app_readexten.c
M apps/app_record.c
M apps/app_saycounted.c
M apps/app_sayunixtime.c
M apps/app_senddtmf.c
M apps/app_sendtext.c
M apps/app_setcallerid.c
M apps/app_skel.c
M apps/app_sms.c
M apps/app_softhangup.c
M apps/app_speech_utils.c
M apps/app_stack.c
M apps/app_stasis.c
M apps/app_system.c
M apps/app_talkdetect.c
M apps/app_test.c
M apps/app_transfer.c
M apps/app_url.c
M apps/app_userevent.c
M apps/app_verbose.c
M apps/app_voicemail.c
M apps/app_waitforring.c
M apps/app_waitforsilence.c
M apps/app_waituntil.c
M apps/app_while.c
M apps/app_zapateller.c
M apps/confbridge/conf_config_parser.c
M bridges/bridge_builtin_features.c
M bridges/bridge_builtin_interval_features.c
M bridges/bridge_holding.c
M bridges/bridge_native_rtp.c
M bridges/bridge_simple.c
M bridges/bridge_softmix.c
A build_tools/get_module_manifest
M build_tools/get_moduleinfo
M cdr/cdr_adaptive_odbc.c
M cdr/cdr_csv.c
M cdr/cdr_custom.c
M cdr/cdr_manager.c
M cdr/cdr_odbc.c
M cdr/cdr_pgsql.c
M cdr/cdr_radius.c
M cdr/cdr_sqlite.c
M cdr/cdr_sqlite3_custom.c
M cdr/cdr_syslog.c
M cdr/cdr_tds.c
M cel/cel_custom.c
M cel/cel_manager.c
M cel/cel_odbc.c
M cel/cel_pgsql.c
M cel/cel_radius.c
M cel/cel_sqlite3_custom.c
M cel/cel_tds.c
M channels/chan_alsa.c
M channels/chan_bridge_media.c
M channels/chan_console.c
M channels/chan_dahdi.c
M channels/chan_iax2.c
M channels/chan_mgcp.c
M channels/chan_misdn.c
M channels/chan_motif.c
M channels/chan_nbs.c
M channels/chan_oss.c
M channels/chan_phone.c
M channels/chan_pjsip.c
M channels/chan_rtp.c
M channels/chan_sip.c
M channels/chan_skinny.c
M channels/chan_unistim.c
M channels/dahdi/bridge_native_dahdi.c
M channels/dahdi/bridge_native_dahdi.h
M channels/iax2/provision.c
M channels/sig_pri.c
M channels/sig_pri.h
M channels/sip/config_parser.c
M channels/sip/dialplan_functions.c
M channels/sip/include/config_parser.h
M channels/sip/include/dialplan_functions.h
M channels/sip/include/reqresp_parser.h
M channels/sip/reqresp_parser.c
M codecs/codec_a_mu.c
M codecs/codec_adpcm.c
M codecs/codec_alaw.c
M codecs/codec_dahdi.c
M codecs/codec_g722.c
M codecs/codec_g726.c
M codecs/codec_gsm.c
M codecs/codec_ilbc.c
M codecs/codec_lpc10.c
M codecs/codec_resample.c
M codecs/codec_speex.c
M codecs/codec_ulaw.c
M configs/samples/modules.conf.sample
M formats/format_g719.c
M formats/format_g723.c
M formats/format_g726.c
M formats/format_g729.c
M formats/format_gsm.c
M formats/format_h263.c
M formats/format_h264.c
M formats/format_ilbc.c
M formats/format_jpeg.c
M formats/format_ogg_vorbis.c
M formats/format_pcm.c
M formats/format_siren14.c
M formats/format_siren7.c
M formats/format_sln.c
M formats/format_vox.c
M formats/format_wav.c
M formats/format_wav_gsm.c
M funcs/func_aes.c
M funcs/func_audiohookinherit.c
M funcs/func_base64.c
M funcs/func_blacklist.c
M funcs/func_callcompletion.c
M funcs/func_callerid.c
M funcs/func_cdr.c
M funcs/func_channel.c
M funcs/func_config.c
M funcs/func_curl.c
M funcs/func_cut.c
M funcs/func_db.c
M funcs/func_devstate.c
M funcs/func_dialgroup.c
M funcs/func_dialplan.c
M funcs/func_enum.c
M funcs/func_env.c
M funcs/func_extstate.c
M funcs/func_frame_trace.c
M funcs/func_global.c
M funcs/func_groupcount.c
M funcs/func_hangupcause.c
M funcs/func_iconv.c
M funcs/func_jitterbuffer.c
M funcs/func_lock.c
M funcs/func_logic.c
M funcs/func_math.c
M funcs/func_md5.c
M funcs/func_module.c
M funcs/func_odbc.c
M funcs/func_periodic_hook.c
M funcs/func_pitchshift.c
M funcs/func_pjsip_aor.c
M funcs/func_pjsip_contact.c
M funcs/func_pjsip_endpoint.c
M funcs/func_presencestate.c
M funcs/func_rand.c
M funcs/func_realtime.c
M funcs/func_sha1.c
M funcs/func_shell.c
M funcs/func_sorcery.c
M funcs/func_speex.c
M funcs/func_sprintf.c
M funcs/func_srv.c
M funcs/func_strings.c
M funcs/func_sysinfo.c
M funcs/func_talkdetect.c
M funcs/func_timeout.c
M funcs/func_uri.c
M funcs/func_version.c
M funcs/func_vmcount.c
M funcs/func_volume.c
M include/asterisk.h
M include/asterisk/_private.h
M include/asterisk/agi.h
A include/asterisk/api_registry.h
M include/asterisk/app.h
M include/asterisk/ari.h
M include/asterisk/astmm.h
M include/asterisk/bridge.h
M include/asterisk/bridge_internal.h
M include/asterisk/bridge_technology.h
M include/asterisk/channel.h
M include/asterisk/cli.h
M include/asterisk/config.h
M include/asterisk/datastore.h
M include/asterisk/devicestate.h
M include/asterisk/http_websocket.h
M include/asterisk/manager.h
M include/asterisk/message.h
M include/asterisk/mixmonitor.h
M include/asterisk/mod_format.h
M include/asterisk/module.h
M include/asterisk/parking.h
M include/asterisk/pbx.h
M include/asterisk/res_fax.h
M include/asterisk/res_mwi_external.h
M include/asterisk/res_pjsip.h
M include/asterisk/res_pjsip_pubsub.h
M include/asterisk/res_pjsip_session.h
M include/asterisk/rtp_engine.h
M include/asterisk/sorcery.h
M include/asterisk/stasis.h
M include/asterisk/stasis_app.h
M include/asterisk/strings.h
M include/asterisk/test.h
M include/asterisk/threadstorage.h
M include/asterisk/timing.h
M include/asterisk/translate.h
M include/asterisk/utils.h
A main/api_registry.c
M main/app.c
M main/ast_expr2.c
M main/ast_expr2.y
M main/asterisk.c
M main/asterisk.exports.in
M main/astmm.c
M main/astobj2.c
M main/bridge.c
M main/bridge_channel.c
M main/bucket.c
M main/channel.c
M main/cli.c
M main/codec.c
M main/config.c
M main/data.c
M main/datastore.c
M main/devicestate.c
M main/dial.c
M main/features.c
M main/file.c
M main/format.c
D main/loader.c
M main/manager.c
M main/message.c
M main/mixmonitor.c
A main/module.c
A main/module_accessors.c
A main/module_cli.c
A main/module_manifest.c
A main/module_private.h
M main/parking.c
M main/pbx.c
M main/rtp_engine.c
M main/sorcery.c
M main/stasis_message.c
M main/strings.c
M main/test.c
M main/timing.c
M main/translate.c
M pbx/pbx_ael.c
M pbx/pbx_config.c
M pbx/pbx_dundi.c
M pbx/pbx_loopback.c
M pbx/pbx_lua.c
M pbx/pbx_realtime.c
M pbx/pbx_spool.c
M res/ael/pval.c
M res/ari/cli.c
M res/ari/internal.h
M res/ari/resource_bridges.c
M res/ari/resource_channels.c
M res/ari/resource_device_states.c
M res/ari/resource_events.c
M res/ari/resource_mailboxes.c
M res/ari/resource_playbacks.c
M res/ari/resource_recordings.c
M res/parking/parking_applications.c
M res/parking/parking_bridge_features.c
M res/parking/parking_devicestate.c
M res/parking/parking_manager.c
M res/parking/parking_tests.c
M res/parking/parking_ui.c
M res/parking/res_parking.h
M res/res_adsi.c
M res/res_ael_share.c
M res/res_agi.c
M res/res_ari.c
M res/res_ari.exports.in
M res/res_ari_applications.c
M res/res_ari_asterisk.c
M res/res_ari_bridges.c
M res/res_ari_channels.c
M res/res_ari_device_states.c
M res/res_ari_endpoints.c
M res/res_ari_events.c
M res/res_ari_mailboxes.c
M res/res_ari_model.c
M res/res_ari_playbacks.c
M res/res_ari_recordings.c
M res/res_ari_sounds.c
M res/res_calendar.c
M res/res_calendar_caldav.c
M res/res_calendar_ews.c
M res/res_calendar_exchange.c
M res/res_calendar_icalendar.c
M res/res_chan_stats.c
M res/res_clialiases.c
M res/res_clioriginate.c
M res/res_config_curl.c
M res/res_config_ldap.c
M res/res_config_odbc.c
M res/res_config_pgsql.c
M res/res_config_sqlite.c
M res/res_config_sqlite3.c
M res/res_convert.c
M res/res_corosync.c
M res/res_crypto.c
M res/res_curl.c
M res/res_fax.c
M res/res_fax_spandsp.c
M res/res_format_attr_celt.c
M res/res_format_attr_h263.c
M res/res_format_attr_h264.c
M res/res_format_attr_opus.c
M res/res_format_attr_silk.c
M res/res_hep.c
M res/res_hep_pjsip.c
M res/res_hep_rtcp.c
M res/res_http_post.c
M res/res_http_websocket.c
M res/res_limit.c
M res/res_manager_devicestate.c
M res/res_manager_presencestate.c
M res/res_monitor.c
M res/res_musiconhold.c
M res/res_mutestream.c
M res/res_mwi_external.c
M res/res_mwi_external_ami.c
M res/res_odbc.c
M res/res_parking.c
M res/res_phoneprov.c
M res/res_pjsip.c
M res/res_pjsip.exports.in
M res/res_pjsip/config_auth.c
M res/res_pjsip/config_system.c
M res/res_pjsip/config_transport.c
M res/res_pjsip/include/res_pjsip_private.h
M res/res_pjsip/location.c
M res/res_pjsip/pjsip_cli.c
M res/res_pjsip/pjsip_configuration.c
M res/res_pjsip/pjsip_distributor.c
M res/res_pjsip/pjsip_global_headers.c
M res/res_pjsip/pjsip_options.c
M res/res_pjsip/pjsip_outbound_auth.c
M res/res_pjsip_acl.c
M res/res_pjsip_authenticator_digest.c
M res/res_pjsip_caller_id.c
M res/res_pjsip_config_wizard.c
M res/res_pjsip_dialog_info_body_generator.c
M res/res_pjsip_diversion.c
M res/res_pjsip_dlg_options.c
M res/res_pjsip_dtmf_info.c
M res/res_pjsip_endpoint_identifier_anonymous.c
M res/res_pjsip_endpoint_identifier_ip.c
M res/res_pjsip_endpoint_identifier_user.c
M res/res_pjsip_exten_state.c
M res/res_pjsip_header_funcs.c
M res/res_pjsip_keepalive.c
M res/res_pjsip_log_forwarder.c
M res/res_pjsip_logger.c
M res/res_pjsip_messaging.c
M res/res_pjsip_multihomed.c
M res/res_pjsip_mwi.c
M res/res_pjsip_mwi_body_generator.c
M res/res_pjsip_nat.c
M res/res_pjsip_notify.c
M res/res_pjsip_one_touch_record_info.c
M res/res_pjsip_outbound_authenticator_digest.c
M res/res_pjsip_outbound_publish.c
M res/res_pjsip_outbound_registration.c
M res/res_pjsip_path.c
M res/res_pjsip_phoneprov_provider.c
M res/res_pjsip_pidf_body_generator.c
M res/res_pjsip_pidf_digium_body_supplement.c
M res/res_pjsip_pidf_eyebeam_body_supplement.c
M res/res_pjsip_publish_asterisk.c
M res/res_pjsip_pubsub.c
M res/res_pjsip_refer.c
M res/res_pjsip_registrar.c
M res/res_pjsip_registrar_expire.c
M res/res_pjsip_rfc3326.c
M res/res_pjsip_sdp_rtp.c
M res/res_pjsip_send_to_voicemail.c
M res/res_pjsip_session.c
M res/res_pjsip_sips_contact.c
M res/res_pjsip_t38.c
M res/res_pjsip_transport_websocket.c
M res/res_pjsip_xpidf_body_generator.c
M res/res_pktccops.c
M res/res_realtime.c
M res/res_resolver_unbound.c
M res/res_rtp_asterisk.c
M res/res_rtp_multicast.c
M res/res_security_log.c
M res/res_smdi.c
M res/res_snmp.c
M res/res_sorcery_astdb.c
M res/res_sorcery_config.c
M res/res_sorcery_memory.c
M res/res_sorcery_memory_cache.c
M res/res_sorcery_realtime.c
M res/res_speech.c
M res/res_srtp.c
M res/res_stasis.c
M res/res_stasis_answer.c
M res/res_stasis_device_state.c
M res/res_stasis_mailbox.c
M res/res_stasis_playback.c
M res/res_stasis_recording.c
M res/res_stasis_snoop.c
M res/res_stasis_test.c
M res/res_statsd.c
M res/res_stun_monitor.c
M res/res_timing_dahdi.c
M res/res_timing_kqueue.c
M res/res_timing_pthread.c
M res/res_timing_timerfd.c
M res/res_xmpp.c
M res/snmp/agent.c
M res/stasis/stasis_bridge.c
M rest-api-templates/res_ari_resource.c.mustache
M tests/test_abstract_jb.c
M tests/test_acl.c
M tests/test_amihooks.c
M tests/test_aoc.c
M tests/test_app.c
M tests/test_ari.c
M tests/test_ari_model.c
M tests/test_ast_format_str_reduce.c
M tests/test_astobj2.c
M tests/test_astobj2_thrash.c
M tests/test_astobj2_weaken.c
M tests/test_bucket.c
M tests/test_callerid.c
M tests/test_cdr.c
M tests/test_cel.c
M tests/test_channel_feature_hooks.c
M tests/test_config.c
M tests/test_core_codec.c
M tests/test_core_format.c
M tests/test_db.c
M tests/test_devicestate.c
M tests/test_dlinklists.c
M tests/test_dns.c
M tests/test_dns_naptr.c
M tests/test_dns_query_set.c
M tests/test_dns_recurring.c
M tests/test_dns_srv.c
M tests/test_endpoints.c
M tests/test_event.c
M tests/test_expr.c
M tests/test_format_cache.c
M tests/test_format_cap.c
M tests/test_func_file.c
M tests/test_gosub.c
M tests/test_hashtab_thrash.c
M tests/test_heap.c
M tests/test_jitterbuf.c
M tests/test_json.c
M tests/test_linkedlists.c
M tests/test_locale.c
M tests/test_logger.c
M tests/test_message.c
M tests/test_netsock2.c
M tests/test_optional_api.c
M tests/test_pbx.c
M tests/test_poll.c
M tests/test_res_stasis.c
M tests/test_sched.c
M tests/test_scoped_lock.c
M tests/test_security_events.c
M tests/test_skel.c
M tests/test_sorcery.c
M tests/test_sorcery_astdb.c
M tests/test_sorcery_realtime.c
M tests/test_stasis.c
M tests/test_stasis_channels.c
M tests/test_stasis_endpoints.c
M tests/test_stringfields.c
M tests/test_strings.c
M tests/test_substitution.c
M tests/test_taskprocessor.c
M tests/test_threadpool.c
M tests/test_time.c
M tests/test_uri.c
M tests/test_utils.c
M tests/test_uuid.c
M tests/test_vector.c
M tests/test_voicemail_api.c
M tests/test_websocket_client.c
M tests/test_xml_escape.c
M utils/Makefile
M utils/ael_main.c
M utils/check_expr.c
M utils/conf2ael.c
545 files changed, 6,619 insertions(+), 9,910 deletions(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/57/557/1
--
To view, visit https://gerrit.asterisk.org/557
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a22fb95965a87a57b718eb8bbac8d013e943107
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Corey Farrell <git at cfware.com>
More information about the asterisk-code-review
mailing list