FIXED: Closes all streams after a OS.popen()

Previously, when popen was called, the 3 streams (stdin, stderr and stdourt) where never closed. This was the reason of the having an impossible number of open files.

This patch ensure all streams are closed after using them. This means that the ulimit trick is no more necessary
This commit is contained in:
Antoine Mercadal
2015-04-23 16:46:01 -07:00
parent c13f1991c9
commit bcb1630f20
13 changed files with 88 additions and 71 deletions
-2
View File
@@ -1,8 +1,6 @@
require("../common.jake");
checkUlimit();
var framework = require("objective-j/jake").framework,
BundleTask = require("objective-j/jake").BundleTask;
+17 -8
View File
@@ -366,22 +366,31 @@ function pressEnvironment(rootPath, outputFiles, environment, options) {
return {executable:includedBytes, data:dataBytes, mhtml:mhtmlBytes};
}
function pngcrushDirectory(directory) {
var directoryPath = FILE.path(directory);
var pngs = directoryPath.glob("**/*.png");
function pngcrushDirectory(directory)
{
var directoryPath = FILE.path(directory),
pngs = directoryPath.glob("**/*.png");
system.stderr.print("Running pngcrush on " + pngs.length + " pngs:");
pngs.forEach(function(dstPath) {
var tmpPath = FILE.path(dstPath+".tmp");
pngs.forEach(function(dstPath)
{
var tmpPath = FILE.path(dstPath+".tmp"),
p = OS.popen(["pngcrush", "-rem", "alla", "-reduce", /*"-brute",*/ dstPath, tmpPath]);
var p = OS.popen(["pngcrush", "-rem", "alla", "-reduce", /*"-brute",*/ dstPath, tmpPath]);
if (p.wait()) {
if (p.wait())
{
CPLog.warn("pngcrush failed. Ensure it's installed and on your PATH.");
}
else {
else
{
FILE.move(tmpPath, dstPath);
system.stderr.write(".").flush();
}
p.stdin.close();
p.stdout.close();
p.stderr.close();
});
system.stderr.print("");
}
+10 -2
View File
@@ -3,10 +3,18 @@ var OS = require("os");
exports.fontinfo = function(name, size)
{
var p = OS.popen(["fontinfo", "-n", name, size || 12]);
var p = OS.popen(["fontinfo", "-n", name, size || 12]),
result;
if (p.wait() === 0)
return JSON.parse(p.stdout.read());
result = p.stdout.read();
p.stdin.close();
p.stdout.close();
p.stderr.close();
if (result)
return JSON.parse(result);
else
return null;
};
+10 -2
View File
@@ -3,10 +3,18 @@ var OS = require("os");
exports.imagesize = function(path)
{
var p = OS.popen(["imagesize", "-n", path]);
var p = OS.popen(["imagesize", "-n", path]),
result;
if (p.wait() === 0)
return JSON.parse(p.stdout.read());
result = p.stdout.read();
p.stdin.close();
p.stdout.close();
p.stderr.close();
if (result)
return JSON.parse(result);
else
return null;
};
+4
View File
@@ -135,6 +135,10 @@ function generateDocs(/* boolean */ noFrame)
if (doxygenApps[0])
doxygen = FILE.join(doxygenApps[0], "Contents/Resources/doxygen");
}
p.stdin.close();
p.stdout.close();
p.stderr.close();
}
if (!doxygen || !FILE.exists(doxygen))
+6 -2
View File
@@ -277,12 +277,12 @@ CFHTTPRequest.prototype.removeEventListener = function(/*String*/ anEventName, /
this._eventDispatcher.removeEventListener(anEventName, anEventListener);
};
CFHTTPRequest.prototype.setWithCredentials = function(/*Boolean*/ willSendWithCredentials)
CFHTTPRequest.prototype.setWithCredentials = function(/*Boolean*/ willSendWithCredentials)
{
this._nativeRequest.withCredentials = willSendWithCredentials;
};
CFHTTPRequest.prototype.withCredentials = function()
CFHTTPRequest.prototype.withCredentials = function()
{
return this._nativeRequest.withCredentials;
};
@@ -330,6 +330,10 @@ function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure, onprogress)
while (chunk = gcc.stdout.read())
fileContents += chunk;
gcc.stdin.close();
gcc.stdout.close();
gcc.stderr.close();
if (fileContents.length > 0)
{
request._nativeRequest.responseText = fileContents;
@@ -46,7 +46,8 @@ function compileWithResolvedFlags(aFilePath, objjcFlags, gccFlags, asPlainJavasc
if (!shouldObjjPreprocess)
{
if (OS.popen("which gcc").stdout.read().length === 0)
var p = OS.popen("which gcc");
if (p.stdout.read().length === 0)
fileContents = FILE.read(aFilePath, { charset:"UTF-8" });
else
{
@@ -57,7 +58,15 @@ function compileWithResolvedFlags(aFilePath, objjcFlags, gccFlags, asPlainJavasc
while (chunk = gcc.stdout.read())
fileContents += chunk;
gcc.stdin.close();
gcc.stdout.close();
gcc.stderr.close();
}
p.stdin.close();
p.stdout.close();
p.stderr.close();
return fileContents;
}
@@ -22,7 +22,6 @@
var FILE = require("file");
var BUNDLE_TASK = require("objective-j/jake/bundletask");
exports.BundleTask = BUNDLE_TASK.BundleTask;
+9 -5
View File
@@ -40,8 +40,8 @@ $BROWSER_FILES = new FileList($BROWSER_FILE).include($OBJECTIVEJ_FILES);
filedir($BUILD_BROWSER_FILE, $BROWSER_FILES, function(aTask)
{
gcc($BROWSER_FILE,
$BUILD_BROWSER_FILE,
gcc($BROWSER_FILE,
$BUILD_BROWSER_FILE,
environmentFlags("Browser", "ObjJ").concat($INCLUDE_FLAGS, $DEBUG_FLAGS), $CONFIGURATION !== "Debug");
});
@@ -119,12 +119,16 @@ function gcc(inputFilePath, outputFilePath, flags, compress)
stream.print("Building... \0green(" + outputFilePath +"\0)");
// GCC preprocess the file.
var cmd = ["gcc", "-E", "-x", "c", "-P"].concat(flags, inputFilePath).join(" ");
var gcc = OS.popen(cmd, { charset:"UTF-8" });
var cmd = ["gcc", "-E", "-x", "c", "-P"].concat(flags, inputFilePath).join(" "),
gcc = OS.popen(cmd, { charset:"UTF-8" }),
contents = FILE.read("header.txt", { charset : "UTF-8" });
var contents = FILE.read("header.txt", { charset : "UTF-8" });
contents += gcc.stdout.read();
gcc.stdin.close();
gcc.stdout.close();
gcc.stderr.close();
if (FILE.extension(inputFilePath) === ".js" && compress)
contents = compressor(contents);
+4 -1
View File
@@ -25,11 +25,14 @@ task ("build", function()
if (majorVersion < 10 || minorVersion < 7)
{
colorPrint("XcodeCapp can only be built on Mac OS X 10.7+. You can download the binary here: https://www.dropbox.com/sh/gxdgm356gyb9tqc/rFNyl8hcVG", "red");
OS.exit(0);
}
}
p.stdin.close();
p.stdout.close();
p.stderr.close();
if (executableExists("xcodebuild"))
{
var args = "-sdk macosx -alltargets -configuration Release",
+14 -2
View File
@@ -119,8 +119,14 @@ ConverterConversionException = @"ConverterConversionException";
// Compile xib or nib to make sure we have a non-new format nib.
temporaryNibFilePath = FILE.join("/tmp", FILE.basename(aFilePath) + ".tmp.nib");
if (OS.popen(["/usr/bin/ibtool", aFilePath, "--compile", temporaryNibFilePath]).wait() === 1)
var p = OS.popen(["/usr/bin/ibtool", aFilePath, "--compile", temporaryNibFilePath]);
if (p.wait() === 1)
[CPException raise:ConverterConversionException reason:@"Could not compile file: " + aFilePath];
p.stdin.close();
p.stdout.close();
p.stderr.close();
}
else
{
@@ -130,9 +136,15 @@ ConverterConversionException = @"ConverterConversionException";
// Convert from binary plist to XML plist
var temporaryPlistFilePath = FILE.join("/tmp", FILE.basename(aFilePath) + ".tmp.plist");
if (OS.popen(["/usr/bin/plutil", "-convert", "xml1", temporaryNibFilePath, "-o", temporaryPlistFilePath]).wait() === 1)
var p = OS.popen(["/usr/bin/plutil", "-convert", "xml1", temporaryNibFilePath, "-o", temporaryPlistFilePath]);
if (p.wait() === 1)
[CPException raise:ConverterConversionException reason:@"Could not convert to xml plist for file: " + aFilePath];
p.stdin.close();
p.stdout.close();
p.stderr.close();
if (!FILE.isReadable(temporaryPlistFilePath))
[CPException raise:ConverterConversionException reason:@"Unable to convert nib file."];
-20
View File
@@ -28,27 +28,7 @@ var OS = require("os"),
function main(args)
{
checkUlimit();
var nib2cib = [[Nib2Cib alloc] initWithArgs:args];
[nib2cib run];
}
function checkUlimit()
{
var minUlimit = 1024,
p = OS.popen(["ulimit", "-n"]);
if (p.wait() === 0)
{
var limit = p.stdout.read().split("\n")[0];
if (Number(limit) < minUlimit)
{
stream.print("\0red(\0bold(WARNING:\0)\0) nib2cib may need to open more files than this terminal session currently allows (" + limit + "). Add the following line to your login configuration file (.bash_profile, .bashrc, etc.), start a new terminal session, then try again:\n");
stream.print("ulimit -n " + minUlimit);
OS.exit(1);
}
}
}
+4 -25
View File
@@ -385,6 +385,10 @@ global.setPackageMetadata = function(packagePath)
pkg["cappuccino-revision"] = sha;
}
p.stdin.close();
p.stdout.close();
p.stderr.close();
pkg["cappuccino-timestamp"] = new Date().getTime();
pkg["version"] = getCappuccinoVersion();
@@ -577,31 +581,6 @@ global.colorPrint = function(/* String */ message, /* String */ color)
stream.print(colorize(message, color));
};
var minUlimit = 1024;
global.checkUlimit = function()
{
var ulimitPath = executableExists("ulimit");
if (!ulimitPath)
return;
var p = OS.popen([ulimitPath, "-n"]);
if (p.wait() === 0)
{
var limit = p.stdout.read().split("\n")[0];
if (Number(limit) < minUlimit)
{
stream.print("\0red(\0bold(ERROR:\0)\0) Cappuccino may need to open more files than this terminal session currently allows (" + limit + "). Add the following line to your login configuration file (.bash_profile, .bashrc, etc.), start a new terminal session, then try again:\n");
stream.print("ulimit -n " + minUlimit);
OS.exit(1);
}
}
}
// built in tasks
task ("build");