18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2008 The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms.
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful,
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _ANDROID_UTILS_SYSTEM_H
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _ANDROID_UTILS_SYSTEM_H
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h>
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdint.h>
17c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh#define __STDC_FORMAT_MACROS 1
18622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#include <inttypes.h>  /* for PRId64 et al. */
194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include "android/utils/assert.h"
204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner/* internal helpers */
224c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnervoid*  _android_array_alloc( size_t  itemSize, size_t  count );
234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnervoid*  _android_array_alloc0( size_t  itemSize, size_t  count );
244c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnervoid*  _android_array_realloc( void* block, size_t  itemSize, size_t  count );
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the following functions perform 'checked allocations', i.e.
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * they abort if there is not enough memory.
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checked malloc, only returns NULL if size is 0 */
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid*  android_alloc( size_t  size );
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checked calloc, only returns NULL if size is 0 */
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid*  android_alloc0( size_t  size );
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checked realloc, only returns NULL if size if 0 */
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid*  android_realloc( void*  block, size_t  size );
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* free memory block */
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid   android_free( void*  block );
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* convenience macros */
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AZERO(p)             memset((char*)(p),0,sizeof(*(p)))
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  ANEW(p)              (p = android_alloc(sizeof(*p)))
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  ANEW0(p)             (p = android_alloc0(sizeof(*p)))
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AFREE(p)             android_free(p)
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AMEM_ZERO(dst,size)      memset((char*)(dst), 0, (size_t)(size))
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AMEM_COPY(dst,src,size)  memcpy((char*)(dst),(const char*)(src),(size_t)(size))
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AMEM_MOVE(dst,src,size)  memmove((char*)(dst),(const char*)(src),(size_t)(size))
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
534c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AARRAY_NEW(p,count)          (AASSERT_LOC(), (p) = _android_array_alloc(sizeof(*p),(count)))
544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AARRAY_NEW0(p,count)         (AASSERT_LOC(), (p) = _android_array_alloc0(sizeof(*p),(count)))
554c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AARRAY_RENEW(p,count)        (AASSERT_LOC(), (p) = _android_array_realloc((p),sizeof(*(p)),(count)))
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AARRAY_COPY(dst,src,count)   AMEM_COPY(dst,src,(count)*sizeof((dst)[0]))
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AARRAY_MOVE(dst,src,count)   AMEM_MOVE(dst,src,(count)*sizeof((dst)[0]))
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AARRAY_ZERO(dst,count)       AMEM_ZERO(dst,(count)*sizeof((dst)[0]))
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AARRAY_STATIC_LEN(a)         (sizeof((a))/sizeof((a)[0]))
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  AINLINED  static __inline__
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* unlike strdup(), this accepts NULL as valid input (and will return NULL then) */
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectchar*   android_strdup(const char*  src);
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  ASTRDUP(str)  android_strdup(str)
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* used for functions that return a Posix-style status code, i.e.
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 0 means success, -1 means failure with the error code in 'errno'
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef int  APosixStatus;
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* used for functions that return or accept a boolean type */
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef int  ABool;
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** Stringification macro
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef STRINGIFY
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  _STRINGIFY(x)  #x
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  STRINGIFY(x)  _STRINGIFY(x)
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** Concatenation macros
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef GLUE
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  _GLUE(x,y)  x##y
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  GLUE(x,y)   _GLUE(x,y)
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  _GLUE3(x,y,z)  x##y##z
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  GLUE3(x,y,z)    _GLUE3(x,y,z)
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** Handle strsep() on Win32
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  undef   strsep
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  strsep    win32_strsep
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char*  win32_strsep(char**  pline, const char*  delim);
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** Handle strcasecmp on Windows
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  strcasecmp  stricmp
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** EINTR HANDLING
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** since QEMU uses SIGALRM pretty extensively, having a system call returning
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** EINTR on Unix happens very frequently. provide a simple macro to guard against
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** this.
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define   CHECKED(ret, call)    (ret) = (call)
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define   CHECKED(ret, call)    do { (ret) = (call); } while ((ret) < 0 && errno == EINTR)
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SIGNAL HANDLING
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** the following can be used to block SIGALRM for a given period of time.
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** use with caution, the QEMU execution loop uses SIGALRM extensively
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { int  dumy; }      signal_state_t;
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <signal.h>
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { sigset_t  old; }  signal_state_t;
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern  void   disable_sigalrm( signal_state_t  *state );
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern  void   restore_sigalrm( signal_state_t  *state );
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define   BEGIN_NOSIGALRM  \
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define   END_NOSIGALRM  \
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* !WIN32 */
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define   BEGIN_NOSIGALRM  \
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { signal_state_t  __sigalrm_state; \
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      disable_sigalrm( &__sigalrm_state );
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define   END_NOSIGALRM  \
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      restore_sigalrm( &__sigalrm_state );  \
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* !WIN32 */
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** TIME HANDLING
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** sleep for a given time in milliseconds. note: this uses
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** disable_sigalrm()/restore_sigalrm()
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern  void   sleep_ms( int  timeout );
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
166622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner/** FORMATTING int64_t in printf() statements
167622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner **
168622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner ** Normally defined in <inttypes.h> except on Windows and maybe others.
169622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner **/
170622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner
171622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#ifndef PRId64
172622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#  define PRId64  "lld"
173622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#endif
174622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#ifndef PRIx64
175622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#  define PRIx64  "llx"
176622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#endif
177c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh#ifndef PRIu64
178c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh#  define PRIu64  "llu"
179462564f31bbdc9939bf1d2376e2782defa7ef655David 'Digit' Turner#endif
180622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* */
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* _ANDROID_UTILS_SYSTEM_H */
184