1 /* Copyright (C) 2008 The Android Open Source Project 2 ** 3 ** This software is licensed under the terms of the GNU General Public 4 ** License version 2, as published by the Free Software Foundation, and 5 ** may be copied, distributed, and modified under those terms. 6 ** 7 ** This program is distributed in the hope that it will be useful, 8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 ** GNU General Public License for more details. 11 */ 12 #include "android/utils/system.h" 13 #include <stdlib.h> 14 #include <stdio.h> 15 #ifdef _WIN32 16 # define WIN32_LEAN_AND_MEAN 17 # include <windows.h> /* for Sleep */ 18 #else 19 # include <unistd.h> /* for usleep */ 20 #endif 21 22 void* 23 android_alloc( size_t size ) 24 { 25 void* block; 26 27 if (size == 0) 28 return NULL; 29 30 block = malloc(size); 31 if (block != NULL) 32 return block; 33 34 fprintf(stderr, "PANIC: not enough memory\n"); 35 exit(1); 36 return NULL; 37 } 38 39 void* 40 android_alloc0( size_t size ) 41 { 42 void* block; 43 44 if (size == 0) 45 return NULL; 46 47 block = calloc(1, size); 48 if (block != NULL) 49 return block; 50 51 fprintf(stderr, "PANIC: not enough memory\n"); 52 exit(1); 53 return NULL; 54 } 55 56 void* 57 android_realloc( void* block, size_t size ) 58 { 59 void* block2; 60 61 if (size == 0) { 62 free(block); 63 return NULL; 64 } 65 block2 = realloc(block, size); 66 if (block2 != NULL) 67 return block2; 68 69 fprintf(stderr, "PANIC: not enough memory to reallocate %d bytes\n", size); 70 exit(1); 71 return NULL; 72 } 73 74 void 75 android_free( void* block ) 76 { 77 if (block) 78 free(block); 79 } 80 81 char* 82 android_strdup( const char* str ) 83 { 84 int len; 85 char* copy; 86 87 if (str == NULL) 88 return NULL; 89 90 len = strlen(str); 91 copy = malloc(len+1); 92 memcpy(copy, str, len); 93 copy[len] = 0; 94 95 return copy; 96 } 97 98 #ifdef _WIN32 99 char* 100 win32_strsep(char** pline, const char* delim) 101 { 102 char* line = *pline; 103 char* p = line; 104 105 if (p == NULL) 106 return NULL; 107 108 for (;;) { 109 int c = *p++; 110 const char* q = delim; 111 112 if (c == 0) { 113 p = NULL; 114 break; 115 } 116 117 while (*q) { 118 if (*q == c) { 119 p[-1] = 0; 120 goto Exit; 121 } 122 q++; 123 } 124 } 125 Exit: 126 *pline = p; 127 return line; 128 } 129 #endif 130 131 132 void 133 disable_sigalrm( signal_state_t *state ) 134 { 135 #ifdef _WIN32 136 (void)state; 137 #else 138 sigset_t set; 139 140 sigemptyset(&set); 141 sigaddset(&set, SIGALRM); 142 pthread_sigmask (SIG_BLOCK, &set, &state->old); 143 #endif 144 } 145 146 void 147 restore_sigalrm( signal_state_t *state ) 148 { 149 #ifdef _WIN32 150 (void)state; 151 #else 152 pthread_sigmask (SIG_SETMASK, &state->old, NULL); 153 #endif 154 } 155 156 void 157 sleep_ms( int timeout_ms ) 158 { 159 #ifdef _WIN32 160 if (timeout_ms <= 0) 161 return; 162 163 Sleep( timeout_ms ); 164 #else 165 if (timeout_ms <= 0) 166 return; 167 168 BEGIN_NOSIGALRM 169 usleep( timeout_ms*1000 ); 170 END_NOSIGALRM 171 #endif 172 } 173