正在显示
1 个修改的文件
包含
83 行增加
和
82 行删除
| @@ -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 | } |
-
请 注册 或 登录 后发表评论