On Tue, 15 Dec 2009, Jérémy Zurcher wrote:

That said, if you have any ideas on how to get (or make) some
RT-safe dynamic strings... please share.  I'm interested in having
that for Composite as well... so that even when there's an error
we're RT-safe.

quick and dirty thoughts :
do something like errno perror does,
have a global or per class static index of error strings
send only the error code (and an instance reference maybe ) to the logger,
then let the well known logger thread fetch the string and output it.

Ah, but these wouldn't be /dynamic/ strings. These would be fixed strings. :-)

One way to go is to look into the implementation of QString and std::string and see if we can use the .reserve(N) method to accomplish our goals. It's unlikely in both cases... because I think they always allocate space on the heap.

Possibly this can be fixed by using a different allocator.

However, a string class could be created that meets the requirement:

    template <typename CharT, size_t Max>
    class RtString
    {
    public:
        typedef CharT value_type;
        const size_t max_chars;
        const size_t npos;

        /* Formatting: "There are @ objects", where @
         * will be replaced through one of the arg()
         * functions.
         */
        RtString(const CharT* msg);
        ~RtString() {}

        RtString& arg(unsigned i);

        // This should not be part of the final
        // class...
        CharT* ref() { return _data; }
        operator CharT* () { return _data; }

        size_t size() { return _size; }

    protected:
        // Search for next '@' sequence.
        size_t insertion_location();

        // Shift everything over, discarding the @
        void make_room(size_t pos, size_t n);

    private:
        CharT _data[Max + 1];
        size_t _size;
    };

    typedef RtString<char, 140> LogString;

Typical usage would be like this:

    ERRORLOG( LogString("There were @ cats").arg(125) );

Which would spit out:

    "There were 125 cats"

If you overflow your message buffer... we just truncate the message.

I put together a full proof-of-concept, with a ringbuffered logging thread, in here:

    
http://gitorious.org/composite/composite-labs/trees/94ecd61eee5ab05b6dd427df12a890ee773de16b/200912-rtstring

Comments are welcome!

(I love little puzzles like this... :-))

Peace,
Gabriel
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Hydrogen-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/hydrogen-devel

Reply via email to