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
|