|  | //===- FuzzerShmem.h - shared memory interface ------------------*- C++ -* ===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // SharedMemoryRegion | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_FUZZER_SHMEM_H | 
|  | #define LLVM_FUZZER_SHMEM_H | 
|  |  | 
|  | #include <algorithm> | 
|  | #include <cstring> | 
|  | #include <string> | 
|  |  | 
|  | #include "FuzzerDefs.h" | 
|  |  | 
|  | namespace fuzzer { | 
|  |  | 
|  | class SharedMemoryRegion { | 
|  | public: | 
|  | bool Create(const char *Name); | 
|  | bool Open(const char *Name); | 
|  | bool Destroy(const char *Name); | 
|  | uint8_t *GetData() { return Data; } | 
|  | void PostServer() {Post(0);} | 
|  | void WaitServer() {Wait(0);} | 
|  | void PostClient() {Post(1);} | 
|  | void WaitClient() {Wait(1);} | 
|  |  | 
|  | size_t WriteByteArray(const uint8_t *Bytes, size_t N) { | 
|  | assert(N <= kShmemSize - sizeof(N)); | 
|  | memcpy(GetData(), &N, sizeof(N)); | 
|  | memcpy(GetData() + sizeof(N), Bytes, N); | 
|  | assert(N == ReadByteArraySize()); | 
|  | return N; | 
|  | } | 
|  | size_t ReadByteArraySize() { | 
|  | size_t Res; | 
|  | memcpy(&Res, GetData(), sizeof(Res)); | 
|  | return Res; | 
|  | } | 
|  | uint8_t *GetByteArray() { return GetData() + sizeof(size_t); } | 
|  |  | 
|  | bool IsServer() const { return Data && IAmServer; } | 
|  | bool IsClient() const { return Data && !IAmServer; } | 
|  |  | 
|  | private: | 
|  |  | 
|  | static const size_t kShmemSize = 1 << 22; | 
|  | bool IAmServer; | 
|  | std::string Path(const char *Name); | 
|  | std::string SemName(const char *Name, int Idx); | 
|  | void Post(int Idx); | 
|  | void Wait(int Idx); | 
|  |  | 
|  | bool Map(int fd); | 
|  | uint8_t *Data = nullptr; | 
|  | void *Semaphore[2]; | 
|  | }; | 
|  |  | 
|  | extern SharedMemoryRegion SMR; | 
|  |  | 
|  | }  // namespace fuzzer | 
|  |  | 
|  | #endif  // LLVM_FUZZER_SHMEM_H |