MCPcopy Create free account
hub / github.com/Tencent/phxsql / getMmapPtr

Method getMmapPtr

phxsqlclient/utils/leakybucket.cpp:38–92  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

36}
37
38void * MmapLeakyBucket::getMmapPtr(const char * filePath, uint32_t len, int * isNewFile) {
39 *isNewFile = 0;
40
41 int fd = open(filePath, O_RDWR);
42 if (fd < 0) {
43 if (ENOENT == errno) {
44 fd = open(filePath, O_RDWR | O_CREAT, 0660);
45 if (fd >= 0) {
46 *isNewFile = 1;
47
48 char buffer[1024] = { 0 };
49 memset(buffer, 0, sizeof(buffer));
50 for (int i = 0; i < (int) len; i += sizeof(buffer)) {
51 write(fd, buffer, sizeof(buffer));
52 }
53
54 ftruncate(fd, len);
55
56 lseek(fd, 0, SEEK_SET);
57 } else {
58 //Log( COMM_LOG_ERR, "ERR: Create %s fail, errno %d, %s\n",
59 //filePath, errno, strerror( errno ) );
60 }
61 } else {
62 //Log( COMM_LOG_ERR, "ERR: Open %s fail, errno %d, %s\n",
63 //filePath, errno, strerror( errno ) );
64 }
65 }
66
67 void * ret = NULL;
68
69 if (fd >= 0) {
70 struct stat fileStat;
71 if (0 == fstat(fd, &fileStat)) {
72 if (fileStat.st_size == (int) len) {
73 ret = mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
74 if (MAP_FAILED == ret) {
75 //Log( COMM_LOG_ERR, "ERR: mmap %s fail, errno %d, %s\n",
76 // filePath, errno, strerror( errno ) );
77 ret = NULL;
78 }
79 } else {
80 //Log( COMM_LOG_ERR, "ERR: invalid file size, real %lld, except %i",
81 // (long long)fileStat.st_size, len );
82 }
83 } else {
84 //Log( COMM_LOG_ERR, "ERR: Stat %s fail, errno %d, %s\n",
85 // filePath, errno, strerror( errno ) );
86 }
87
88 close(fd);
89 }
90
91 return ret;
92}
93
94void MmapLeakyBucket::freeMmapPtr(void * ptr, uint32_t len) {
95 if (0 != munmap(ptr, len)) {

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected