~alan-griffiths/junk/composition-bypass

« back to all changes in this revision

Viewing changes to src/client/mir_client_library.cpp

  • Committer: Alan Griffiths
  • Date: 2013-05-28 13:23:19 UTC
  • mfrom: (693.3.9 trunk)
  • Revision ID: alan@octopull.co.uk-20130528132319-bbg8f33wnq7ivgt4
mergeĀ lp:mir

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
 
38
38
namespace
39
39
{
40
 
MirConnection error_connection;
 
40
class ConnectionList
 
41
{
 
42
public:
 
43
    void insert(MirConnection* connection)
 
44
    {
 
45
        std::lock_guard<std::mutex> lock(connection_guard);
 
46
        connections.insert(connection);
 
47
    }
 
48
 
 
49
    void remove(MirConnection* connection)
 
50
    {
 
51
        std::lock_guard<std::mutex> lock(connection_guard);
 
52
        connections.erase(connection);
 
53
    }
 
54
 
 
55
    bool contains(MirConnection* connection)
 
56
    {
 
57
        std::lock_guard<std::mutex> lock(connection_guard);
 
58
        return connections.count(connection);
 
59
    }
 
60
 
 
61
private:
 
62
    std::mutex connection_guard;
 
63
    std::unordered_set<MirConnection*> connections;
 
64
};
 
65
 
 
66
ConnectionList error_connections;
41
67
 
42
68
// assign_result is compatible with all 2-parameter callbacks
43
69
void assign_result(void *result, void **context)
67
93
    }
68
94
    catch (std::exception const& x)
69
95
    {
70
 
        error_connection.set_error_message(x.what());
71
 
        callback(&error_connection, context);
 
96
        MirConnection* error_connection = new MirConnection();
 
97
        error_connections.insert(error_connection);
 
98
        error_connection->set_error_message(x.what());
 
99
        callback(error_connection, context);
72
100
        return 0;
73
101
    }
74
102
}
96
124
 
97
125
void mir_connection_release(MirConnection * connection)
98
126
{
99
 
    if (&error_connection == connection) return;
100
 
 
101
 
    auto wait_handle = connection->disconnect();
102
 
    wait_handle->wait_for_result();
 
127
    if (!error_connections.contains(connection))
 
128
    {
 
129
        auto wait_handle = connection->disconnect();
 
130
        wait_handle->wait_for_result();
 
131
    }
 
132
    else
 
133
    {
 
134
        error_connections.remove(connection);
 
135
    }
103
136
 
104
137
    delete connection;
105
138
}
115
148
    mir_surface_lifecycle_callback callback,
116
149
    void* context)
117
150
{
118
 
    if (&error_connection == connection) return 0;
 
151
    if (error_connections.contains(connection)) return 0;
119
152
 
120
153
    try
121
154
    {
130
163
}
131
164
 
132
165
MirSurface* mir_connection_create_surface_sync(
133
 
    MirConnection* connection, 
 
166
    MirConnection* connection,
134
167
    MirSurfaceParameters const* params)
135
168
{
136
169
    MirSurface *surface = nullptr;