]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/Core/ConnectionSharedMemory.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / Core / ConnectionSharedMemory.cpp
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