[esnacc-dev] [PATCH 2/2] cxx-lib/asn-buf: Stream buffer monitor

Sagara Wickramasekara sagaraw at gmail.com
Thu Sep 1 20:39:15 UTC 2016


Acked-by: Sagara Wickramasekara <sagaraw at gmail.com>

On Fri, Aug 26, 2016 at 3:32 PM, Aaron Conole <aconole at bytheb.org> wrote:

> Introduce a mechanism for monitoring and calling back stream buffer
> objects.  This is useful for building busy-wait loops, which can perform
> tasks as interleaved callbacks.
>
> Signed-off-by: Aaron Conole <aconole at bytheb.org>
> ---
>  cxx-lib/inc/asn-buf.h | 99 ++++++++++++++++++++++++++++++
> +++++++++++++++++++++
>  1 file changed, 99 insertions(+)
>
> diff --git a/cxx-lib/inc/asn-buf.h b/cxx-lib/inc/asn-buf.h
> index d316ba9..872484b 100644
> --- a/cxx-lib/inc/asn-buf.h
> +++ b/cxx-lib/inc/asn-buf.h
> @@ -7,9 +7,11 @@
>  #pragma warning(push,3)
>  #endif
>
> +#include <algorithm>
>  #include <deque>
>  #include <fstream>
>  #include <list>
> +#include <map>
>  #include <ostream>
>  #include <sstream>
>  #include <streambuf>
> @@ -413,6 +415,103 @@ private:
>
>  };
>
> +
> +class StreambufCallback
> +{
> +public:
> +    enum Streambuf_CB_RESULT {
> +        CB_NONE,
> +        CB_DROP_STREAM
> +    };
> +
> +    enum Streambuf_CB_STATUS {
> +        CB_READ_OK,
> +        CB_WRITE_OK,
> +        CB_OPENED,
> +        CB_CLOSED
> +    };
> +
> +    StreambufCallback(){}
> +    virtual ~StreambufCallback(){}
> +    virtual Streambuf_CB_RESULT callback(Streambuf_CB_STATUS status,
> +                                         std::streambuf *stream) = 0;
> +};
> +
> +class StreambufMonitor
> +{
> +public:
> +    typedef std::map<std::streambuf*,StreambufCallback&> callbackMap;
> +
> +private:
> +    callbackMap                 callbacks;
> +    std::list<std::streambuf*>  toDrop;
> +
> +    static void check_buffer(callbackMap::value_type t,
> +                             std::list<std::streambuf*> &StreamDropList)
> +    {
> +        std::streambuf *Stream = t.first;
> +        std::streamsize Bytes = Stream->in_avail();
> +        StreambufCallback::Streambuf_CB_RESULT result =
> +            StreambufCallback::CB_NONE;
> +
> +        if (Bytes == -1) {
> +            result = (t.second).callback(StreambufCallback::CB_CLOSED,
> Stream);
> +        } else if (Bytes > 0) {
> +            result = (t.second).callback(StreambufCallback::CB_READ_OK,
> +                                         Stream);
> +        }
> +
> +        if (result == StreambufCallback::CB_DROP_STREAM) {
> +            StreamDropList.push_back(Stream);
> +        }
> +    }
> +
> +    struct buffer_checker
> +    {
> +        StreambufMonitor *Mon;
> +        void operator()(callbackMap::value_type t)
> +        {
> +            StreambufMonitor::check_buffer(t, Mon->toDrop);
> +        }
> +    };
> +
> +public:
> +    StreambufMonitor() {}
> +    ~StreambufMonitor() {}
> +
> +    /**
> +     * Adds a streambuf to be monitored, with a specific callback
> instance. */
> +    bool push(std::streambuf *Stream, StreambufCallback &CB, bool
> callOpen)
> +    {
> +        if (callOpen) {
> +            StreambufCallback::Streambuf_CB_RESULT result =
> +                CB.callback(StreambufCallback::CB_OPENED, Stream);
> +            if (result == StreambufCallback::CB_DROP_STREAM)
> +                return false;
> +        }
> +        callbacks.insert(
> +            std::pair<std::streambuf*,StreambufCallback&>(Stream,CB));
> +        return true;
> +    }
> +
> +    /**
> +     * Removes a streambuf from the monitor. */
> +    bool pop(std::streambuf *Stream)
> +    {
> +        if (callbacks.erase(Stream))
> +            return true;
> +        return false;
> +    }
> +
> +    void operator()()
> +    {
> +        buffer_checker bc;
> +        bc.Mon = this;
> +        std::for_each(callbacks.begin(), callbacks.end(), bc);
> +        toDrop.clear();
> +    }
> +};
> +
>  } // end namespace SNACC
>
>  SNACCDLL_API void sortSet(std::list<SNACC::AsnBuf> &bufList);
> --
> 2.5.5
>
> _______________________________________________
> dev mailing list
> dev at lists.esnacc.org
> http://mail.esnacc.org/mailman/listinfo/dev
>



-- 
-Sagara
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.esnacc.org/pipermail/dev/attachments/20160901/e67acdb3/attachment.html>


More information about the dev mailing list