blob: a098d2c714483eccc1e79e01a37a3489e97e24fd [file] [log] [blame]
Roger Meier84e4a3c2011-09-16 20:58:44 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20#ifndef _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_
21#define _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_ 1
22
23#if defined(_MSC_VER) && (_MSC_VER > 1200)
24#pragma once
25#endif // _MSC_VER
26
27#ifndef _WIN32
28#error This is a MSVC header only.
29#endif
30
Roger Meierff77d072013-06-28 22:26:43 +020031#include <thrift/thrift-config.h>
Carl Yeksigian7cb7fc82013-06-07 07:33:01 -040032
Roger Meier84e4a3c2011-09-16 20:58:44 +000033// boost
Mario Emmenlauerd270b352020-11-19 09:43:34 +010034#include <thrift/TNonCopyable.h>
Carl Yeksigian7cb7fc82013-06-07 07:33:01 -040035
cyy316723a2019-01-05 16:35:14 +080036#include <memory>
Carl Yeksigian7cb7fc82013-06-07 07:33:01 -040037#include <mutex>
Roger Meier84e4a3c2011-09-16 20:58:44 +000038
James E. King, III82ae9572017-08-05 12:23:54 -040039
Konrad Grochowski16a23a62014-11-13 15:33:38 +010040namespace apache {
41namespace thrift {
42namespace transport {
Roger Meier84e4a3c2011-09-16 20:58:44 +000043
44/**
45 * Winsock2 must be intialised once only in order to create sockets. This class
46 * performs a one time initialisation when create is called.
47 */
Mario Emmenlauerd270b352020-11-19 09:43:34 +010048class TWinsockSingleton : private apache::thrift::TNonCopyable {
Roger Meier84e4a3c2011-09-16 20:58:44 +000049
50public:
cyy316723a2019-01-05 16:35:14 +080051 typedef std::shared_ptr<TWinsockSingleton> instance_ptr;
Roger Meier84e4a3c2011-09-16 20:58:44 +000052
53private:
Konrad Grochowski16a23a62014-11-13 15:33:38 +010054 TWinsockSingleton(void);
Roger Meier84e4a3c2011-09-16 20:58:44 +000055
56public:
Konrad Grochowski16a23a62014-11-13 15:33:38 +010057 ~TWinsockSingleton(void);
Roger Meier84e4a3c2011-09-16 20:58:44 +000058
59public:
Konrad Grochowski16a23a62014-11-13 15:33:38 +010060 static void create(void);
Roger Meier84e4a3c2011-09-16 20:58:44 +000061
62private:
Konrad Grochowski16a23a62014-11-13 15:33:38 +010063 static void init(void);
Roger Meier84e4a3c2011-09-16 20:58:44 +000064
65private:
Konrad Grochowski16a23a62014-11-13 15:33:38 +010066 static instance_ptr instance_ptr_;
Konrad Grochowski16a23a62014-11-13 15:33:38 +010067 static std::once_flag flags_;
Roger Meier84e4a3c2011-09-16 20:58:44 +000068};
Konrad Grochowski16a23a62014-11-13 15:33:38 +010069}
70}
71} // apache::thrift::transport
Roger Meier84e4a3c2011-09-16 20:58:44 +000072
73#endif // _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_