1254721Semaste//===-- ConnectionSharedMemory.cpp ----------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/Core/ConnectionSharedMemory.h" 11254721Semaste 12254721Semaste// C Includes 13254721Semaste#include <errno.h> 14254721Semaste#include <pthread.h> 15254721Semaste#include <stdlib.h> 16254721Semaste#include <sys/file.h> 17254721Semaste#include <sys/mman.h> 18254721Semaste#include <sys/stat.h> 19254721Semaste#include <sys/types.h> 20254721Semaste 21254721Semaste// C++ Includes 22254721Semaste// Other libraries and framework includes 23254721Semaste// Project includes 24254721Semaste#include "lldb/lldb-private-log.h" 25254721Semaste#include "lldb/Core/Communication.h" 26254721Semaste#include "lldb/Core/Log.h" 27254721Semaste 28254721Semasteusing namespace lldb; 29254721Semasteusing namespace lldb_private; 30254721Semaste 31254721SemasteConnectionSharedMemory::ConnectionSharedMemory () : 32254721Semaste Connection(), 33254721Semaste m_name(), 34254721Semaste m_fd (-1), 35254721Semaste m_mmap() 36254721Semaste{ 37254721Semaste} 38254721Semaste 39254721SemasteConnectionSharedMemory::~ConnectionSharedMemory () 40254721Semaste{ 41254721Semaste Disconnect (NULL); 42254721Semaste} 43254721Semaste 44254721Semastebool 45254721SemasteConnectionSharedMemory::IsConnected () const 46254721Semaste{ 47254721Semaste return m_fd >= 0; 48254721Semaste} 49254721Semaste 50254721SemasteConnectionStatus 51254721SemasteConnectionSharedMemory::Connect (const char *s, Error *error_ptr) 52254721Semaste{ 53254721Semaste// if (s && s[0]) 54254721Semaste// { 55254721Semaste// if (strstr(s, "shm-create://")) 56254721Semaste// { 57254721Semaste// } 58254721Semaste// else if (strstr(s, "shm-connect://")) 59254721Semaste// { 60254721Semaste// } 61254721Semaste// if (error_ptr) 62254721Semaste// error_ptr->SetErrorStringWithFormat ("unsupported connection URL: '%s'", s); 63254721Semaste// return eConnectionStatusError; 64254721Semaste// } 65254721Semaste if (error_ptr) 66254721Semaste error_ptr->SetErrorString("invalid connect arguments"); 67254721Semaste return eConnectionStatusError; 68254721Semaste} 69254721Semaste 70254721SemasteConnectionStatus 71254721SemasteConnectionSharedMemory::Disconnect (Error *error_ptr) 72254721Semaste{ 73254721Semaste m_mmap.Clear(); 74254721Semaste if (!m_name.empty()) 75254721Semaste { 76254721Semaste shm_unlink (m_name.c_str()); 77254721Semaste m_name.clear(); 78254721Semaste } 79254721Semaste return eConnectionStatusSuccess; 80254721Semaste} 81254721Semaste 82254721Semastesize_t 83254721SemasteConnectionSharedMemory::Read (void *dst, 84254721Semaste size_t dst_len, 85254721Semaste uint32_t timeout_usec, 86254721Semaste ConnectionStatus &status, 87254721Semaste Error *error_ptr) 88254721Semaste{ 89254721Semaste status = eConnectionStatusSuccess; 90254721Semaste return 0; 91254721Semaste} 92254721Semaste 93254721Semastesize_t 94254721SemasteConnectionSharedMemory::Write (const void *src, size_t src_len, ConnectionStatus &status, Error *error_ptr) 95254721Semaste{ 96254721Semaste status = eConnectionStatusSuccess; 97254721Semaste return 0; 98254721Semaste} 99254721Semaste 100254721SemasteConnectionStatus 101254721SemasteConnectionSharedMemory::BytesAvailable (uint32_t timeout_usec, Error *error_ptr) 102254721Semaste{ 103254721Semaste return eConnectionStatusLostConnection; 104254721Semaste} 105254721Semaste 106254721SemasteConnectionStatus 107254721SemasteConnectionSharedMemory::Open (bool create, const char *name, size_t size, Error *error_ptr) 108254721Semaste{ 109254721Semaste if (m_fd != -1) 110254721Semaste { 111254721Semaste if (error_ptr) 112254721Semaste error_ptr->SetErrorString("already open"); 113254721Semaste return eConnectionStatusError; 114254721Semaste } 115254721Semaste 116254721Semaste m_name.assign (name); 117254721Semaste int oflag = O_RDWR; 118254721Semaste if (create) 119254721Semaste oflag |= O_CREAT; 120254721Semaste m_fd = ::shm_open (m_name.c_str(), oflag, S_IRUSR|S_IWUSR); 121254721Semaste 122254721Semaste if (create) 123254721Semaste ::ftruncate (m_fd, size); 124254721Semaste 125254721Semaste if (m_mmap.MemoryMapFromFileDescriptor(m_fd, 0, size, true, false) == size) 126254721Semaste return eConnectionStatusSuccess; 127254721Semaste 128254721Semaste Disconnect(NULL); 129254721Semaste return eConnectionStatusError; 130254721Semaste} 131254721Semaste 132