winlin

research st: refine skt.

@@ -46,7 +46,6 @@ @@ -46,7 +46,6 @@
46 #include <sys/mman.h> 46 #include <sys/mman.h>
47 #include "common.h" 47 #include "common.h"
48 48
49 -  
50 /* How much space to leave between the stacks, at each end */ 49 /* How much space to leave between the stacks, at each end */
51 #define REDZONE _ST_PAGE_SIZE 50 #define REDZONE _ST_PAGE_SIZE
52 51
@@ -58,116 +57,118 @@ static char *_st_new_stk_segment(int size); @@ -58,116 +57,118 @@ static char *_st_new_stk_segment(int size);
58 57
59 _st_stack_t *_st_stack_new(int stack_size) 58 _st_stack_t *_st_stack_new(int stack_size)
60 { 59 {
61 - _st_clist_t *qp;  
62 - _st_stack_t *ts;  
63 - int extra;  
64 -  
65 - for (qp = _st_free_stacks.next; qp != &_st_free_stacks; qp = qp->next) {  
66 - ts = _ST_THREAD_STACK_PTR(qp);  
67 - if (ts->stk_size >= stack_size) {  
68 - /* Found a stack that is big enough */  
69 - ST_REMOVE_LINK(&ts->links);  
70 - _st_num_free_stacks--;  
71 - ts->links.next = NULL;  
72 - ts->links.prev = NULL;  
73 - return ts; 60 + _st_clist_t *qp;
  61 + _st_stack_t *ts;
  62 + int extra;
  63 +
  64 + for (qp = _st_free_stacks.next; qp != &_st_free_stacks; qp = qp->next) {
  65 + ts = _ST_THREAD_STACK_PTR(qp);
  66 + if (ts->stk_size >= stack_size) {
  67 + /* Found a stack that is big enough */
  68 + ST_REMOVE_LINK(&ts->links);
  69 + _st_num_free_stacks--;
  70 + ts->links.next = NULL;
  71 + ts->links.prev = NULL;
  72 + return ts;
  73 + }
74 } 74 }
75 - }  
76 -  
77 - /* Make a new thread stack object. */  
78 - if ((ts = (_st_stack_t *)calloc(1, sizeof(_st_stack_t))) == NULL)  
79 - return NULL;  
80 - extra = _st_randomize_stacks ? _ST_PAGE_SIZE : 0;  
81 - ts->vaddr_size = stack_size + 2*REDZONE + extra;  
82 - ts->vaddr = _st_new_stk_segment(ts->vaddr_size);  
83 - if (!ts->vaddr) {  
84 - free(ts);  
85 - return NULL;  
86 - }  
87 - ts->stk_size = stack_size;  
88 - ts->stk_bottom = ts->vaddr + REDZONE;  
89 - ts->stk_top = ts->stk_bottom + stack_size;  
90 - 75 +
  76 + /* Make a new thread stack object. */
  77 + if ((ts = (_st_stack_t *)calloc(1, sizeof(_st_stack_t))) == NULL) {
  78 + return NULL;
  79 + }
  80 + extra = _st_randomize_stacks ? _ST_PAGE_SIZE : 0;
  81 + ts->vaddr_size = stack_size + 2*REDZONE + extra;
  82 + ts->vaddr = _st_new_stk_segment(ts->vaddr_size);
  83 + if (!ts->vaddr) {
  84 + free(ts);
  85 + return NULL;
  86 + }
  87 + ts->stk_size = stack_size;
  88 + ts->stk_bottom = ts->vaddr + REDZONE;
  89 + ts->stk_top = ts->stk_bottom + stack_size;
  90 +
91 #ifdef DEBUG 91 #ifdef DEBUG
92 - mprotect(ts->vaddr, REDZONE, PROT_NONE);  
93 - mprotect(ts->stk_top + extra, REDZONE, PROT_NONE); 92 + mprotect(ts->vaddr, REDZONE, PROT_NONE);
  93 + mprotect(ts->stk_top + extra, REDZONE, PROT_NONE);
94 #endif 94 #endif
95 -  
96 - if (extra) {  
97 - long offset = (random() % extra) & ~0xf;  
98 -  
99 - ts->stk_bottom += offset;  
100 - ts->stk_top += offset;  
101 - }  
102 -  
103 - return ts; 95 +
  96 + if (extra) {
  97 + long offset = (random() % extra) & ~0xf;
  98 +
  99 + ts->stk_bottom += offset;
  100 + ts->stk_top += offset;
  101 + }
  102 +
  103 + return ts;
104 } 104 }
105 105
106 -  
107 /* 106 /*
108 * Free the stack for the current thread 107 * Free the stack for the current thread
109 */ 108 */
110 void _st_stack_free(_st_stack_t *ts) 109 void _st_stack_free(_st_stack_t *ts)
111 { 110 {
112 - if (!ts)  
113 - return;  
114 -  
115 - /* Put the stack on the free list */  
116 - ST_APPEND_LINK(&ts->links, _st_free_stacks.prev);  
117 - _st_num_free_stacks++; 111 + if (!ts) {
  112 + return;
  113 + }
  114 +
  115 + /* Put the stack on the free list */
  116 + ST_APPEND_LINK(&ts->links, _st_free_stacks.prev);
  117 + _st_num_free_stacks++;
118 } 118 }
119 119
120 -  
121 static char *_st_new_stk_segment(int size) 120 static char *_st_new_stk_segment(int size)
122 { 121 {
123 #ifdef MALLOC_STACK 122 #ifdef MALLOC_STACK
124 - void *vaddr = malloc(size);  
125 -#else  
126 - static int zero_fd = -1;  
127 - int mmap_flags = MAP_PRIVATE;  
128 - void *vaddr;  
129 -  
130 -#if defined (MD_USE_SYSV_ANON_MMAP)  
131 - if (zero_fd < 0) {  
132 - if ((zero_fd = open("/dev/zero", O_RDWR, 0)) < 0)  
133 - return NULL;  
134 - fcntl(zero_fd, F_SETFD, FD_CLOEXEC);  
135 - }  
136 -#elif defined (MD_USE_BSD_ANON_MMAP)  
137 - mmap_flags |= MAP_ANON; 123 + void *vaddr = malloc(size);
138 #else 124 #else
139 -#error Unknown OS 125 + static int zero_fd = -1;
  126 + int mmap_flags = MAP_PRIVATE;
  127 + void *vaddr;
  128 +
  129 + #if defined (MD_USE_SYSV_ANON_MMAP)
  130 + if (zero_fd < 0) {
  131 + if ((zero_fd = open("/dev/zero", O_RDWR, 0)) < 0) {
  132 + return NULL;
  133 + }
  134 + fcntl(zero_fd, F_SETFD, FD_CLOEXEC);
  135 + }
  136 + #elif defined (MD_USE_BSD_ANON_MMAP)
  137 + mmap_flags |= MAP_ANON;
  138 + #else
  139 + #error Unknown OS
  140 + #endif
  141 +
  142 + vaddr = mmap(NULL, size, PROT_READ | PROT_WRITE, mmap_flags, zero_fd, 0);
  143 + if (vaddr == (void *)MAP_FAILED) {
  144 + return NULL;
  145 + }
  146 +
140 #endif 147 #endif
141 -  
142 - vaddr = mmap(NULL, size, PROT_READ | PROT_WRITE, mmap_flags, zero_fd, 0);  
143 - if (vaddr == (void *)MAP_FAILED)  
144 - return NULL;  
145 -  
146 -#endif /* MALLOC_STACK */  
147 -  
148 - return (char *)vaddr; 148 +
  149 + return (char *)vaddr;
149 } 150 }
150 151
151 -  
152 /* Not used */ 152 /* Not used */
153 #if 0 153 #if 0
154 void _st_delete_stk_segment(char *vaddr, int size) 154 void _st_delete_stk_segment(char *vaddr, int size)
155 { 155 {
156 #ifdef MALLOC_STACK 156 #ifdef MALLOC_STACK
157 - free(vaddr); 157 + free(vaddr);
158 #else 158 #else
159 - (void) munmap(vaddr, size); 159 + (void) munmap(vaddr, size);
160 #endif 160 #endif
161 } 161 }
162 #endif 162 #endif
163 163
164 int st_randomize_stacks(int on) 164 int st_randomize_stacks(int on)
165 { 165 {
166 - int wason = _st_randomize_stacks;  
167 -  
168 - _st_randomize_stacks = on;  
169 - if (on)  
170 - srandom((unsigned int) st_utime());  
171 -  
172 - return wason; 166 + int wason = _st_randomize_stacks;
  167 +
  168 + _st_randomize_stacks = on;
  169 + if (on) {
  170 + srandom((unsigned int) st_utime());
  171 + }
  172 +
  173 + return wason;
173 } 174 }