-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwraplibpmem.h
154 lines (120 loc) · 4.79 KB
/
wraplibpmem.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef WRAPLIBPMEM_H
#define WRAPLIBPMEM_H 1
#define _GNU_SOURCE
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <stdint.h>
#include <time.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <execinfo.h>
#define MAX_PATH_LENGTH 256
#define CACHE_LINE_SIZE 64
#define MAX_FILE_LENGTH 256
#define MAX_LINE_LENGTH 256
#define PMEM_FILE 0
#define PMEMOBJ_FILE 1
#define NORMAL_MEMCPY 0
#define RAND_MEMCPY 1
#define NO_MEMCPY 2
#define MEMCPY_THREADS 1
#define LIBPMEMMAP_ALIGN_VAL 0x200000
#define COPYFILE_WORDENDING "_flushed"
typedef struct _pmemaddrset PMEMaddrset;
struct _pmemaddrset {
void *orig_addr;
void *fake_addr;
PMEMaddrset *next;
PMEMaddrset *prev;
size_t len;
int file_type;
int flushed_copyfile_fd;
char *flushed_copyfile_path;
};
extern PMEMaddrset *head;
extern PMEMaddrset *tail;
typedef struct _waitdrain_addrset Waitdrain_addrset;
struct _waitdrain_addrset{
void *addr;
Waitdrain_addrset *next;
Waitdrain_addrset *prev;
size_t len;
PMEMaddrset *set;
};
extern Waitdrain_addrset *w_head;
extern Waitdrain_addrset *w_tail;
//int flushed = 0;
struct _backtraces_info{
char backtrace[8000];
int count;
int prev_count;
int abort_count;
struct _backtraces_info *next;
};
typedef struct _backtraces_info Backtraces_info;
struct _line_info{
int line;
int count;
int prev_count;
int abort_count;
Backtraces_info *binfo;
};
typedef struct _line_info LINEinfo;
extern char *file_list[MAX_FILE_LENGTH];
//LINEinfo *(persist_line_list[MAX_LINE_LENGTH])[MAX_FILE_LENGTH]; //ポインタ配列 ポインタはpersist_line_list[MAX_LINE_LENGTH]のアドレスを指す
extern LINEinfo persist_line_list[MAX_FILE_LENGTH][MAX_LINE_LENGTH];
extern int persist_count_sum;
extern int persist_place_sum;
extern void *(*orig_pmem_map_file)(const char*, size_t, int, mode_t, size_t*, int*);
//extern void (*orig_pmem_persist)(const void*, size_t);
extern int (*orig_pmem_unmap)(void*, size_t);
extern void (*orig_pmem_flush)(const void *, size_t);
extern void (*orig_pmem_drain)();
extern int (*orig_pmem_deep_drain)(const void *, size_t);
extern int abortflag;
extern int memcpyflag;
Backtraces_info *plus_persistcount(const char *file, int line, char *bt);
void read_persistcountfile();
void write_persistcountfile();
// void reset_persistcount();
void rand_set_abortflag(const char *file, int line, Backtraces_info *binfo);
void add_PMEMaddrset(void *orig_addr, size_t len, const char *path, int file_type);
void *pmem_map_file(const char *path, size_t len, int flags, mode_t mode, size_t *mapped_lenp, int *is_pmemp);
void pmem_wrap_persist(const void *addr, size_t len, const char *file, int line);
void pmem_persist(const void *addr, size_t len);
int pmem_wrap_msync(const void *addr, size_t len, const char *file, int line);
void delete_PMEMaddrset(void *addr);
int pmem_unmap(void *addr, size_t len);
void *sub_normal_memcpy(void *p);
void *sub_rand_memcpy(void *p);
void rollback_memcpy(PMEMaddrset *set);
// void rand_file_generate(PMEMaddrset *set, size_t n, uintptr_t d);//現在不使用
void add_waitdrainlist(const void *addr, size_t len);
void backtrace_file_offset_fd(void *const *array, int size, int fd);
void backtrace_file_offset(void *const *array, int size, char *buf, int start_trace);
void *pmem_wrap_memmove_persist(void *pmemdest, const void *src, size_t len, const char *file, int line);
void *pmem_wrap_memcpy_persist(void *pmemdest, const void *src, size_t len, const char *file, int line);
void *pmem_wrap_memset_persist(void *pmemdest, int c, size_t len, const char *file, int line);
void *pmem_memmove_persist(void *pmemdest, const void *src, size_t len);
void *pmem_memcpy_persist(void *pmemdest, const void *src, size_t len);
void *pmem_memset_persist(void *pmemdest, int c, size_t len);
void *pmem_wrap_memmove(void *pmemdest, const void *src, size_t len, unsigned flags, const char *file, int line);
void *pmem_wrap_memcpy(void *pmemdest, const void *src, size_t len, unsigned flags, const char *file, int line);
void *pmem_wrap_memset(void *pmemdest, int c, size_t len, unsigned flags, const char *file, int line);
void *pmem_memmove(void *pmemdest, const void *src, size_t len, unsigned flags);
void *pmem_memcpy(void *pmemdest, const void *src, size_t len, unsigned flags);
void *pmem_memset(void *pmemdest, int c, size_t len, unsigned flags);
void pmem_flush(const void *addr, size_t len);
void pmem_wrap_drain(const char *file, int line);
void pmem_drain();
int pmem_deep_persist(const void *addr, size_t len);
void pmem_deep_flush(const void *addr, size_t len);
int pmem_deep_drain(const void *addr, size_t len);
void force_abort_drain(const char *file, int line);
void rand_set_abortflag_plus_persistcount(const char *file, int line);
#endif