forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
//===- 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
 |