| Bug #47392 | NdbMem_{Allocate,Free} always uses the heap | ||
|---|---|---|---|
| Submitted: | 17 Sep 2009 6:57 | Modified: | 31 Aug 2010 7:07 |
| Reporter: | jack andrews | Email Updates: | |
| Status: | Won't fix | Impact on me: | |
| Category: | MySQL Cluster: Cluster (NDB) storage engine | Severity: | S3 (Non-critical) |
| Version: | mysql-5.1-telco-7.0 | OS: | Windows |
| Assigned to: | Jonas Oreland | CPU Architecture: | Any |
[17 Sep 2009 6:57]
jack andrews
[17 Sep 2009 7:02]
jack andrews
=== modified file 'storage/ndb/src/common/portlib/NdbCondition.c'
--- storage/ndb/src/common/portlib/NdbCondition.c 2009-08-12 18:10:54 +0000
+++ storage/ndb/src/common/portlib/NdbCondition.c 2009-09-17 05:30:46 +0000
@@ -230,7 +230,7 @@
return 1;
result = pthread_cond_destroy(&p_cond->cond);
- free(p_cond);
+ NdbMem_Free(p_cond);
return 0;
}
=== modified file 'storage/ndb/src/common/portlib/NdbMem.c'
--- storage/ndb/src/common/portlib/NdbMem.c 2009-05-26 18:53:34 +0000
+++ storage/ndb/src/common/portlib/NdbMem.c 2009-09-17 05:30:47 +0000
@@ -32,8 +32,65 @@
/* Do nothing */
return;
}
-
-
+#ifdef _WIN32
+/*virtual alloc larger requests*/
+#define VMLIMIT 1024*1024
+static int pagesize=0; /*system page size*/
+static int pagemask=0;
+static int isvirt(char*p) {
+ my_ptrdiff_t pint=(my_ptrdiff_t)p;
+ return !(pint&pagemask);
+}
+void NdbMem_Free(void* p) {
+ if(isvirt(p))
+ VirtualFree(p,0,MEM_RELEASE);
+ else {
+ char*s=p,*origin=s-s[-1];
+ free(origin);
+ }
+}
+void* NdbMem_Allocate(size_t size) {
+ char*rv=0;
+ if(!pagesize) { //init
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ pagesize=si.dwPageSize;
+ pagemask=pagesize-1;
+ }
+ assert(size > 0);
+ if(size>VMLIMIT) {
+ rv = VirtualAlloc(0,size,MEM_COMMIT,PAGE_READWRITE);
+ assert(isvirt(rv));
+ }
+ else {
+ char one64=sizeof(uint64),two64=one64*2;
+ char*p=malloc(size+two64);
+ if(!p)
+ return p;
+ if(isvirt(p+two64)) {
+ rv=p+one64;
+ rv[-1]=one64;
+ } else {
+ rv=p+two64;
+ rv[-1]=two64;
+ }
+ assert(!isvirt(rv));
+ assert(rv-rv[-1]==p);
+ }
+ return rv;
+}
+
+void* NdbMem_AllocateAlign(size_t size, size_t alignment)
+{
+ (void)alignment; /* remove warning for unused parameter */
+ /*
+ return (void*)memalign(alignment, size);
+ TEMP fix
+ */
+ return NdbMem_Allocate(size);
+}
+
+#else
void* NdbMem_Allocate(size_t size)
{
void* mem_allocated;
@@ -49,15 +106,14 @@
return (void*)memalign(alignment, size);
TEMP fix
*/
- return (void*)malloc(size);
+ return NdbMem_Allocate(size);
}
-
void NdbMem_Free(void* ptr)
{
free(ptr);
}
-
+#endif
int NdbMem_MemLockAll(int i){
if (i == 1)
=== modified file 'storage/ndb/src/common/portlib/NdbThread.c'
--- storage/ndb/src/common/portlib/NdbThread.c 2009-09-08 15:12:34 +0000
+++ storage/ndb/src/common/portlib/NdbThread.c 2009-09-17 05:30:47 +0000
@@ -269,7 +269,7 @@
DBUG_ENTER("NdbThread_Destroy");
if (*p_thread != NULL){
DBUG_PRINT("enter",("*p_thread: 0x%lx", (long) *p_thread));
- free(* p_thread);
+ NdbMem_Free(* p_thread);
* p_thread = 0;
}
DBUG_VOID_RETURN;
=== modified file 'storage/ndb/src/kernel/error/ErrorReporter.cpp'
--- storage/ndb/src/kernel/error/ErrorReporter.cpp 2009-05-27 15:21:45 +0000
+++ storage/ndb/src/kernel/error/ErrorReporter.cpp 2009-09-17 06:18:52 +0000
@@ -69,7 +69,6 @@
unsigned int traceFileNo;
char *file_name= NdbConfig_NextTraceFileName(globalData.ownId);
- NdbAutoPtr<char> tmp_aptr(file_name);
/*
* Read last number from tracefile
@@ -105,6 +104,7 @@
fclose(stream);
}
+ NdbMem_Free(file_name);
return traceFileNo;
}
@@ -243,6 +243,7 @@
const char* thrdProblemData,
const char* thrdObjRef,
NdbShutdownType & nst){
+ int rv=0;
FILE *stream;
unsigned offset;
unsigned long maxOffset; // Maximum size of file.
@@ -260,7 +261,6 @@
if (globalData.ownId > 0)
theTraceFileName= NdbConfig_TraceFileName(globalData.ownId,
ErrorReporter::get_trace_no());
- NdbAutoPtr<char> tmp_aptr1(theTraceFileName);
// The first 69 bytes is info about the current offset
Uint32 noMsg = globalEmulatorData.theConfiguration->maxNoOfErrorLogs();
@@ -268,7 +268,6 @@
maxOffset = (69 + (noMsg * MESSAGE_LENGTH));
char *theErrorFileName= (char *)NdbConfig_ErrorFileName(globalData.ownId);
- NdbAutoPtr<char> tmp_aptr2(theErrorFileName);
stream = fopen(theErrorFileName, "r+");
if (stream == NULL) { /* If the file could not be opened. */
@@ -279,7 +278,8 @@
if(stream == NULL)
{
fprintf(stderr,"Unable to open error log file: %s\n", theErrorFileName);
- return -1;
+ rv=-1;
+ goto end;
}
fprintf(stream, "%s%u%s", "Current byte-offset of file-pointer is: ", 69,
" \n\n\n");
@@ -364,8 +364,12 @@
fclose(jamStream);
}
}
-
- return 0;
+end:
+ if(theTraceFileName)
+ NdbMem_Free(theTraceFileName);
+ if(theErrorFileName)
+ NdbMem_Free(theErrorFileName);
+ return rv;
}
void
=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp'
--- storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2009-09-08 15:12:34 +0000
+++ storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2009-09-17 05:30:47 +0000
@@ -53,6 +53,7 @@
#include <NdbConfig.h>
#include <NdbAutoPtr.hpp>
+#include <NdbMem.h>
#include <ndberror.h>
@@ -652,7 +653,7 @@
char *clusterLog= NdbConfig_ClusterLogFileName(_ownNodeId);
logdest.assfmt("FILE:filename=%s,maxsize=1000000,maxfiles=6",
clusterLog);
- free(clusterLog);
+ NdbMem_Free(clusterLog);
}
int err= 0;
[31 Aug 2010 7:07]
Jonas Oreland
won't fix
