Home | History | Annotate | Download | only in Core
      1 //===-- ConnectionSharedMemory.cpp ----------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "lldb/Core/ConnectionSharedMemory.h"
     11 
     12 // C Includes
     13 #include <errno.h>
     14 #include <pthread.h>
     15 #include <stdlib.h>
     16 #include <sys/file.h>
     17 #include <sys/mman.h>
     18 #include <sys/stat.h>
     19 #include <sys/types.h>
     20 
     21 // C++ Includes
     22 // Other libraries and framework includes
     23 // Project includes
     24 #include "lldb/lldb-private-log.h"
     25 #include "lldb/Core/Communication.h"
     26 #include "lldb/Core/Log.h"
     27 
     28 using namespace lldb;
     29 using namespace lldb_private;
     30 
     31 ConnectionSharedMemory::ConnectionSharedMemory () :
     32     Connection(),
     33     m_name(),
     34     m_fd (-1),
     35     m_mmap()
     36 {
     37 }
     38 
     39 ConnectionSharedMemory::~ConnectionSharedMemory ()
     40 {
     41     Disconnect (NULL);
     42 }
     43 
     44 bool
     45 ConnectionSharedMemory::IsConnected () const
     46 {
     47     return m_fd >= 0;
     48 }
     49 
     50 ConnectionStatus
     51 ConnectionSharedMemory::Connect (const char *s, Error *error_ptr)
     52 {
     53 //    if (s && s[0])
     54 //    {
     55 //        if (strstr(s, "shm-create://"))
     56 //        {
     57 //        }
     58 //        else if (strstr(s, "shm-connect://"))
     59 //        {
     60 //        }
     61 //        if (error_ptr)
     62 //            error_ptr->SetErrorStringWithFormat ("unsupported connection URL: '%s'", s);
     63 //        return eConnectionStatusError;
     64 //    }
     65     if (error_ptr)
     66         error_ptr->SetErrorString("invalid connect arguments");
     67     return eConnectionStatusError;
     68 }
     69 
     70 ConnectionStatus
     71 ConnectionSharedMemory::Disconnect (Error *error_ptr)
     72 {
     73     m_mmap.Clear();
     74     if (!m_name.empty())
     75     {
     76         shm_unlink (m_name.c_str());
     77         m_name.clear();
     78     }
     79     return eConnectionStatusSuccess;
     80 }
     81 
     82 size_t
     83 ConnectionSharedMemory::Read (void *dst,
     84                               size_t dst_len,
     85                               uint32_t timeout_usec,
     86                               ConnectionStatus &status,
     87                               Error *error_ptr)
     88 {
     89     status = eConnectionStatusSuccess;
     90     return 0;
     91 }
     92 
     93 size_t
     94 ConnectionSharedMemory::Write (const void *src, size_t src_len, ConnectionStatus &status, Error *error_ptr)
     95 {
     96     status = eConnectionStatusSuccess;
     97     return 0;
     98 }
     99 
    100 ConnectionStatus
    101 ConnectionSharedMemory::BytesAvailable (uint32_t timeout_usec, Error *error_ptr)
    102 {
    103     return eConnectionStatusLostConnection;
    104 }
    105 
    106 ConnectionStatus
    107 ConnectionSharedMemory::Open (bool create, const char *name, size_t size, Error *error_ptr)
    108 {
    109     if (m_fd != -1)
    110     {
    111         if (error_ptr)
    112             error_ptr->SetErrorString("already open");
    113         return eConnectionStatusError;
    114     }
    115 
    116     m_name.assign (name);
    117     int oflag = O_RDWR;
    118     if (create)
    119         oflag |= O_CREAT;
    120     m_fd = ::shm_open (m_name.c_str(), oflag, S_IRUSR|S_IWUSR);
    121 
    122     if (create)
    123         ::ftruncate (m_fd, size);
    124 
    125     if (m_mmap.MemoryMapFromFileDescriptor(m_fd, 0, size, true, false) == size)
    126         return eConnectionStatusSuccess;
    127 
    128     Disconnect(NULL);
    129     return eConnectionStatusError;
    130 }
    131 
    132