build in library mode - in progress

This commit is contained in:
Mohamed Boussaffa
2016-03-04 19:03:24 +08:00
parent 730a5c2624
commit faa5a99c9c
2 changed files with 83 additions and 43 deletions

View File

@@ -7,6 +7,7 @@
#include <atomic> #include <atomic>
#include <memory> #include <memory>
#include <thread> #include <thread>
#include <map>
////////////////////////////// //////////////////////////////
extern ProcList * processes; extern ProcList * processes;
@@ -17,8 +18,11 @@ extern Process * unknownip;
static std::shared_ptr<std::thread> monitor_thread_ptr; static std::shared_ptr<std::thread> monitor_thread_ptr;
static std::atomic_bool monitor_thread_run_flag(false); static std::atomic_bool monitor_thread_run_flag(false);
static NethogsMonitor::Callback monitor_udpate_callback; static NethogsMonitor::Callback monitor_udpate_callback;
static NethogsMonitorData monitor_data;
typedef std::map<int, NethogsAppUpdate> NethogsAppUpdateMap;
static NethogsAppUpdateMap monitor_update_data;
bool NethogsMonitor::_trace = false; bool NethogsMonitor::_trace = false;
bool NethogsMonitor::_promisc = false; bool NethogsMonitor::_promisc = false;
@@ -106,7 +110,7 @@ void NethogsMonitor::threadProc()
} }
if ( packets_read && needrefresh ) if (needrefresh)
{ {
needrefresh = false; needrefresh = false;
handleUpdate(); handleUpdate();
@@ -148,7 +152,13 @@ void NethogsMonitor::handleUpdate()
if (DEBUG) if (DEBUG)
std::cout << "PROC: Deleting process\n"; std::cout << "PROC: Deleting process\n";
monitor_data.apps_info.erase(curproc->getVal()->name); if( monitor_udpate_callback )
{
NethogsAppUpdate &data = monitor_update_data[curproc->getVal()->pid];
data.action = NethogsAppUpdate::Remove;
monitor_udpate_callback(data);
monitor_update_data.erase(curproc->getVal()->pid);
}
ProcList * todelete = curproc; ProcList * todelete = curproc;
Process * p_todelete = curproc->getVal(); Process * p_todelete = curproc->getVal();
@@ -156,7 +166,8 @@ void NethogsMonitor::handleUpdate()
{ {
previousproc->next = curproc->next; previousproc->next = curproc->next;
curproc = curproc->next; curproc = curproc->next;
} else { } else
{
processes = curproc->getNext(); processes = curproc->getNext();
curproc = processes; curproc = processes;
} }
@@ -167,36 +178,59 @@ void NethogsMonitor::handleUpdate()
} }
else else
{ {
NethogsMonitorData::Line& line = monitor_data.apps_info[curproc->getVal()->name]; int const pid = curproc->getVal()->pid;
if( line.app_name.empty() ) u_int32_t sent_bytes;
{ u_int32_t recv_bytes;
line.app_name = curproc->getVal()->name; float sent_kbs;
} float recv_kbs;
if( line.device_name != curproc->getVal()->devicename ) getkbps (curproc->getVal(), &sent_kbs, &recv_kbs);
{ gettotal (curproc->getVal(), &recv_bytes, &sent_bytes);
line.device_name = curproc->getVal()->devicename;
}
line.pid = curproc->getVal()->pid;
line.uid = curproc->getVal()->getUid();
getkbps (curproc->getVal(), &line.sent_kbs, &line.recv_kbs); if( monitor_udpate_callback )
gettotal (curproc->getVal(), &line.recv_bytes, &line.sent_bytes); {
//notify update
NethogsAppUpdate &data = monitor_update_data[pid];
bool data_change = false;
#define NHM_UPDATE_ONE_FIELD(TO,FROM) if((TO)!=(FROM)) { TO = FROM; data_change = true; }
NHM_UPDATE_ONE_FIELD( data.pid, pid )
NHM_UPDATE_ONE_FIELD( data.uid, curproc->getVal()->getUid() )
NHM_UPDATE_ONE_FIELD( data.app_name, curproc->getVal()->name )
NHM_UPDATE_ONE_FIELD( data.device_name, curproc->getVal()->devicename )
NHM_UPDATE_ONE_FIELD( data.sent_bytes, sent_bytes )
NHM_UPDATE_ONE_FIELD( data.recv_bytes, recv_bytes )
NHM_UPDATE_ONE_FIELD( data.sent_kbs, sent_kbs )
NHM_UPDATE_ONE_FIELD( data.recv_kbs, recv_kbs )
#undef NHM_UPDATE_ONE_FIELD
if( data_change )
{
data.action = NethogsAppUpdate::Set;
monitor_udpate_callback(data);
}
}
//next
previousproc = curproc; previousproc = curproc;
curproc = curproc->next; curproc = curproc->next;
} }
} }
monitor_udpate_callback(monitor_data);
} }
void NethogsMonitor::start(NethogsMonitor::Callback const& cb) void NethogsMonitor::registerUpdateCallback(Callback const& cb)
{
if( !monitor_thread_run_flag )
{
monitor_udpate_callback = cb;
}
}
void NethogsMonitor::start()
{ {
bool expected = false; bool expected = false;
if( monitor_thread_run_flag.compare_exchange_strong(expected, true) ) if( monitor_thread_run_flag.compare_exchange_strong(expected, true) )
{ {
monitor_udpate_callback = cb; monitor_thread_ptr = std::make_shared<std::thread>(&NethogsMonitor::threadProc);
monitor_thread_ptr = std::make_shared<std::thread>(&threadProc);
} }
} }

View File

@@ -1,38 +1,44 @@
#ifndef NETHOGSMINITOR_H #ifndef NETHOGSMINITOR_H
#define NETHOGSMINITOR_H #define NETHOGSMINITOR_H
#include <functional> #include <string>
#include <map>
#define NETHOGS_DSO_VISIBLE __attribute__ ((visibility ("default"))) #define NETHOGS_DSO_VISIBLE __attribute__ ((visibility ("default")))
#define NETHOGS_DSO_HIDDEN __attribute__ ((visibility ("hidden"))) #define NETHOGS_DSO_HIDDEN __attribute__ ((visibility ("hidden")))
class NETHOGS_DSO_VISIBLE NethogsMonitorData class NETHOGS_DSO_VISIBLE NethogsAppUpdate
{ {
public: public:
class Line enum Action {Set, Remove};
NethogsAppUpdate()
: action(Set), pid(0), uid(0), sent_kbs(0), recv_kbs(0)
{ {
public: }
Action action;
int pid;
u_int32_t uid;
std::string app_name; std::string app_name;
std::string device_name; std::string device_name;
int uid;
int pid;
u_int32_t sent_bytes; u_int32_t sent_bytes;
u_int32_t recv_bytes; u_int32_t recv_bytes;
float sent_kbs; float sent_kbs;
float recv_kbs; float recv_kbs;
};
typedef std::map<std::string, Line> TAppMap;
TAppMap apps_info;
}; };
class NETHOGS_DSO_VISIBLE NethogsMonitor class NETHOGS_DSO_VISIBLE NethogsMonitor
{ {
NethogsMonitor(); NethogsMonitor();
public: public:
typedef std::function<void(NethogsMonitorData const&)> Callback; typedef void(*Callback)(NethogsAppUpdate const&);
static void start(Callback const& cb); //register async callback to receive updates
//have to be called before start
static void registerUpdateCallback(Callback const& cb);
//start the monitor
static void start();
//stop the monitor
static void stop(); static void stop();
private: private: