Pagefaulting in lock instruction

Tiago Jorge tjpj at lasige.di.fc.ul.pt
Wed May 4 12:08:26 CEST 2005


hello...
I'm having a strange page fault in my program.
My server has an object called Consensus. This object its responsable in 
the system to do consensus about something... an has an inner thread 
that receives some parameters from outside.

its header file its the following

##################################################

#ifndef CONSENSUS_H
#define CONSENSUS_H

#include <fcntl.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <l4/thread/thread.h>
#include <l4/log/l4log.h>
#include <l4/lock/lock.h>

#include "WOO_vector.h"
#include "WOO_map.h"
#include "WOO_string.h"

#include "FailureDetector.h"
#include "Consensus_Packet.h"
#include "WOO_TMO.h"
#include "WOO_Groups.h"
#include "WOO_common.h"
#include "WOO_member.h"

#define CONSENSUS_PORTNUMBER 30987

struct estimate{
  int eid;
  vector<string> myEstimate;
};

class Consensus{
private:
  int sock;
  int trueFlag;
  socklen_t addrLength;
  struct sockaddr_in destinationAddr;
  struct sockaddr_in myAddr;
  struct sockaddr_in responseAddr;
  estimate est;
  phases current_phase;
  bool mustRunConsensus;
  //l4lock_t consensus_lock;
  l4thread_t consTh;
  int consensus_id;
 
  //params
  int myEid;
  vector<WOO_member>    *eids;
  l4lock_t              *group_lock;
  map<string, CWOO_TMO> *addr_TMO_running;
  l4lock_t              *lock_TMO_running;
  map<string, CWOO_TMO> *addr_TMO_decided;
  l4lock_t              *lock_TMO_decided;
  vector<CWOO_Groups>   *addr_WOO_groups_table;
  l4lock_t              *lock_WOO_groups_table;
public:
  l4lock_t consensus_lock;

private:
  void initialize_comm();
  bool amICoordinator(vector<WOO_member> v);
  int  coordinator(vector<WOO_member> v);
  void copyGroup(vector<WOO_member> *toFill);
  bool deadCoordinator(vector<WOO_member> v, FailureDetector *fd);
  void cleanFailures(vector<WOO_member> *toClean, FailureDetector *fd);
  void consensus_broadcast(vector<WOO_member> *toBroadcast, phases 
phase, packet_type packet, int consensus_round);
  vector<string> buildEstimate();
  bool moreConsensus();
  void decide();
public:
  Consensus();
  void start(int eid,
             vector<WOO_member>    *new_eids,
             l4lock_t              *new_group_lock,
             map<string, CWOO_TMO> *p_addr_TMO_running,
             l4lock_t              *p_lock_TMO_running,
             map<string, CWOO_TMO> *p_addr_TMO_decided,
             l4lock_t              *p_lock_TMO_decided,
             vector<CWOO_Groups>   *p_addr_WOO_groups_table,
             l4lock_t              *p_lock_WOO_groups_table);
  void consensus_impl();
  void startConsensus();
  void stopConsensus();
  bool get_mustRunConsensus();
};

void helper_consensus(void *args);

#endif // CONSENSUS_H

##################################################

when someone wants to start the program we invoke start() that has this 
code...

##################################################

//passar aqui as TMOdecided e as TMOrunning e respectivos locks
void
Consensus::start (int new_eid,
          vector < WOO_member > *new_eids,
          l4lock_t * new_group_lock,
          map < string, CWOO_TMO > *p_addr_TMO_running,
          l4lock_t * p_lock_TMO_running,
          map < string, CWOO_TMO > *p_addr_TMO_decided,
          l4lock_t * p_lock_TMO_decided,
          vector < CWOO_Groups > *p_addr_WOO_groups_table,
          l4lock_t * p_lock_WOO_groups_table)
{
  myEid = new_eid;
  eids = new_eids;
  group_lock = new_group_lock;
  consensus_id = 0;
  trueFlag = 0x1;

  consensus_lock = L4LOCK_UNLOCKED;

  addr_TMO_running = p_addr_TMO_running;
  lock_TMO_running = p_lock_TMO_running;
  addr_TMO_decided = p_addr_TMO_decided;
  lock_TMO_decided = p_lock_TMO_decided;
  addr_WOO_groups_table = p_addr_WOO_groups_table;
  lock_WOO_groups_table = p_lock_WOO_groups_table;

  /*consTh = l4thread_create (helper_consensus, this, 
L4THREAD_CREATE_ASYNC);*/

  this->startConsensus();
  this->consensus_impl();
 
  LOG ("estou dps do thread create\n");
}

##################################################

for testing porpuses the l4thread_create method its commented because 
its page faulting also :(.
Because it page-faulted when i've called the object's method that its 
inside helper_consensus...

##################################################

void
helper_consensus (void *args)
{
  Consensus *cobj = static_cast<Consensus *>(args);
  cobj->consensus_impl();
}

##################################################

i thought it was pagefaulting because of this method... but no... he 
page-faults event when called normally... but the focus of the problem 
it's not here yet.

when i call the startConsensus() method it page-faults in the 
l4lock_lock(...) instruction...
the method looks like this

##################################################

void
Consensus::startConsensus ()
{
  l4lock_lock(&consensus_lock); <---- it page faults here...
  LOG("inside\n");
  mustRunConsensus = true;
  est.myEstimate = this->buildEstimate ();
  LOG("out\n");
  l4lock_unlock(&consensus_lock);
}

##################################################

here it is the dissassembled output...

##################################################

<Consensus::startConsensus()>:
/home/tiago/l4/pkg/WOO/server/src/Consensus_udp.cc:178
01db6a50        push   %ebp
01db6a51        mov    %esp,%ebp
01db6a53        push   %edi
01db6a54        push   %esi
01db6a55        push   %ebx
01db6a56        sub    $0xc37c,%esp
01db6a5c        mov    8(%ebp),%ebx
/home/tiago/l4/include/l4/lock/lock.h:97
01db6a5f        lea    0xc3c8(%ebx),%eax
01db6a65        mov    %eax,0xffff3c84(%ebp) <<--- PAGE FAULT 
HERE!!!!!!!!!!!!
/home/tiago/l4/include/l4/lock/lock.h:98
01db6a6b        call   0x1dc0e80 <l4thread_myself>
/home/tiago/l4/include/l4/lock/lock.h:101
01db6a70        mov    0xffff3c84(%ebp),%ecx
/home/tiago/l4/include/l4/lock/lock.h:98
01db6a76        mov    %eax,0xffff3c80(%ebp)
/home/tiago/l4/include/l4/lock/lock.h:101
01db6a7c        test   %ecx,%ecx
01db6a7e        je     0x1db6aa6

##################################################

as of my inexperience with Fiasco debug issues... what might be causing 
this?

thanks for your all your help...(and yes... i'm just about to finish my 
project)

Tiago Jorge






More information about the l4-hackers mailing list