106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//===-- ConnectionSharedMemory.cpp ----------------------------*- C++ -*-===//
206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//
306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//                     The LLVM Compiler Infrastructure
406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//
506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// This file is distributed under the University of Illinois Open Source
606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// License. See LICENSE.TXT for details.
706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//
806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//===----------------------------------------------------------------------===//
906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
1006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include "lldb/Core/ConnectionSharedMemory.h"
1106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
1206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// C Includes
1306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <errno.h>
1406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <pthread.h>
1506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <stdlib.h>
1606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <sys/file.h>
1706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <sys/mman.h>
1806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <sys/stat.h>
1906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include <sys/types.h>
2006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
2106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// C++ Includes
2206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// Other libraries and framework includes
2306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton// Project includes
2406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include "lldb/lldb-private-log.h"
2506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include "lldb/Core/Communication.h"
2606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton#include "lldb/Core/Log.h"
2706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
2806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonusing namespace lldb;
2906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonusing namespace lldb_private;
3006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
3106d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::ConnectionSharedMemory () :
3206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    Connection(),
3306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    m_name(),
3406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    m_fd (-1),
3506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    m_mmap()
3606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
3706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
3806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
3906d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::~ConnectionSharedMemory ()
4006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
4106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    Disconnect (NULL);
4206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
4306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
4406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonbool
4506d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::IsConnected () const
4606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
4706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    return m_fd >= 0;
4806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
4906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
5006d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionStatus
5106d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::Connect (const char *s, Error *error_ptr)
5206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
5306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//    if (s && s[0])
5406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//    {
5506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//        if (strstr(s, "shm-create://"))
5606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//        {
5706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//        }
5806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//        else if (strstr(s, "shm-connect://"))
5906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//        {
6006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//        }
6106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//        if (error_ptr)
6206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//            error_ptr->SetErrorStringWithFormat ("unsupported connection URL: '%s'", s);
6306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//        return eConnectionStatusError;
6406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton//    }
6506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    if (error_ptr)
6606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton        error_ptr->SetErrorString("invalid connect arguments");
6706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    return eConnectionStatusError;
6806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
6906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
7006d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionStatus
7106d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::Disconnect (Error *error_ptr)
7206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
7306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    m_mmap.Clear();
7406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    if (!m_name.empty())
7506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    {
7606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton        shm_unlink (m_name.c_str());
7706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton        m_name.clear();
7806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    }
7906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    return eConnectionStatusSuccess;
8006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
8106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
8206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonsize_t
8363afdb07641f04aa7b60d895120b056124d3469bGreg ClaytonConnectionSharedMemory::Read (void *dst,
8463afdb07641f04aa7b60d895120b056124d3469bGreg Clayton                              size_t dst_len,
8563afdb07641f04aa7b60d895120b056124d3469bGreg Clayton                              uint32_t timeout_usec,
8663afdb07641f04aa7b60d895120b056124d3469bGreg Clayton                              ConnectionStatus &status,
8763afdb07641f04aa7b60d895120b056124d3469bGreg Clayton                              Error *error_ptr)
8806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
8906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    status = eConnectionStatusSuccess;
9006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    return 0;
9106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
9206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
9306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Claytonsize_t
9406d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::Write (const void *src, size_t src_len, ConnectionStatus &status, Error *error_ptr)
9506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
9606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    status = eConnectionStatusSuccess;
9706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    return 0;
9806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
9906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
10006d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionStatus
10106d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::BytesAvailable (uint32_t timeout_usec, Error *error_ptr)
10206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
10306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    return eConnectionStatusLostConnection;
10406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
10506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
10606d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionStatus
10706d7cc86937caca0acf2b990a02a641dc9c7579aGreg ClaytonConnectionSharedMemory::Open (bool create, const char *name, size_t size, Error *error_ptr)
10806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton{
10906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    if (m_fd != -1)
11006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    {
11106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton        if (error_ptr)
11206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton            error_ptr->SetErrorString("already open");
11306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton        return eConnectionStatusError;
11406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    }
11506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
11606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    m_name.assign (name);
11706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    int oflag = O_RDWR;
11806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    if (create)
11906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton        oflag |= O_CREAT;
12006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    m_fd = ::shm_open (m_name.c_str(), oflag, S_IRUSR|S_IWUSR);
12106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
12206d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    if (create)
12306d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton        ::ftruncate (m_fd, size);
12406d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
12506d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    if (m_mmap.MemoryMapFromFileDescriptor(m_fd, 0, size, true, false) == size)
12606d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton        return eConnectionStatusSuccess;
12706d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
12806d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    Disconnect(NULL);
12906d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton    return eConnectionStatusError;
13006d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton}
13106d7cc86937caca0acf2b990a02a641dc9c7579aGreg Clayton
132