~raghavendra-prabhu/percona-xtradb-cluster/release-5.5.30-galera-2.x

« back to all changes in this revision

Viewing changes to galerautils/src/gu_throw.hpp

  • Committer: Raghavendra D Prabhu
  • Date: 2013-04-12 15:26:34 UTC
  • mfrom: (95.2.24 2.x)
  • Revision ID: raghavendra.prabhu@percona.com-20130412152634-2y2u0swshf5fie2x
Merge lp:galera-2.x upto revision 150.

Following bugs are fixed:

lp:1166065
lp:1164992

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright (C) 2009 Codership Oy <info@codership.com>
 
2
 * Copyright (C) 2009-2013 Codership Oy <info@codership.com>
3
3
 *
4
 
 * $Id: gu_throw.hpp 2984 2013-03-05 10:38:09Z teemu $
 
4
 * $Id: gu_throw.hpp 3037 2013-04-07 18:53:02Z alex $
5
5
 */
6
6
 
7
7
/*!
17
17
#include <cstring>
18
18
#include <sstream>
19
19
 
 
20
#include "gu_macros.h"
20
21
#include "gu_exception.hpp"
21
22
 
22
23
namespace gu
23
24
{
24
 
    /*! Abstract base class */
 
25
    /*! "base" class */
25
26
    class ThrowBase
26
27
    {
27
 
    public:
28
 
 
29
 
        virtual ~ThrowBase () {}
30
 
 
31
 
        std::ostringstream& msg () throw() { return os; }
32
 
 
33
28
    protected:
34
29
 
35
30
        const char* const  file;
37
32
        int         const  line;
38
33
        std::ostringstream os;
39
34
 
40
 
        ThrowBase (const char* file_, const char* func_, int line_) throw()
 
35
        ThrowBase (const char* file_, const char* func_, int line_)
41
36
            :
42
37
            file (file_),
43
38
            func (func_),
49
44
 
50
45
        ThrowBase (const ThrowBase&);
51
46
        ThrowBase& operator= (const ThrowBase&);
 
47
 
 
48
        friend class ThrowError;
 
49
        friend class ThrowFatal;
52
50
    };
53
51
 
54
 
    /* final*/ class ThrowError : public ThrowBase
 
52
    /* final*/ class ThrowError //: public ThrowBase
55
53
    {
56
54
    public:
57
55
 
58
56
        ThrowError (const char* file_,
59
57
                    const char* func_,
60
58
                    int         line_,
61
 
                    int         err_ = Exception::E_UNSPEC) throw()
 
59
                    int         err_ = Exception::E_UNSPEC)
62
60
            :
63
 
            ThrowBase (file_, func_, line_),
64
 
            err       (err_)
 
61
            base (file_, func_, line_),
 
62
            err  (err_)
65
63
        {}
66
64
 
67
 
        ~ThrowError () throw (Exception)
 
65
        ~ThrowError() GU_NORETURN
68
66
        {
69
 
            os << ": " << err << " (" << ::strerror(err) << ')';
70
 
 
71
 
            Exception e(os.str(), err);
72
 
 
73
 
            e.trace (file, func, line);
 
67
            base.os << ": " << err << " (" << ::strerror(err) << ')';
 
68
 
 
69
            Exception e(base.os.str(), err);
 
70
 
 
71
            e.trace (base.file, base.func, base.line);
74
72
 
75
73
            throw e;
76
74
        }
77
75
 
 
76
        std::ostringstream& msg () { return base.os; }
 
77
 
78
78
    private:
79
79
 
 
80
        ThrowBase base;
80
81
        int const err;
81
82
    };
82
83
 
83
 
    /* final*/ class ThrowFatal : public ThrowBase
 
84
    /* final*/ class ThrowFatal //: public ThrowBase
84
85
    {
85
86
    public:
86
87
 
87
 
        ThrowFatal (const char* file, const char* func, int line) throw()
 
88
        ThrowFatal (const char* file, const char* func, int line)
88
89
            :
89
 
            ThrowBase (file, func, line)
 
90
            base (file, func, line)
90
91
        {}
91
92
 
92
 
        ~ThrowFatal () throw (Exception)
 
93
        ~ThrowFatal () GU_NORETURN
93
94
        {
94
 
            os << " (FATAL)";
95
 
 
96
 
            Exception e(os.str(), Exception::E_NOTRECOVERABLE);
97
 
 
98
 
            e.trace (file, func, line);
 
95
            base.os << " (FATAL)";
 
96
 
 
97
            Exception e(base.os.str(), Exception::E_NOTRECOVERABLE);
 
98
 
 
99
            e.trace (base.file, base.func, base.line);
 
100
 
99
101
            throw e;
100
102
        }
 
103
 
 
104
        std::ostringstream& msg () { return base.os; }
 
105
 
 
106
    private:
 
107
 
 
108
        ThrowBase base;
101
109
    };
102
110
}
103
111