• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ConnectionSharedMemory()31 ConnectionSharedMemory::ConnectionSharedMemory () :
32     Connection(),
33     m_name(),
34     m_fd (-1),
35     m_mmap()
36 {
37 }
38 
~ConnectionSharedMemory()39 ConnectionSharedMemory::~ConnectionSharedMemory ()
40 {
41     Disconnect (NULL);
42 }
43 
44 bool
IsConnected() const45 ConnectionSharedMemory::IsConnected () const
46 {
47     return m_fd >= 0;
48 }
49 
50 ConnectionStatus
Connect(const char * s,Error * error_ptr)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
Disconnect(Error * error_ptr)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
Read(void * dst,size_t dst_len,uint32_t timeout_usec,ConnectionStatus & status,Error * error_ptr)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
Write(const void * src,size_t src_len,ConnectionStatus & status,Error * error_ptr)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
BytesAvailable(uint32_t timeout_usec,Error * error_ptr)101 ConnectionSharedMemory::BytesAvailable (uint32_t timeout_usec, Error *error_ptr)
102 {
103     return eConnectionStatusLostConnection;
104 }
105 
106 ConnectionStatus
Open(bool create,const char * name,size_t size,Error * error_ptr)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