Commit f3110e9007ab0636ee8872fba262b009c759c152
1 parent
19f21bf2
Construct clients
Showing
6 changed files
with
96 additions
and
6 deletions
CMakeLists.txt
| @@ -6,6 +6,6 @@ set(CMAKE_CXX_STANDARD 11) | @@ -6,6 +6,6 @@ set(CMAKE_CXX_STANDARD 11) | ||
| 6 | set(CMAKE_CXX_STANDARD_REQUIRED ON) | 6 | set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | -add_executable(FlashMQ main.cpp utils.cpp threaddata.cpp) | 9 | +add_executable(FlashMQ main.cpp utils.cpp threaddata.cpp client.cpp) |
| 10 | 10 | ||
| 11 | target_link_libraries(FlashMQ pthread) | 11 | target_link_libraries(FlashMQ pthread) |
client.cpp
0 → 100644
| 1 | +#include "client.h" | ||
| 2 | + | ||
| 3 | +Client::Client(int fd, ThreadData &threadData) : | ||
| 4 | + fd(fd), | ||
| 5 | + threadData(threadData) | ||
| 6 | +{ | ||
| 7 | + int flags = fcntl(fd, F_GETFL); | ||
| 8 | + fcntl(fd, F_SETFL, flags | O_NONBLOCK); | ||
| 9 | +} | ||
| 10 | + | ||
| 11 | +Client::~Client() | ||
| 12 | +{ | ||
| 13 | + epoll_ctl(threadData.epollfd, EPOLL_CTL_DEL, fd, NULL); // NOTE: the last NULL can cause crash on old kernels | ||
| 14 | + close(fd); | ||
| 15 | +} |
client.h
0 → 100644
| 1 | +#ifndef CLIENT_H | ||
| 2 | +#define CLIENT_H | ||
| 3 | + | ||
| 4 | +#include <fcntl.h> | ||
| 5 | +#include <unistd.h> | ||
| 6 | + | ||
| 7 | +#include "threaddata.h" | ||
| 8 | + | ||
| 9 | +class ThreadData; | ||
| 10 | + | ||
| 11 | +class Client | ||
| 12 | +{ | ||
| 13 | + int fd; | ||
| 14 | + | ||
| 15 | + // maybe read buffer? | ||
| 16 | + | ||
| 17 | + ThreadData &threadData; | ||
| 18 | + | ||
| 19 | +public: | ||
| 20 | + Client(int fd, ThreadData &threadData); | ||
| 21 | + ~Client(); | ||
| 22 | + | ||
| 23 | + int getFd() { return fd;} | ||
| 24 | + | ||
| 25 | +}; | ||
| 26 | + | ||
| 27 | +typedef std::shared_ptr<Client> Client_p; | ||
| 28 | + | ||
| 29 | +#endif // CLIENT_H |
main.cpp
| @@ -9,6 +9,7 @@ | @@ -9,6 +9,7 @@ | ||
| 9 | 9 | ||
| 10 | #include "utils.h" | 10 | #include "utils.h" |
| 11 | #include "threaddata.h" | 11 | #include "threaddata.h" |
| 12 | +#include "client.h" | ||
| 12 | 13 | ||
| 13 | #define MAX_EVENTS 1024 | 14 | #define MAX_EVENTS 1024 |
| 14 | #define NR_OF_THREADS 4 | 15 | #define NR_OF_THREADS 4 |
| @@ -17,7 +18,31 @@ | @@ -17,7 +18,31 @@ | ||
| 17 | 18 | ||
| 18 | void do_thread_work(ThreadData &threadData) | 19 | void do_thread_work(ThreadData &threadData) |
| 19 | { | 20 | { |
| 21 | + int epoll_fd = threadData.epollfd; | ||
| 20 | 22 | ||
| 23 | + struct epoll_event events[MAX_EVENTS]; | ||
| 24 | + memset(&events, 0, sizeof (struct epoll_event)*MAX_EVENTS); | ||
| 25 | + | ||
| 26 | + while (1) | ||
| 27 | + { | ||
| 28 | + int fdcount = epoll_wait(epoll_fd, events, MAX_EVENTS, 100); | ||
| 29 | + | ||
| 30 | + if (fdcount > 0) | ||
| 31 | + { | ||
| 32 | + for (int i = 0; i < fdcount; i++) | ||
| 33 | + { | ||
| 34 | + struct epoll_event cur_ev = events[i]; | ||
| 35 | + int fd = cur_ev.data.fd; | ||
| 36 | + | ||
| 37 | + Client_p client = threadData.getClient(fd); | ||
| 38 | + | ||
| 39 | + if (client) // TODO: is this check necessary? | ||
| 40 | + { | ||
| 41 | + // TODO left here | ||
| 42 | + } | ||
| 43 | + } | ||
| 44 | + } | ||
| 45 | + } | ||
| 21 | } | 46 | } |
| 22 | 47 | ||
| 23 | int main() | 48 | int main() |
| @@ -81,9 +106,8 @@ int main() | @@ -81,9 +106,8 @@ int main() | ||
| 81 | socklen_t len = sizeof(struct sockaddr); | 106 | socklen_t len = sizeof(struct sockaddr); |
| 82 | int fd = check<std::runtime_error>(accept(cur_fd, &addr, &len)); | 107 | int fd = check<std::runtime_error>(accept(cur_fd, &addr, &len)); |
| 83 | 108 | ||
| 84 | - // TODO: make client | ||
| 85 | - | ||
| 86 | - thread_data.giveFdToEpoll(fd); | 109 | + Client_p client(new Client(fd, thread_data)); |
| 110 | + thread_data.giveClient(client); | ||
| 87 | } | 111 | } |
| 88 | else | 112 | else |
| 89 | { | 113 | { |
threaddata.cpp
| @@ -8,11 +8,24 @@ ThreadData::ThreadData(int threadnr) : | @@ -8,11 +8,24 @@ ThreadData::ThreadData(int threadnr) : | ||
| 8 | event_fd = eventfd(0, EFD_NONBLOCK); | 8 | event_fd = eventfd(0, EFD_NONBLOCK); |
| 9 | } | 9 | } |
| 10 | 10 | ||
| 11 | -void ThreadData::giveFdToEpoll(int fd) | 11 | +void ThreadData::giveClient(Client_p client) |
| 12 | { | 12 | { |
| 13 | + int fd = client->getFd(); | ||
| 13 | struct epoll_event ev; | 14 | struct epoll_event ev; |
| 14 | memset(&ev, 0, sizeof (struct epoll_event)); | 15 | memset(&ev, 0, sizeof (struct epoll_event)); |
| 15 | ev.data.fd = fd; | 16 | ev.data.fd = fd; |
| 16 | ev.events = EPOLLIN; | 17 | ev.events = EPOLLIN; |
| 17 | check<std::runtime_error>(epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev)); | 18 | check<std::runtime_error>(epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev)); |
| 19 | + | ||
| 20 | + clients_by_fd[fd] = client; | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +Client_p ThreadData::getClient(int fd) | ||
| 24 | +{ | ||
| 25 | + return this->clients_by_fd[fd]; | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +void ThreadData::removeClient(Client_p client) | ||
| 29 | +{ | ||
| 30 | + clients_by_fd.erase(client->getFd()); | ||
| 18 | } | 31 | } |
threaddata.h
| @@ -5,9 +5,16 @@ | @@ -5,9 +5,16 @@ | ||
| 5 | #include "utils.h" | 5 | #include "utils.h" |
| 6 | #include <sys/epoll.h> | 6 | #include <sys/epoll.h> |
| 7 | #include <sys/eventfd.h> | 7 | #include <sys/eventfd.h> |
| 8 | +#include "client.h" | ||
| 9 | +#include <map> | ||
| 10 | + | ||
| 11 | +class Client; | ||
| 12 | +typedef std::shared_ptr<Client> Client_p; | ||
| 8 | 13 | ||
| 9 | class ThreadData | 14 | class ThreadData |
| 10 | { | 15 | { |
| 16 | + std::map<int, Client_p> clients_by_fd; | ||
| 17 | + | ||
| 11 | public: | 18 | public: |
| 12 | std::thread thread; | 19 | std::thread thread; |
| 13 | int threadnr = 0; | 20 | int threadnr = 0; |
| @@ -16,7 +23,9 @@ public: | @@ -16,7 +23,9 @@ public: | ||
| 16 | 23 | ||
| 17 | ThreadData(int threadnr); | 24 | ThreadData(int threadnr); |
| 18 | 25 | ||
| 19 | - void giveFdToEpoll(int fd); | 26 | + void giveClient(Client_p client); |
| 27 | + Client_p getClient(int fd); | ||
| 28 | + void removeClient(Client_p client); | ||
| 20 | }; | 29 | }; |
| 21 | 30 | ||
| 22 | #endif // THREADDATA_H | 31 | #endif // THREADDATA_H |