Skip to content

Commit 0b75d2e

Browse files
authored
FreeBSD support (#131)
1 parent 7929d3e commit 0b75d2e

File tree

11 files changed

+57
-43
lines changed

11 files changed

+57
-43
lines changed

include/brynet/base/Platform.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#pragma comment(lib, "ws2_32")
66
#elif defined __APPLE_CC__ || defined __APPLE__
77
#define BRYNET_PLATFORM_DARWIN
8+
#elif defined __FreeBSD__
9+
#define BRYNET_PLATFORM_FREEBSD
810
#else
911
#define BRYNET_PLATFORM_LINUX
1012
#endif

include/brynet/base/endian/Endian.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
#ifdef BRYNET_PLATFORM_LINUX
1010
#include <endian.h>
11-
#elif defined BRYNET_PLATFORM_DARWIN
11+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
1212
#include <sys/_endian.h>
1313
#endif
1414

@@ -104,7 +104,7 @@ inline uint16_t networkToHost16(uint16_t net16, bool convert = true)
104104
{
105105
return convert ? be16toh(net16) : net16;
106106
}
107-
#elif defined BRYNET_PLATFORM_DARWIN
107+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
108108
inline uint64_t hostToNetwork64(uint64_t host64, bool convert = true)
109109
{
110110
return convert ? hl64ton(host64) : host64;
@@ -135,4 +135,4 @@ inline uint16_t networkToHost16(uint16_t net16, bool convert = true)
135135
}
136136
#endif
137137

138-
}}}// namespace brynet::base::endian
138+
}}}// namespace brynet::base::endian

include/brynet/net/CurrentThread.hpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include <sys/syscall.h>
1313
#include <sys/types.h>
1414
#include <unistd.h>
15-
#elif defined BRYNET_PLATFORM_DARWIN
15+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
1616
#include <sys/syscall.h>
1717
#include <sys/types.h>
1818
#include <unistd.h>
@@ -22,15 +22,19 @@ namespace brynet { namespace net { namespace current_thread {
2222

2323
#ifdef BRYNET_PLATFORM_WINDOWS
2424
using THREAD_ID_TYPE = DWORD;
25-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
25+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
26+
# if defined BRYNET_PLATFORM_FREEBSD
27+
using THREAD_ID_TYPE = pthread_t;
28+
# else
2629
using THREAD_ID_TYPE = int;
30+
# endif
2731
#endif
2832

2933
static THREAD_ID_TYPE& tid()
3034
{
3135
#ifdef BRYNET_PLATFORM_WINDOWS
3236
static __declspec(thread) THREAD_ID_TYPE cachedTid = 0;
33-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
37+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
3438
static __thread THREAD_ID_TYPE cachedTid = 0;
3539
#endif
3640

@@ -40,13 +44,17 @@ static THREAD_ID_TYPE& tid()
4044
cachedTid = GetCurrentThreadId();
4145
#elif defined BRYNET_PLATFORM_LINUX
4246
cachedTid = static_cast<pid_t>(::syscall(SYS_gettid));
43-
#elif defined BRYNET_PLATFORM_DARWIN
47+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
48+
# if defined BRYNET_PLATFORM_FREEBSD
49+
cachedTid = pthread_self();
50+
# else
4451
// warning: 'syscall' is deprecated:
4552
// first deprecated in macOS 10.12 - syscall(2) is unsupported;
4653
// please switch to a supported interface.
4754
uint64_t tid64;
4855
pthread_threadid_np(NULL, &tid64);
4956
cachedTid = (pid_t) tid64;
57+
# endif
5058
#endif
5159
}
5260

include/brynet/net/EventLoop.hpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class EventLoop : public brynet::base::NonCopyable
4040
mWakeupChannel(std::make_unique<detail::WakeupChannel>(mIOCP))
4141
#elif defined BRYNET_PLATFORM_LINUX
4242
mEpollFd(epoll_create(1))
43-
#elif defined BRYNET_PLATFORM_DARWIN
43+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
4444
mKqueueFd(kqueue())
4545
#endif
4646
{
@@ -58,7 +58,7 @@ class EventLoop : public brynet::base::NonCopyable
5858
auto eventfd = ::eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
5959
mWakeupChannel.reset(new detail::WakeupChannel(eventfd));
6060
linkChannel(eventfd, mWakeupChannel.get());
61-
#elif defined BRYNET_PLATFORM_DARWIN
61+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
6262
const int NOTIFY_IDENT = 42;// Magic number we use for our filter ID.
6363
mWakeupChannel.reset(new detail::WakeupChannel(mKqueueFd, NOTIFY_IDENT));
6464
//Add user event
@@ -73,7 +73,11 @@ class EventLoop : public brynet::base::NonCopyable
7373
mIsInBlock = true;
7474

7575
reAllocEventSize(1024);
76+
#if defined BRYNET_PLATFORM_FREEBSD
77+
mSelfThreadID = nullptr;
78+
#else
7679
mSelfThreadID = -1;
80+
#endif
7781
mTimer = std::make_shared<brynet::base::TimerMgr>();
7882
mSelfThreadIDIsInitialized.store(false);
7983
}
@@ -86,7 +90,7 @@ class EventLoop : public brynet::base::NonCopyable
8690
#elif defined BRYNET_PLATFORM_LINUX
8791
close(mEpollFd);
8892
mEpollFd = -1;
89-
#elif defined BRYNET_PLATFORM_DARWIN
93+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
9094
close(mKqueueFd);
9195
mKqueueFd = -1;
9296
#endif
@@ -187,7 +191,7 @@ class EventLoop : public brynet::base::NonCopyable
187191
channel->canSend();
188192
}
189193
}
190-
#elif defined BRYNET_PLATFORM_DARWIN
194+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
191195
struct timespec timeout = {milliseconds / 1000, (milliseconds % 1000) * 1000 * 1000};
192196
int numComplete = kevent(mKqueueFd, NULL, 0, mEventEntries.data(), mEventEntries.size(), &timeout);
193197

@@ -379,7 +383,7 @@ class EventLoop : public brynet::base::NonCopyable
379383
{
380384
return mEpollFd;
381385
}
382-
#elif defined BRYNET_PLATFORM_DARWIN
386+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
383387
int getKqueueHandle() const
384388
{
385389
return mKqueueFd;
@@ -397,7 +401,7 @@ class EventLoop : public brynet::base::NonCopyable
397401
ev.events = EPOLLET | EPOLLIN | EPOLLOUT | EPOLLRDHUP;
398402
ev.data.ptr = (void*) ptr;
399403
return epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &ev) == 0;
400-
#elif defined BRYNET_PLATFORM_DARWIN
404+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
401405
struct kevent ev[2];
402406
memset(&ev, 0, sizeof(ev));
403407
int n = 0;
@@ -443,7 +447,7 @@ class EventLoop : public brynet::base::NonCopyable
443447
#elif defined BRYNET_PLATFORM_LINUX
444448
std::vector<epoll_event> mEventEntries;
445449
int mEpollFd;
446-
#elif defined BRYNET_PLATFORM_DARWIN
450+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
447451
std::vector<struct kevent> mEventEntries;
448452
int mKqueueFd;
449453
#endif

include/brynet/net/Poller.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <cassert>
66
#include <cstdlib>
77

8-
#if defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
8+
#if defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
99
#include <poll.h>
1010
#endif
1111

@@ -15,7 +15,7 @@ namespace brynet { namespace base {
1515
const static int CHECK_READ_FLAG = (POLLIN | POLLRDNORM | POLLRDBAND);
1616
const static int CHECK_WRITE_FLAG = (POLLOUT | POLLWRNORM);
1717
const static int CHECK_ERROR_FLAG = (POLLERR | POLLHUP);
18-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
18+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
1919
const static int CHECK_READ_FLAG = (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI);
2020
const static int CHECK_WRITE_FLAG = (POLLOUT | POLLWRNORM | POLLWRBAND);
2121
const static int CHECK_ERROR_FLAG = (POLLERR | POLLHUP);
@@ -237,7 +237,7 @@ static int poller_poll(struct poller_s* self, long overtime)
237237
{
238238
#ifdef BRYNET_PLATFORM_WINDOWS
239239
int ret = WSAPoll(&self->pollFds[0], self->nfds, overtime);
240-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
240+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
241241
int ret = poll(self->pollFds, self->nfds, overtime);
242242
#endif
243243

include/brynet/net/SSLHelper.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static void cryptoSetThreadIDCallback(CRYPTO_THREADID* id)
3232
#ifdef BRYNET_PLATFORM_WINDOWS
3333
CRYPTO_THREADID_set_numeric(id,
3434
static_cast<unsigned long>(GetCurrentThreadId()));
35-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
35+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
3636
CRYPTO_THREADID_set_numeric(id,
3737
static_cast<unsigned long>(pthread_self()));
3838
#endif

include/brynet/net/Socket.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ class ListenSocket : public brynet::base::NonCopyable
161161
const auto clientFD = brynet::net::base::Accept(mFD, nullptr, nullptr);
162162
if (clientFD == BRYNET_INVALID_SOCKET)
163163
{
164-
#if defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
164+
#if defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
165165
if (BRYNET_ERRNO == EMFILE)
166166
{
167167
// Thanks libev and muduo.
@@ -204,7 +204,7 @@ class ListenSocket : public brynet::base::NonCopyable
204204
explicit ListenSocket(BrynetSocketFD fd)
205205
: mFD(fd)
206206
{
207-
#if defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
207+
#if defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
208208
mIdle = brynet::net::TcpSocket::Create(::open("/dev/null", O_RDONLY | O_CLOEXEC), true);
209209
#endif
210210
}
@@ -216,7 +216,7 @@ class ListenSocket : public brynet::base::NonCopyable
216216

217217
private:
218218
const BrynetSocketFD mFD;
219-
#if defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
219+
#if defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
220220
brynet::net::TcpSocket::Ptr mIdle;
221221
#endif
222222

include/brynet/net/SocketLibFunction.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static bool InitSocket()
2525
{
2626
ret = false;
2727
}
28-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
28+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
2929
signal(SIGPIPE, SIG_IGN);
3030
#endif
3131

@@ -51,7 +51,7 @@ static bool SocketBlock(BrynetSocketFD fd)
5151
unsigned long ul = false;
5252
#ifdef BRYNET_PLATFORM_WINDOWS
5353
err = ioctlsocket(fd, FIONBIO, &ul);
54-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
54+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
5555
err = ioctl(fd, FIONBIO, &ul);
5656
#endif
5757

@@ -64,7 +64,7 @@ static bool SocketNonblock(BrynetSocketFD fd)
6464
unsigned long ul = true;
6565
#ifdef BRYNET_PLATFORM_WINDOWS
6666
err = ioctlsocket(fd, FIONBIO, &ul);
67-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
67+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
6868
err = ioctl(fd, FIONBIO, &ul);
6969
#endif
7070

@@ -100,7 +100,7 @@ static void SocketClose(BrynetSocketFD fd)
100100
{
101101
#ifdef BRYNET_PLATFORM_WINDOWS
102102
::closesocket(fd);
103-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
103+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
104104
::close(fd);
105105
#endif
106106
}
@@ -226,7 +226,7 @@ static std::string getIPString(const struct sockaddr* sa)
226226
{
227227
#ifdef BRYNET_PLATFORM_WINDOWS
228228
using PAddrType = PVOID;
229-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
229+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
230230
using PAddrType = const void*;
231231
#endif
232232
char tmp[INET6_ADDRSTRLEN] = {0};
@@ -256,7 +256,7 @@ static std::string GetIPOfSocket(BrynetSocketFD fd)
256256
{
257257
return getIPString(&name);
258258
}
259-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
259+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
260260
struct sockaddr_in name = sockaddr_in();
261261
socklen_t namelen = sizeof(name);
262262
if (::getpeername(fd, (struct sockaddr*) &name, &namelen) == 0)
@@ -324,7 +324,7 @@ static bool IsSelfConnect(BrynetSocketFD fd)
324324
return localaddr.sin6_port == peeraddr.sin6_port && memcmp(&localaddr.sin6_addr.u.Byte,
325325
&peeraddr.sin6_addr.u.Byte,
326326
sizeof localaddr.sin6_addr.u.Byte) == 0;
327-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
327+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
328328
return localaddr.sin6_port == peeraddr.sin6_port && memcmp(&localaddr.sin6_addr.s6_addr,
329329
&peeraddr.sin6_addr.s6_addr,
330330
sizeof localaddr.sin6_addr.s6_addr) == 0;

include/brynet/net/SocketLibTypes.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
#include <sys/uio.h>
2828
#include <unistd.h>
2929

30-
#elif defined BRYNET_PLATFORM_DARWIN
30+
#elif defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
3131
#include <arpa/inet.h>
3232
#include <errno.h>
3333
#include <fcntl.h>
@@ -60,7 +60,7 @@ typedef SOCKET BrynetSocketFD;
6060
#define BRYNET_SOCKET_ERROR SOCKET_ERROR
6161
#define BRYNET_INVALID_SOCKET INVALID_SOCKET
6262

63-
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN
63+
#elif defined BRYNET_PLATFORM_LINUX || defined BRYNET_PLATFORM_DARWIN || defined BRYNET_PLATFORM_FREEBSD
6464
#define BRYNET_ERRNO errno
6565
#define BRYNET_ENOTSOCK EBADF
6666
#define BRYNET_EWOULDBLOCK EAGAIN

0 commit comments

Comments
 (0)