Skip to content

Commit 197bcf2

Browse files
committed
修复linux/mac上无法正确运行语言服务得问题
1 parent fe9dd63 commit 197bcf2

File tree

4 files changed

+102
-15
lines changed

4 files changed

+102
-15
lines changed

CodeFormatServer/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ target_include_directories(CodeFormatServer PUBLIC
1010
${LuaCodeStyle_SOURCE_DIR}/include
1111
${LuaCodeStyle_SOURCE_DIR}/3rd/asio-1.20.0/include
1212
${LuaCodeStyle_SOURCE_DIR}/3rd/nlohmann_json/include
13-
${LuaCodeStyle_SOURCE_DIR}/3rd/mimalloc-2.0.3/include
13+
#${LuaCodeStyle_SOURCE_DIR}/3rd/mimalloc-2.0.3/include
1414
src
1515
)
1616

@@ -43,7 +43,7 @@ target_sources(CodeFormatServer
4343
${CodeFormatServer_SOURCE_DIR}/src/VSCode.cpp
4444

4545
# mimalloc
46-
${LuaCodeStyle_SOURCE_DIR}/3rd/mimalloc-2.0.3/src/static.c
46+
#${LuaCodeStyle_SOURCE_DIR}/3rd/mimalloc-2.0.3/src/static.c
4747
)
4848

4949
target_link_libraries(CodeFormatServer PUBLIC CodeService)

CodeFormatServer/src/CodeFormatServer.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
#include "CodeFormatServer/LanguageClient.h"
44
#include "CodeFormatServer/Session/SocketIOSession.h"
55
#include "CodeFormatServer/Session/StandardIOSession.h"
6-
6+
#include <thread>
77
// https://stackoverflow.com/questions/1598985/c-read-binary-stdin
88
#ifdef _WIN32
99
# include <io.h>
1010
# include <fcntl.h>
1111
# define SET_BINARY_MODE() _setmode(_fileno(stdin), _O_BINARY);\
1212
_setmode(_fileno(stdout), _O_BINARY)
1313
#else
14-
# define SET_BINARY_MODE() ((void)0)
14+
# include <sys/io.h>
15+
# include <fcntl.h>
16+
# define SET_BINARY_MODE() (void)0
1517
#endif
1618

1719
using namespace asio::ip;
@@ -23,7 +25,8 @@ int main(int argc, char** argv)
2325
{
2426
int port = std::stoi(argv[1]);
2527
asio::io_context ioc(1);
26-
tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), port));
28+
29+
tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), port));
2730
while(true)
2831
{
2932
auto socket = acceptor.accept();
Lines changed: 93 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,90 @@
11
#include "CodeFormatServer/Session/StandardIOSession.h"
22

33
#include <iostream>
4-
#include <thread>
4+
5+
#ifndef _WIN32
6+
#include <asio.hpp>
7+
#include <unistd.h>
8+
#endif
59
#include "CodeFormatServer/Protocol/ProtocolParser.h"
610
#include "CodeFormatServer/Protocol/ProtocolBuffer.h"
711

12+
13+
class StandardIO
14+
{
15+
public:
16+
static StandardIO& GetInstance();
17+
18+
StandardIO();
19+
20+
std::size_t ReadSome(char* buffer, std::size_t maxSize);
21+
22+
bool HasError();
23+
24+
void Write(std::string_view content);
25+
private:
26+
#ifndef _WIN32
27+
asio::io_context _ioc;
28+
asio::error_code _code;
29+
std::shared_ptr<asio::posix::stream_descriptor> _in;
30+
std::shared_ptr<asio::posix::stream_descriptor> _out;
31+
#endif
32+
};
33+
34+
StandardIO& StandardIO::GetInstance()
35+
{
36+
static StandardIO instance;
37+
return instance;
38+
}
39+
40+
#ifndef _WIN32
41+
StandardIO::StandardIO()
42+
:_ioc(1)
43+
{
44+
_in = std::make_shared<asio::posix::stream_descriptor>(_ioc, STDIN_FILENO);
45+
_out = std::make_shared<asio::posix::stream_descriptor>(_ioc, STDOUT_FILENO);
46+
}
47+
48+
std::size_t StandardIO::ReadSome(char* buffer, std::size_t maxSize)
49+
{
50+
return _in->read_some(asio::buffer(buffer, maxSize), _code);
51+
}
52+
53+
bool StandardIO::HasError()
54+
{
55+
return _code == asio::error::eof || _code;
56+
}
57+
58+
void StandardIO::Write(std::string_view content)
59+
{
60+
_out->write_some(asio::buffer(content.data(),content.size()));
61+
}
62+
63+
#else
64+
StandardIO::StandardIO()
65+
{
66+
}
67+
68+
std::size_t StandardIO::ReadSome(char* buffer, std::size_t maxSize)
69+
{
70+
std::cin.peek();
71+
return std::cin.readsome(buffer, maxSize);
72+
}
73+
74+
bool StandardIO::HasError()
75+
{
76+
return !std::cin;
77+
}
78+
79+
void StandardIO::Write(std::string_view content)
80+
{
81+
std::cout.write(content.data(), content.size());
82+
}
83+
84+
85+
#endif
86+
87+
888
void StandardIOSession::Run()
989
{
1090

@@ -15,9 +95,9 @@ void StandardIOSession::Run()
1595
char* writableCursor = _protocolBuffer.GetWritableCursor();
1696
std::size_t capacity = _protocolBuffer.GetRestCapacity();
1797

18-
std::cin.peek();
19-
std::size_t readSize = std::cin.readsome(writableCursor, capacity);
20-
if (!std::cin)
98+
std::size_t readSize = StandardIO::GetInstance().ReadSome(writableCursor, capacity);
99+
100+
if(StandardIO::GetInstance().HasError())
21101
{
22102
goto endLoop;
23103
}
@@ -30,23 +110,26 @@ void StandardIOSession::Run()
30110
}
31111

32112
_protocolBuffer.FitCapacity();
113+
}
114+
while (true);
33115

34-
} while (true);
35-
36-
do {
116+
do
117+
{
37118
std::string result = Handle(_protocolBuffer.ReadOneProtocol());
38119

39120
_protocolBuffer.Reset();
40-
if (!result.empty()) {
121+
if (!result.empty())
122+
{
41123
Send(result);
42124
}
43-
} while (_protocolBuffer.CanReadOneProtocol());
125+
}
126+
while (_protocolBuffer.CanReadOneProtocol());
44127
}
45128
endLoop:
46129
return;
47130
}
48131

49132
void StandardIOSession::Send(std::string_view content)
50133
{
51-
std::cout.write(content.data(), content.size());
134+
StandardIO::GetInstance().Write(content);
52135
}

include/CodeFormatServer/Session/StandardIOSession.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "IOSession.h"
44

5+
56
class StandardIOSession: public IOSession
67
{
78
public:

0 commit comments

Comments
 (0)