Home | History | Annotate | Download | only in Fuzzer
      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 
     21 namespace fuzzer {
     22 
     23 class 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 
     51 private:
     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 
     65 extern SharedMemoryRegion SMR;
     66 
     67 }  // namespace fuzzer
     68 
     69 #endif  // LLVM_FUZZER_SHMEM_H
     70