Skip to content

Commit

Permalink
Bug 857830: Part 2 - Adds readahead to read-only fopen calls in Hunsp…
Browse files Browse the repository at this point in the history
…ell. r=ehsan
  • Loading branch information
dblohm7 committed May 7, 2013
1 parent 389f03a commit fc8b941
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 2 deletions.
79 changes: 79 additions & 0 deletions extensions/spellcheck/hunspell/src/hunspell_fopen_hooks.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef fopen_hooks_h__
#define fopen_hooks_h__

/**
* This file is force-included in hunspell code. Its purpose is to add
* readahead to fopen() calls in hunspell without modifying its code, in order
* to ease future upgrades.
*
* This file is force-included through mozilla-config.h which is generated
* during the configure step.
*/

#include "mozilla/FileUtils.h"
#include <stdio.h>
#include <string.h>

#if defined(XP_WIN)
#include "nsString.h"

#include <fcntl.h>
#include <windows.h>
// Hunspell defines a function named near. Windef.h #defines near.
#undef near
// mozHunspell defines a function named RemoveDirectory.
#undef RemoveDirectory
#endif /* defined(XP_WIN) */

inline FILE*
hunspell_fopen_readahead(const char* filename, const char* mode)
{
if (!filename || !mode) {
return nullptr;
}
// Fall back to libc's fopen for modes not supported by ReadAheadFile
if (!strchr(mode, 'r') || strchr(mode, '+')) {
return fopen(filename, mode);
}
int fd = -1;
#if defined(XP_WIN)
HANDLE handle = INVALID_HANDLE_VALUE;
mozilla::ReadAheadFile(NS_ConvertUTF8toUTF16(filename).get(), 0, SIZE_MAX,
&handle);
if (handle == INVALID_HANDLE_VALUE) {
return nullptr;
}
int flags = _O_RDONLY;
// MSVC CRT's _open_osfhandle only supports adding _O_TEXT, not _O_BINARY
if (strchr(mode, 't')) {
// Force translated mode
flags |= _O_TEXT;
}
// Import the Win32 fd into the CRT
fd = _open_osfhandle((intptr_t)handle, flags);
if (fd < 0) {
CloseHandle(handle);
return nullptr;
}
#else
mozilla::ReadAheadFile(filename, 0, SIZE_MAX, &fd);
if (fd < 0) {
return nullptr;
}
#endif /* defined(XP_WIN) */

FILE* file = fdopen(fd, mode);
if (!file) {
close(fd);
}
return file;
}

#define fopen(filename, mode) hunspell_fopen_readahead(filename, mode)

#endif /* fopen_hooks_h__ */

5 changes: 3 additions & 2 deletions mozilla-config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@
* is defined before <stdint.h> is included. */
#define __STDC_LIMIT_MACROS

/* Force-include hunspell_alloc_hooks.h for hunspell, so that we don't need to
* modify it directly.
/* Force-include hunspell_alloc_hooks.h and hunspell_fopen_hooks.h for hunspell,
* so that we don't need to modify it directly.
*
* HUNSPELL_STATIC is defined in extensions/spellcheck/hunspell/src/Makefile.in,
* unless --enable-system-hunspell is defined.
*/
#if defined(HUNSPELL_STATIC)
#include "hunspell_alloc_hooks.h"
#include "hunspell_fopen_hooks.h"
#endif

#endif /* _MOZILLA_CONFIG_H_ */
Expand Down

0 comments on commit fc8b941

Please sign in to comment.