106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//===-- ConnectionSharedMemory.cpp ----------------------------*- C++ -*-===// 206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// 306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// The LLVM Compiler Infrastructure 406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// 506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// This file is distributed under the University of Illinois Open Source 606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// License. See LICENSE.TXT for details. 706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// 806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//===----------------------------------------------------------------------===// 906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 1006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include "lldb/Core/ConnectionSharedMemory.h" 1106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 1206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// C Includes 1306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <errno.h> 1406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <pthread.h> 1506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <stdlib.h> 1606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <sys/file.h> 1706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <sys/mman.h> 1806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <sys/stat.h> 1906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <sys/types.h> 2006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 2106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// C++ Includes 2206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// Other libraries and framework includes 2306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// Project includes 2406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include "lldb/lldb-private-log.h" 2506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include "lldb/Core/Communication.h" 2606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include "lldb/Core/Log.h" 2706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 2806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonusing namespace lldb; 2906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonusing namespace lldb_private; 3006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 3106d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::ConnectionSharedMemory () : 3206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton Connection(), 3306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton m_name(), 3406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton m_fd (-1), 3506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton m_mmap() 3606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 3706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 3806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 3906d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::~ConnectionSharedMemory () 4006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 4106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton Disconnect (NULL); 4206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 4306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 4406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonbool 4506d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::IsConnected () const 4606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 4706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return m_fd >= 0; 4806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 4906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 5006d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionStatus 5106d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::Connect (const char *s, Error *error_ptr) 5206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 5306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// if (s && s[0]) 5406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// { 5506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// if (strstr(s, "shm-create://")) 5606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// { 5706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// } 5806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// else if (strstr(s, "shm-connect://")) 5906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// { 6006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// } 6106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// if (error_ptr) 6206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// error_ptr->SetErrorStringWithFormat ("unsupported connection URL: '%s'", s); 6306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// return eConnectionStatusError; 6406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// } 6506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton if (error_ptr) 6606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton error_ptr->SetErrorString("invalid connect arguments"); 6706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return eConnectionStatusError; 6806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 6906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 7006d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionStatus 7106d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::Disconnect (Error *error_ptr) 7206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 7306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton m_mmap.Clear(); 7406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton if (!m_name.empty()) 7506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton { 7606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton shm_unlink (m_name.c_str()); 7706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton m_name.clear(); 7806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton } 7906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return eConnectionStatusSuccess; 8006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 8106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 8206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonsize_t 8363afdb07641f04aa7b60d895120b056124d3469bGreg ClaytonConnectionSharedMemory::Read (void *dst, 8463afdb07641f04aa7b60d895120b056124d3469bGreg Clayton size_t dst_len, 8563afdb07641f04aa7b60d895120b056124d3469bGreg Clayton uint32_t timeout_usec, 8663afdb07641f04aa7b60d895120b056124d3469bGreg Clayton ConnectionStatus &status, 8763afdb07641f04aa7b60d895120b056124d3469bGreg Clayton Error *error_ptr) 8806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 8906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton status = eConnectionStatusSuccess; 9006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return 0; 9106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 9206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 9306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonsize_t 9406d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::Write (const void *src, size_t src_len, ConnectionStatus &status, Error *error_ptr) 9506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 9606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton status = eConnectionStatusSuccess; 9706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return 0; 9806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 9906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 10006d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionStatus 10106d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::BytesAvailable (uint32_t timeout_usec, Error *error_ptr) 10206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 10306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return eConnectionStatusLostConnection; 10406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 10506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 10606d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionStatus 10706d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::Open (bool create, const char *name, size_t size, Error *error_ptr) 10806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{ 10906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton if (m_fd != -1) 11006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton { 11106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton if (error_ptr) 11206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton error_ptr->SetErrorString("already open"); 11306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return eConnectionStatusError; 11406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton } 11506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 11606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton m_name.assign (name); 11706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton int oflag = O_RDWR; 11806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton if (create) 11906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton oflag |= O_CREAT; 12006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton m_fd = ::shm_open (m_name.c_str(), oflag, S_IRUSR|S_IWUSR); 12106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 12206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton if (create) 12306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton ::ftruncate (m_fd, size); 12406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 12506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton if (m_mmap.MemoryMapFromFileDescriptor(m_fd, 0, size, true, false) == size) 12606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return eConnectionStatusSuccess; 12706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 12806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton Disconnect(NULL); 12906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton return eConnectionStatusError; 13006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton} 13106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton 132