11399713c5
Before this fix running under tsan produces following warning:
```
00:00 +0: httpGet
00:03 +1: httpServe
00:04 +2: All tests passed!
/usr/bin/addr2line: DWARF error: mangled line number section (bad file number)
/usr/bin/addr2line: DWARF error: mangled line number section (bad file number)
/usr/bin/addr2line: DWARF error: mangled line number section (bad file number)
/usr/bin/addr2line: DWARF error: mangled line number section (bad file number)
/usr/bin/addr2line: DWARF error: mangled line number section (bad file number)
==================
WARNING: ThreadSanitizer: signal-unsafe call inside of a signal (pid=145964)
#0 malloc ../../../../../../llvm-llvm-project/../../../../../../llvm-llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:676 (dartvm+0x21c9330) (BuildId: d195bc5e9885ab144039c676e433289217750aec)
#1 __dcigettext intl/./intl/dcigettext.c:621 (libc.so.6+0x39f23) (BuildId: 4a95b54430cb5a2c68c1812f1738222660dec6d1)
#2 __tsan::CallUserSignalHandler(__tsan::ThreadState*, bool, bool, int, __sanitizer::__sanitizer_siginfo*, void*) ../../../../../../llvm-llvm-project/../../../../../../llvm-llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:2149 (dartvm+0x21d34af) (BuildId: d195bc5e9885ab144039c676e433289217750aec)
SUMMARY: ThreadSanitizer: signal-unsafe call inside of a signal intl/./intl/dcigettext.c:621 in __dcigettext
==================
ThreadSanitizer: reported 1 warnings
```
TEST=samples/ffi/http
Change-Id: I4cd1b62d30cde3ff0d4cd5f6a23c33e36491884a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/445284
Commit-Queue: Alexander Aprelev <aam@google.com>
Reviewed-by: Liam Appelbe <liama@google.com>
60 lines
1.5 KiB
C++
60 lines
1.5 KiB
C++
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#include <atomic>
|
|
#include <chrono>
|
|
#include <cstring>
|
|
#include <thread>
|
|
|
|
#if defined(_WIN32)
|
|
#define DART_EXPORT extern "C" __declspec(dllexport)
|
|
#else
|
|
#define DART_EXPORT \
|
|
extern "C" __attribute__((visibility("default"))) __attribute((used))
|
|
#endif
|
|
|
|
constexpr char kExampleRequest[] = R"(
|
|
GET / HTTP/1.1
|
|
Host: www.example.com
|
|
)";
|
|
|
|
constexpr char kExampleResponse[] = R"(
|
|
HTTP/1.1 200 OK
|
|
Content-Length: 54
|
|
Content-Type: text/html; charset=UTF-8
|
|
|
|
<html>
|
|
<body>
|
|
Hello world!
|
|
</body>
|
|
</html>
|
|
)";
|
|
|
|
DART_EXPORT void http_get(const char* uri, void (*onResponse)(const char*)) {
|
|
std::thread([onResponse]() {
|
|
std::this_thread::sleep_for(std::chrono::seconds(3));
|
|
onResponse(kExampleResponse);
|
|
}).detach();
|
|
}
|
|
|
|
std::atomic<bool> stop_requested = false;
|
|
std::thread* server = nullptr;
|
|
|
|
DART_EXPORT void http_start_serving(void (*onRequest)(const char*)) {
|
|
server = new std::thread([onRequest]() {
|
|
while (!stop_requested) {
|
|
std::this_thread::sleep_for(std::chrono::seconds(1));
|
|
onRequest(kExampleRequest);
|
|
}
|
|
});
|
|
}
|
|
|
|
DART_EXPORT void http_stop_serving() {
|
|
if (server != nullptr) {
|
|
stop_requested = true;
|
|
server->join();
|
|
delete server;
|
|
server = nullptr;
|
|
}
|
|
} |