]>
git.proxmox.com Git - rustc.git/blob - src/libcompiler_builtins/compiler-rt/lib/fuzzer/FuzzerShmemPosix.cpp
1 //===- FuzzerShmemPosix.cpp - Posix shared memory ---------------*- C++ -* ===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
11 #include "FuzzerDefs.h"
15 #include "FuzzerShmem.h"
19 #include <semaphore.h>
24 #include <sys/types.h>
29 std::string
SharedMemoryRegion::Path(const char *Name
) {
30 return DirPlusFile(TmpDir(), Name
);
33 std::string
SharedMemoryRegion::SemName(const char *Name
, int Idx
) {
34 std::string
Res(Name
);
35 return Res
+ (char)('0' + Idx
);
38 bool SharedMemoryRegion::Map(int fd
) {
40 (uint8_t *)mmap(0, kShmemSize
, PROT_WRITE
| PROT_READ
, MAP_SHARED
, fd
, 0);
41 if (Data
== (uint8_t*)-1)
46 bool SharedMemoryRegion::Create(const char *Name
) {
47 int fd
= open(Path(Name
).c_str(), O_CREAT
| O_RDWR
, 0777);
48 if (fd
< 0) return false;
49 if (ftruncate(fd
, kShmemSize
) < 0) return false;
52 for (int i
= 0; i
< 2; i
++) {
53 sem_unlink(SemName(Name
, i
).c_str());
54 Semaphore
[i
] = sem_open(SemName(Name
, i
).c_str(), O_CREAT
, 0644, 0);
55 if (Semaphore
[i
] == (void *)-1)
62 bool SharedMemoryRegion::Open(const char *Name
) {
63 int fd
= open(Path(Name
).c_str(), O_RDWR
);
64 if (fd
< 0) return false;
66 if (0 != fstat(fd
, &stat_res
))
68 assert(stat_res
.st_size
== kShmemSize
);
71 for (int i
= 0; i
< 2; i
++) {
72 Semaphore
[i
] = sem_open(SemName(Name
, i
).c_str(), 0);
73 if (Semaphore
[i
] == (void *)-1)
80 bool SharedMemoryRegion::Destroy(const char *Name
) {
81 return 0 == unlink(Path(Name
).c_str());
84 void SharedMemoryRegion::Post(int Idx
) {
85 assert(Idx
== 0 || Idx
== 1);
86 sem_post((sem_t
*)Semaphore
[Idx
]);
89 void SharedMemoryRegion::Wait(int Idx
) {
90 assert(Idx
== 0 || Idx
== 1);
91 for (int i
= 0; i
< 10 && sem_wait((sem_t
*)Semaphore
[Idx
]); i
++) {
92 // sem_wait may fail if interrupted by a signal.
95 Printf("%s: sem_wait[%d] failed %s\n", i
< 9 ? "WARNING" : "ERROR", i
,
101 } // namespace fuzzer
103 #endif // LIBFUZZER_POSIX