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; }
/* 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; }
/* 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; }