1//===- FuzzerShmem.h - shared memory interface ------------------*- 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// SharedMemoryRegion
10//===----------------------------------------------------------------------===//
11
12#ifndef LLVM_FUZZER_SHMEM_H
13#define LLVM_FUZZER_SHMEM_H
14
15#include <algorithm>
16#include <cstring>
17#include <string>
18
19#include "FuzzerDefs.h"
20
21namespace fuzzer {
22
23class SharedMemoryRegion {
24 public:
25  bool Create(const char *Name);
26  bool Open(const char *Name);
27  bool Destroy(const char *Name);
28  uint8_t *GetData() { return Data; }
29  void PostServer() {Post(0);}
30  void WaitServer() {Wait(0);}
31  void PostClient() {Post(1);}
32  void WaitClient() {Wait(1);}
33
34  size_t WriteByteArray(const uint8_t *Bytes, size_t N) {
35    assert(N <= kShmemSize - sizeof(N));
36    memcpy(GetData(), &N, sizeof(N));
37    memcpy(GetData() + sizeof(N), Bytes, N);
38    assert(N == ReadByteArraySize());
39    return N;
40  }
41  size_t ReadByteArraySize() {
42    size_t Res;
43    memcpy(&Res, GetData(), sizeof(Res));
44    return Res;
45  }
46  uint8_t *GetByteArray() { return GetData() + sizeof(size_t); }
47
48  bool IsServer() const { return Data && IAmServer; }
49  bool IsClient() const { return Data && !IAmServer; }
50
51private:
52
53  static const size_t kShmemSize = 1 << 22;
54  bool IAmServer;
55  std::string Path(const char *Name);
56  std::string SemName(const char *Name, int Idx);
57  void Post(int Idx);
58  void Wait(int Idx);
59
60  bool Map(int fd);
61  uint8_t *Data = nullptr;
62  void *Semaphore[2];
63};
64
65extern SharedMemoryRegion SMR;
66
67}  // namespace fuzzer
68
69#endif  // LLVM_FUZZER_SHMEM_H
70