| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2005 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | // | 
|  | 18 | // Ports of standard functions that don't exist on a specific platform. | 
|  | 19 | // | 
|  | 20 | // Note these are NOT in the "android" namespace. | 
|  | 21 | // | 
|  | 22 | #include <utils/ported.h> | 
|  | 23 |  | 
|  | 24 | #if defined(NEED_GETTIMEOFDAY) || defined(NEED_USLEEP) | 
|  | 25 | # include <sys/time.h> | 
|  | 26 | # include <windows.h> | 
|  | 27 | #endif | 
|  | 28 |  | 
|  | 29 |  | 
|  | 30 | #if defined(NEED_GETTIMEOFDAY) | 
|  | 31 | /* | 
|  | 32 | * Replacement gettimeofday() for Windows environments (primarily MinGW). | 
|  | 33 | * | 
|  | 34 | * Ignores "tz". | 
|  | 35 | */ | 
|  | 36 | int gettimeofday(struct timeval* ptv, struct timezone* tz) | 
|  | 37 | { | 
|  | 38 | long long nsTime;   // time in 100ns units since Jan 1 1601 | 
|  | 39 | FILETIME ft; | 
|  | 40 |  | 
|  | 41 | if (tz != NULL) { | 
|  | 42 | // oh well | 
|  | 43 | } | 
|  | 44 |  | 
|  | 45 | ::GetSystemTimeAsFileTime(&ft); | 
|  | 46 | nsTime = (long long) ft.dwHighDateTime << 32 | | 
|  | 47 | (long long) ft.dwLowDateTime; | 
|  | 48 | // convert to time in usec since Jan 1 1970 | 
|  | 49 | ptv->tv_usec = (long) ((nsTime / 10LL) % 1000000LL); | 
|  | 50 | ptv->tv_sec = (long) ((nsTime - 116444736000000000LL) / 10000000LL); | 
|  | 51 |  | 
|  | 52 | return 0; | 
|  | 53 | } | 
|  | 54 | #endif | 
|  | 55 |  | 
|  | 56 | #if defined(NEED_USLEEP) | 
|  | 57 | // | 
|  | 58 | // Replacement usleep for Windows environments (primarily MinGW). | 
|  | 59 | // | 
|  | 60 | void usleep(unsigned long usec) | 
|  | 61 | { | 
|  | 62 | // Win32 API function Sleep() takes milliseconds | 
|  | 63 | ::Sleep((usec + 500) / 1000); | 
|  | 64 | } | 
|  | 65 | #endif | 
|  | 66 |  | 
|  | 67 | #if 0 //defined(NEED_PIPE) | 
|  | 68 | // | 
|  | 69 | // Replacement pipe() command for MinGW | 
|  | 70 | // | 
|  | 71 | // The _O_NOINHERIT flag sets bInheritHandle to FALSE in the | 
|  | 72 | // SecurityAttributes argument to CreatePipe().  This means the handles | 
|  | 73 | // aren't inherited when a new process is created.  The examples I've seen | 
|  | 74 | // use it, possibly because there's a lot of junk going on behind the | 
|  | 75 | // scenes.  (I'm assuming "process" and "thread" are different here, so | 
|  | 76 | // we should be okay spinning up a thread.)  The recommended practice is | 
|  | 77 | // to dup() the descriptor you want the child to have. | 
|  | 78 | // | 
|  | 79 | // It appears that unnamed pipes can't do non-blocking ("overlapped") I/O. | 
|  | 80 | // You can't use select() either, since that only works on sockets.  The | 
|  | 81 | // Windows API calls that are useful here all operate on a HANDLE, not | 
|  | 82 | // an integer file descriptor, and I don't think you can get there from | 
|  | 83 | // here.  The "named pipe" stuff is insane. | 
|  | 84 | // | 
|  | 85 | int pipe(int filedes[2]) | 
|  | 86 | { | 
|  | 87 | return _pipe(filedes, 0, _O_BINARY | _O_NOINHERIT); | 
|  | 88 | } | 
|  | 89 | #endif | 
|  | 90 |  | 
|  | 91 | #if defined(NEED_SETENV) | 
|  | 92 | /* | 
|  | 93 | * MinGW lacks these.  For now, just stub them out so the code compiles. | 
|  | 94 | */ | 
|  | 95 | int setenv(const char* name, const char* value, int overwrite) | 
|  | 96 | { | 
|  | 97 | return 0; | 
|  | 98 | } | 
|  | 99 | void unsetenv(const char* name) | 
|  | 100 | { | 
|  | 101 | } | 
|  | 102 | char* getenv(const char* name) | 
|  | 103 | { | 
|  | 104 | return NULL; | 
|  | 105 | } | 
|  | 106 | #endif |