Exemplo n.º 1
0
extern "C" void *mmap(void *addr, size_t length, int prot, int flags,
                      int fd, off_t offset)
{
  DMTCP_PLUGIN_DISABLE_CKPT();
  void *retval = _real_mmap(addr, length, prot, flags, fd, offset);
  DMTCP_PLUGIN_ENABLE_CKPT();
  return retval;
}
Exemplo n.º 2
0
/* mmap/mmap64
 * TODO: Remove the PROT_WRITE flag on REPLAY phase if it was not part of
 *       original flags.
 * FIXME: MAP_SHARED areas are restored as MAP_PRIVATE, check for correctness.
 */
extern "C" void *mmap(void *addr, size_t length, int prot, int flags,
                      int fd, off_t offset)
{
  SET_IN_MMAP_WRAPPER();
  MMAP_WRAPPER_HEADER(mmap, addr, length, prot, flags, fd, offset);
  if (SYNC_IS_REPLAY) {
    bool mmap_read_from_readlog = false;
    MMAP_WRAPPER_REPLAY_START(mmap);
    //JWARNING ( addr == NULL ).Text("Unimplemented to have non-null addr.");
    addr = GET_COMMON(my_entry, retval);
    if (retval != MAP_FAILED && fd != -1 &&
        ((flags & MAP_PRIVATE) != 0 || (flags & MAP_SHARED) != 0)) {
      flags &= ~MAP_SHARED;
      flags |= MAP_PRIVATE;
      flags |= MAP_ANONYMOUS;
      fd = -1;
      offset = 0;
      size_t page_size = sysconf(_SC_PAGESIZE);
      size_t page_mask = ~(page_size - 1);
      length = (length + page_size - 1) & page_mask ;
      mmap_read_from_readlog = true;
    }
    flags |= MAP_FIXED;
    retval = _real_mmap (addr, length, prot | PROT_WRITE, flags, fd, offset);
    if (retval != GET_COMMON(my_entry, retval)) sleep(20);
    JASSERT ( retval == GET_COMMON(my_entry, retval) ) (retval)
      (GET_COMMON(my_entry, retval)) (JASSERT_ERRNO);
    if (mmap_read_from_readlog) {
      WRAPPER_REPLAY_READ_FROM_READ_LOG(mmap, retval, length);
    }
    MMAP_WRAPPER_REPLAY_END(mmap);
  } else if (SYNC_IS_RECORD) {
    _real_pthread_mutex_lock(&mmap_lock);
    retval = _real_mmap (addr, length, prot, flags, fd, offset);
    if (retval != MAP_FAILED && fd != -1 &&
        ((flags & MAP_PRIVATE) != 0 || (flags & MAP_SHARED) != 0)) {
      WRAPPER_LOG_WRITE_INTO_READ_LOG(mmap, retval, length);
    }
    WRAPPER_LOG_WRITE_ENTRY(my_entry);
    _real_pthread_mutex_unlock(&mmap_lock);
  }
  UNSET_IN_MMAP_WRAPPER();
  return retval;
}
Exemplo n.º 3
0
/* This could either be a normal dmtcp wrapper, or a hook function which calls
   a normal dmtcp wrapper. In this case, this is just a hook function which
   calls the real mmap wrapper (in mallocwrappers.cpp). I did it this way so
   that the real mmap wrapper could be relatively unchanged. Also, this way the
   default is to go through the regular mmap wrapper, and only if a call to
   mmap misses the wrapper does it go through the trampoline maze. */
static void *mmap_wrapper(void *addr, size_t length, int prot,
                          int flags, int fd, off_t offset)
{
  void *retval;
  if (IN_MMAP_WRAPPER || MMAP_NO_SYNC) {
    retval = _real_mmap(addr,length,prot,flags,fd,offset);
  } else {
    retval = mmap(addr,length,prot,flags,fd,offset);
  }
  return retval;
}