1 /* Copyright (c) 2000, 2007 MySQL AB
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; version 2 of the License.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 GNU General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with this program; if not, write to the Free Software
14 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
16 /* Alloc a block of locked memory */
18 #include "mysys_priv.h"
19 #include "mysys_err.h"
34 uchar
*my_malloc_lock(uint size
,myf MyFlags
)
37 uint pagesize
=sysconf(_SC_PAGESIZE
);
39 struct st_mem_list
*element
;
40 DBUG_ENTER("my_malloc_lock");
42 size
=((size
-1) & ~(pagesize
-1))+pagesize
;
43 if (!(ptr
=memalign(pagesize
,size
)))
45 if (MyFlags
& (MY_FAE
+MY_WME
))
46 my_error(EE_OUTOFMEMORY
, MYF(ME_BELL
+ME_WAITTANG
),size
);
49 success
= mlock((uchar
*) ptr
,size
);
50 if (success
!= 0 && geteuid() == 0)
52 DBUG_PRINT("warning",("Failed to lock memory. errno %d\n",
54 fprintf(stderr
, "Warning: Failed to lock memory. errno %d\n",
59 /* Add block in a list for munlock */
60 if (!(element
=(struct st_mem_list
*) my_malloc(sizeof(*element
),MyFlags
)))
62 VOID(munlock((uchar
*) ptr
,size
));
66 element
->list
.data
=(uchar
*) element
;
69 pthread_mutex_lock(&THR_LOCK_malloc
);
70 mem_list
=list_add(mem_list
,&element
->list
);
71 pthread_mutex_unlock(&THR_LOCK_malloc
);
77 void my_free_lock(uchar
*ptr
,myf Myflags
__attribute__((unused
)))
80 struct st_mem_list
*element
=0;
82 pthread_mutex_lock(&THR_LOCK_malloc
);
83 for (list
=mem_list
; list
; list
=list
->next
)
85 element
=(struct st_mem_list
*) list
->data
;
86 if (ptr
== element
->page
)
87 { /* Found locked mem */
88 VOID(munlock((uchar
*) ptr
,element
->size
));
89 mem_list
=list_delete(mem_list
,list
);
93 pthread_mutex_unlock(&THR_LOCK_malloc
);
95 my_free((uchar
*) element
,MYF(0));
96 free(ptr
); /* Free even if not locked */
99 #endif /* HAVE_MLOCK */