Yesterday I got another core dump and, again, it was like the previous ones:
#1 0x0000000000412927 in TCP_Client::unblock_handler (closure=0x1ffa030) at
TCP_Client.c++:270
I checked the assertions were indeed compiled in, by (gdb) disass
((TCP_Client*)$closure)->dequeue_from_scan, which ended with:
0x00000000004129e4 <+84>: callq 0x402310 <__assert_fail@plt>
Yet, those assertions didn't catch anything. So I must have extracted from
client->to_be_scanned an ip with vtbl[4] == 0, which was never put into the
set. That suggests that Set.h doesn't work as expected. To check the latter
hypothesis, I modified TCP_Client.h so as to use a standard set instead:
--- fam2/fam-2.7.0/build-tree/fam-2.7.0/src/TCP_Client.h 2003-01-18
15:18:12.000000000 +0100
+++ fam/fam-2.7.0/build-tree/fam-2.7.0/src/TCP_Client.h 2018-03-30
10:53:03.000000000 +0200
@@ -25,9 +25,28 @@
#include "ClientConnection.h"
#include "MxClient.h"
-#include "Set.h"
+
+// use std::set instead
+//#include "Set.h"
+#include <set>
#include "Cred.h"
+class stdset : public std::set<Interest *>
+{
+public:
+ // Inherit insert(), size()
+ bool contains(const key_type e) {return find(e) != end();}
+ void remove(const key_type e) {erase(e);}
+ key_type first() const {return begin() == end()? NULL: *begin();}
+ key_type next(const key_type k) const {
+ const_iterator it = find(k);
+ if (it != end()) ++it;
+ if (it == end()) return NULL;
+ return *it;
+ }
+ // sizeofnode() method is not used
+};
+
struct sockaddr_un;
// A TCP_Client is a client that connects to fam using the TCP/IP
@@ -60,7 +79,8 @@ protected:
private:
- Set<Interest *> to_be_scanned;
+ // Set<Interest *> to_be_scanned;
+ stdset to_be_scanned;
Scanner *my_scanner;
ClientConnection conn;
Activity a; // simply declaring it
activates timer.
Waiting for next core dump...