Split caching out from the stasis_caching_topic.
authorDavid M. Lee <dlee@digium.com>
Thu, 1 Aug 2013 13:49:34 +0000 (13:49 +0000)
committerDavid M. Lee <dlee@digium.com>
Thu, 1 Aug 2013 13:49:34 +0000 (13:49 +0000)
commite1b959ccbb4e47421b37a0f75a2bf89ccd34dcb1
tree3026c96da713bafcf1126c77bde6994f348280bb
parent5c1396946929ab19e94c117f8ad3db5f78a450bc
Split caching out from the stasis_caching_topic.

In working with res_stasis, I discovered a significant limitation to
the current structure of stasis_caching_topics: you cannot subscribe
to cache updates for a single channel/bridge/endpoint/etc.

To address this, this patch splits the cache away from the
stasis_caching_topic, making it a first class object. The stasis_cache
object is shared amongst individual stasis_caching_topics that are
created per channel/endpoint/etc. These are still forwarded to global
whatever_all_cached topics, so their use from most of the code does
not change.

In making these changes, I noticed that we frequently used a similar
pattern for bridges, endpoints and channels:

     single_topic  ---------------->  all_topic
           ^
           |
     single_topic_cached  ----+---->  all_topic_cached
                              |
                              +---->  cache

This pattern was extracted as the 'Stasis Caching Pattern', defined in
stasis_caching_pattern.h. This avoids a lot of duplicate code between
the different domain objects.

Since the cache is now disassociated from its upstream caching topics,
this also necessitated a change to how the 'guaranteed' flag worked
for retrieving from a cache. The code for handling the caching
guarantee was extracted into a 'stasis_topic_wait' function, which
works for any stasis_topic.

(closes issue ASTERISK-22002)
Review: https://reviewboard.asterisk.org/r/2672/

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@395954 65c4cc65-6c06-0410-ace0-fbb531ad65f3
54 files changed:
apps/app_meetme.c
apps/app_voicemail.c
apps/confbridge/confbridge_manager.c
channels/chan_dahdi.c
channels/chan_iax2.c
channels/chan_mgcp.c
channels/chan_sip.c
channels/chan_unistim.c
channels/sig_pri.c
include/asterisk/app.h
include/asterisk/bridge.h
include/asterisk/channel.h
include/asterisk/channel_internal.h
include/asterisk/devicestate.h
include/asterisk/presencestate.h
include/asterisk/stasis.h
include/asterisk/stasis_bridges.h
include/asterisk/stasis_cache_pattern.h [new file with mode: 0644]
include/asterisk/stasis_channels.h
include/asterisk/stasis_endpoints.h
main/app.c
main/bridge.c
main/cdr.c
main/cel.c
main/channel_internal_api.c
main/cli.c
main/devicestate.c
main/endpoints.c
main/manager.c
main/manager_bridges.c
main/manager_channels.c
main/manager_endpoints.c
main/pbx.c
main/presencestate.c
main/stasis.c
main/stasis_bridges.c
main/stasis_cache.c
main/stasis_cache_pattern.c [new file with mode: 0644]
main/stasis_channels.c
main/stasis_endpoints.c
main/stasis_wait.c [new file with mode: 0644]
res/ari/resource_bridges.c
res/ari/resource_channels.c
res/ari/resource_endpoints.c
res/res_agi.c
res/res_chan_stats.c
res/res_jabber.c
res/res_stasis.c
res/res_xmpp.c
res/stasis/control.c
tests/test_cel.c
tests/test_devicestate.c
tests/test_stasis.c
tests/test_stasis_endpoints.c