1254721Semaste//===-- ConnectionSharedMemory.cpp ----------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Core/ConnectionSharedMemory.h"
11254721Semaste
12254721Semaste// C Includes
13254721Semaste#include <errno.h>
14254721Semaste#include <pthread.h>
15254721Semaste#include <stdlib.h>
16254721Semaste#include <sys/file.h>
17254721Semaste#include <sys/mman.h>
18254721Semaste#include <sys/stat.h>
19254721Semaste#include <sys/types.h>
20254721Semaste
21254721Semaste// C++ Includes
22254721Semaste// Other libraries and framework includes
23254721Semaste// Project includes
24254721Semaste#include "lldb/lldb-private-log.h"
25254721Semaste#include "lldb/Core/Communication.h"
26254721Semaste#include "lldb/Core/Log.h"
27254721Semaste
28254721Semasteusing namespace lldb;
29254721Semasteusing namespace lldb_private;
30254721Semaste
31254721SemasteConnectionSharedMemory::ConnectionSharedMemory () :
32254721Semaste    Connection(),
33254721Semaste    m_name(),
34254721Semaste    m_fd (-1),
35254721Semaste    m_mmap()
36254721Semaste{
37254721Semaste}
38254721Semaste
39254721SemasteConnectionSharedMemory::~ConnectionSharedMemory ()
40254721Semaste{
41254721Semaste    Disconnect (NULL);
42254721Semaste}
43254721Semaste
44254721Semastebool
45254721SemasteConnectionSharedMemory::IsConnected () const
46254721Semaste{
47254721Semaste    return m_fd >= 0;
48254721Semaste}
49254721Semaste
50254721SemasteConnectionStatus
51254721SemasteConnectionSharedMemory::Connect (const char *s, Error *error_ptr)
52254721Semaste{
53254721Semaste//    if (s && s[0])
54254721Semaste//    {
55254721Semaste//        if (strstr(s, "shm-create://"))
56254721Semaste//        {
57254721Semaste//        }
58254721Semaste//        else if (strstr(s, "shm-connect://"))
59254721Semaste//        {
60254721Semaste//        }
61254721Semaste//        if (error_ptr)
62254721Semaste//            error_ptr->SetErrorStringWithFormat ("unsupported connection URL: '%s'", s);
63254721Semaste//        return eConnectionStatusError;
64254721Semaste//    }
65254721Semaste    if (error_ptr)
66254721Semaste        error_ptr->SetErrorString("invalid connect arguments");
67254721Semaste    return eConnectionStatusError;
68254721Semaste}
69254721Semaste
70254721SemasteConnectionStatus
71254721SemasteConnectionSharedMemory::Disconnect (Error *error_ptr)
72254721Semaste{
73254721Semaste    m_mmap.Clear();
74254721Semaste    if (!m_name.empty())
75254721Semaste    {
76254721Semaste        shm_unlink (m_name.c_str());
77254721Semaste        m_name.clear();
78254721Semaste    }
79254721Semaste    return eConnectionStatusSuccess;
80254721Semaste}
81254721Semaste
82254721Semastesize_t
83254721SemasteConnectionSharedMemory::Read (void *dst,
84254721Semaste                              size_t dst_len,
85254721Semaste                              uint32_t timeout_usec,
86254721Semaste                              ConnectionStatus &status,
87254721Semaste                              Error *error_ptr)
88254721Semaste{
89254721Semaste    status = eConnectionStatusSuccess;
90254721Semaste    return 0;
91254721Semaste}
92254721Semaste
93254721Semastesize_t
94254721SemasteConnectionSharedMemory::Write (const void *src, size_t src_len, ConnectionStatus &status, Error *error_ptr)
95254721Semaste{
96254721Semaste    status = eConnectionStatusSuccess;
97254721Semaste    return 0;
98254721Semaste}
99254721Semaste
100254721SemasteConnectionStatus
101254721SemasteConnectionSharedMemory::BytesAvailable (uint32_t timeout_usec, Error *error_ptr)
102254721Semaste{
103254721Semaste    return eConnectionStatusLostConnection;
104254721Semaste}
105254721Semaste
106254721SemasteConnectionStatus
107254721SemasteConnectionSharedMemory::Open (bool create, const char *name, size_t size, Error *error_ptr)
108254721Semaste{
109254721Semaste    if (m_fd != -1)
110254721Semaste    {
111254721Semaste        if (error_ptr)
112254721Semaste            error_ptr->SetErrorString("already open");
113254721Semaste        return eConnectionStatusError;
114254721Semaste    }
115254721Semaste
116254721Semaste    m_name.assign (name);
117254721Semaste    int oflag = O_RDWR;
118254721Semaste    if (create)
119254721Semaste        oflag |= O_CREAT;
120254721Semaste    m_fd = ::shm_open (m_name.c_str(), oflag, S_IRUSR|S_IWUSR);
121254721Semaste
122254721Semaste    if (create)
123254721Semaste        ::ftruncate (m_fd, size);
124254721Semaste
125254721Semaste    if (m_mmap.MemoryMapFromFileDescriptor(m_fd, 0, size, true, false) == size)
126254721Semaste        return eConnectionStatusSuccess;
127254721Semaste
128254721Semaste    Disconnect(NULL);
129254721Semaste    return eConnectionStatusError;
130254721Semaste}
131254721Semaste
132