-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathasyncurl.h
143 lines (102 loc) · 4.11 KB
/
asyncurl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#ifndef INCLUDED_ASYNCURL_H
#define INCLUDED_ASYNCURL_H
//////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011-2012, OblakSoft LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
// Authors: Maxim Mazeev <[email protected]>
// Artem Livshits <[email protected]>
//////////////////////////////////////////////////////////////////////////////
// Async functionality for cURL.
//////////////////////////////////////////////////////////////////////////////
#include <stddef.h>
namespace webstor
{
class AsyncMan;
namespace internal
{
typedef void CURL;
struct AsyncState;
class AsyncLoop;
class EventSync;
//////////////////////////////////////////////////////////////////////////////
///@brief INTERNAL: AsyncCurl -- cURL extended with async functionality.
///@remarks WARNING: async operations use CURLOPT_PRIVATE option, so it must not
/// be used for other purposes while async functionality is used.
class AsyncCurl
{
public:
AsyncCurl();
~AsyncCurl();
operator CURL *() const { return m_curl; }
void pendOp( AsyncMan *opMan );
void completeOp(); // nofail
void cancelOp(); // nofail
bool isOpCompleted() const; // nofail
int opResult() const; // nofail, returns CURLcode
EventSync * completedEvent() const;
private:
AsyncCurl( const AsyncCurl & ); // forbidden
AsyncCurl & operator=( const AsyncCurl & ); // forbidden
CURL * m_curl;
AsyncState * m_asyncState;
};
void
handleBackgroundError(); // nofail
}
//////////////////////////////////////////////////////////////////////////////
///@brief AsyncMan -- manager for async operations.
///@details An instance of this class is needed to initiate an async cURL operation.
/// Generally, one instance per application is needed.
///
///@remarks Lifetime of the connection manager must be greater than any active async
/// cURL operation initiated with this manager.
///
///@remarks Thread-safety: the object is thread-safe and can be used by multiple
/// connections from multiple threads.
///
class AsyncMan
{
public:
/// Default number of connections per thread.
enum { c_cMaxConnectionsPerThread = 32 };
///@brief Constructs a new instance of AsyncMan.
///@details </b>connectionsPerThread</b> specifies
/// how many connections can be handled by a single thread.
/// If more that <b>connectionsPerThread</b> async operation is started at
/// the same time, the class can spawn extra threads as needed.
explicit AsyncMan( size_t connectionsPerThread = c_cMaxConnectionsPerThread );
/// Terminates AsyncMan.
~AsyncMan();
/// Number of connectinos per thread.
size_t connectionsPerThread() const { return m_connectionsPerThread; }
public:
internal::AsyncLoop * head() const { return m_head; }
private:
AsyncMan( const AsyncMan & ); // forbidden
AsyncMan& operator=( const AsyncMan & ); // forbidden
internal::AsyncLoop * m_head;
size_t m_connectionsPerThread;
};
//////////////////////////////////////////////////////////////////////////////
// Background error handling support.
/// Background error handling callback.
typedef void ( BackgroundErrHandler )();
/// Set this to be able to log and recover from errors happened on
/// a background thread while executing an async request.
void
setBackgroundErrHandler( BackgroundErrHandler *eh );
} // namespace webstor
#endif // !INCLUDED_ASYNCURL_H