eae698a61e
ICU does not report Out-Of-Memory (OOM) if it fails to memory map the data file(s) when calling the various platform API(s) to do so. When you are using ICU with memory-mapped data file(s), and ICU fails to map the data file due to being out-of-memory, it does not bubble this failure up to the API that was called. You will instead get back the error U_MISSING_RESOURCE_ERROR, rather than U_MEMORY_ALLOCATION_ERROR, which might be a bit surprising to the caller of the API. This can lead to the application thinking that there are no resources for "en_US" or "en" (or even "root"). This change modifies ICU4C so that it will report back U_MEMORY_ALLOCATION_ERROR if OOM happens when attempting to load the data files.
58 lines
2.1 KiB
C
58 lines
2.1 KiB
C
// © 2016 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
/*
|
|
******************************************************************************
|
|
*
|
|
* Copyright (C) 1999-2011, International Business Machines
|
|
* Corporation and others. All Rights Reserved.
|
|
*
|
|
******************************************************************************/
|
|
|
|
/*----------------------------------------------------------------------------------
|
|
*
|
|
* Memory mapped file wrappers for use by the ICU Data Implementation
|
|
*
|
|
* Porting note: The implementation of these functions is very platform specific.
|
|
* Not all platforms can do real memory mapping. Those that can't
|
|
* still must implement these functions, getting the data into memory using
|
|
* whatever means are available.
|
|
*
|
|
* These functions are part of the ICU internal implementation, and
|
|
* are not inteded to be used directly by applications.
|
|
*
|
|
*----------------------------------------------------------------------------------*/
|
|
|
|
#ifndef __UMAPFILE_H__
|
|
#define __UMAPFILE_H__
|
|
|
|
#include "unicode/putil.h"
|
|
#include "unicode/udata.h"
|
|
#include "putilimp.h"
|
|
|
|
U_CFUNC UBool uprv_mapFile(UDataMemory *pdm, const char *path, UErrorCode *status);
|
|
U_CFUNC void uprv_unmapFile(UDataMemory *pData);
|
|
|
|
/* MAP_NONE: no memory mapping, no file access at all */
|
|
#define MAP_NONE 0
|
|
#define MAP_WIN32 1
|
|
#define MAP_POSIX 2
|
|
#define MAP_STDIO 3
|
|
#define MAP_390DLL 4
|
|
|
|
#if UCONFIG_NO_FILE_IO
|
|
# define MAP_IMPLEMENTATION MAP_NONE
|
|
#elif U_PLATFORM_USES_ONLY_WIN32_API
|
|
# define MAP_IMPLEMENTATION MAP_WIN32
|
|
#elif U_HAVE_MMAP || U_PLATFORM == U_PF_OS390
|
|
# if U_PLATFORM == U_PF_OS390 && defined (OS390_STUBDATA)
|
|
/* No memory mapping for 390 batch mode. Fake it using dll loading. */
|
|
# define MAP_IMPLEMENTATION MAP_390DLL
|
|
# else
|
|
# define MAP_IMPLEMENTATION MAP_POSIX
|
|
# endif
|
|
#else /* unknown platform, no memory map implementation: use stdio.h and uprv_malloc() instead */
|
|
# define MAP_IMPLEMENTATION MAP_STDIO
|
|
#endif
|
|
|
|
#endif
|