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