df18d5980f591c2f4dea5e071e9006dde2e7a8a1
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / include / stacktrim.h
1 /*
2  * bluetooth-frwk
3  *
4  * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *              http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #ifndef __STACKTRIM_H__
21 #define __STACKTRIM_H__
22
23 #include <stdio.h>
24 #include <unistd.h>
25 #include <string.h>
26 #include <sys/mman.h>
27
28 #define BUF_SIZE                256
29 #define PAGE_SIZE               (1 << 12)
30 #define _ALIGN_UP(addr, size)    (((addr)+((size)-1))&(~((size)-1)))
31 #define _ALIGN_DOWN(addr, size) ((addr)&(~((size)-1)))
32 #define PAGE_ALIGN(addr)        _ALIGN_DOWN(addr, PAGE_SIZE)
33
34 static inline void stack_trim(void)
35 {
36 #ifdef STACK_FLUSH
37         unsigned int sp;
38         char buf[BUF_SIZE];
39         FILE *file;
40         unsigned int stacktop;
41         int found = 0;
42
43         asm volatile ("mov %0,sp " : "=r"(sp));
44
45         sprintf(buf, "/proc/%d/maps", getpid());
46         file = fopen(buf, "r");
47         while (fgets(buf, BUF_SIZE, file) != NULL) {
48                 if (strstr(buf, "[stack]")) {
49                         found = 1;
50                         break;
51                 }
52         }
53         fclose(file);
54
55         if (found) {
56                 sscanf(buf, "%x-", &stacktop);
57                 if (madvise((void *)PAGE_ALIGN(stacktop), PAGE_ALIGN(sp) - stacktop,
58                                                                                 MADV_DONTNEED) < 0)
59                         perror("stack madvise fail");
60         }
61 #endif
62 }
63
64 #endif                          /* __STACKTRIM_H__ */