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