Initialize Tizen 2.3
[framework/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         unsigned int sp;
41         char buf[BUF_SIZE];
42         FILE *file;
43         unsigned int stacktop;
44         int found = 0;
45
46         sp = GETSP();
47
48         sprintf(buf, "/proc/%d/maps", getpid());
49         file = fopen(buf, "r");
50         while (fgets(buf, BUF_SIZE, file) != NULL) {
51                 if (strstr(buf, "[stack]")) {
52                         found = 1;
53                         break;
54                 }
55         }
56         fclose(file);
57
58         if (found) {
59                 sscanf(buf, "%x-", &stacktop);
60                 if (madvise
61                     ((void *)PAGE_ALIGN(stacktop), PAGE_ALIGN(sp) - stacktop,
62                      MADV_DONTNEED) < 0)
63                         perror("stack madvise fail");
64         }
65 }