Skip to content

Commit

Permalink
Adding additional parameters, looking up the default image in the bundle
Browse files Browse the repository at this point in the history
  • Loading branch information
tesonep committed Mar 22, 2022
1 parent e38b860 commit 4c2e02e
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 17 deletions.
9 changes: 9 additions & 0 deletions include/pharovm/parameters/parameters.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ typedef struct VMParameters_
/// Is this an interactive session?
bool isInteractiveSession;

/// Does the VM run in a worker?
bool isWorker;

//The number of smalltalk frames to print in a process dump, (0 to print all).
int maxStackFramesToPrint;

Expand Down Expand Up @@ -144,6 +147,12 @@ EXPORT(VMErrorCode) vm_parameters_ensure_interactive_image_parameter(VMParameter
*/
EXPORT(VMErrorCode) vm_parameters_destroy(VMParameters *parameters);

/**
* Initialize the values of an instance of VMParameters
*/

EXPORT(VMErrorCode) vm_parameters_init(VMParameters *parameters);

/**
* Prints the command line parameter usage string to a file.
*/
Expand Down
15 changes: 4 additions & 11 deletions src/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ vm_main_with_parameters(VMParameters *parameters)
LOG_SIZEOF(double);

#ifdef PHARO_VM_IN_WORKER_THREAD
vmRunOnWorkerThread = vm_parameter_vector_has_element(&parameters->vmParameters, "--worker");
vmRunOnWorkerThread = parameters->isWorker;

return vmRunOnWorkerThread
? runOnWorkerThread(parameters)
Expand All @@ -158,19 +158,12 @@ EXPORT(int)
vm_main(int argc, const char** argv, const char** env)
{
VMParameters parameters;
parameters.vmParameters.count = 0;
parameters.vmParameters.parameters = NULL;
parameters.imageParameters.count = 0;
parameters.imageParameters.parameters = NULL;

vm_parameters_init(&parameters);

parameters.environmentVector = env;
parameters.processArgc = argc;
parameters.processArgv = argv;
parameters.environmentVector = env;
parameters.maxStackFramesToPrint = 0;
parameters.maxCodeSize = 0;
parameters.maxOldSpaceSize = 0;
parameters.edenSize = 0;
parameters.imageFileName = NULL;

// Did we succeed on parsing the parameters?
VMErrorCode error = vm_parameters_parse(argc, argv, &parameters);
Expand Down
33 changes: 31 additions & 2 deletions src/parameters/parameters.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,13 @@ static VMErrorCode processMaxFramesToPrintOption(const char *argument, VMParamet
static VMErrorCode processMaxOldSpaceSizeOption(const char *argument, VMParameters * params);
static VMErrorCode processMaxCodeSpaceSizeOption(const char *argument, VMParameters * params);
static VMErrorCode processEdenSizeOption(const char *argument, VMParameters * params);
static VMErrorCode processWorkerOption(const char *argument, VMParameters * params);

static const VMParameterSpec vm_parameters_spec[] =
{
{.name = "headless", .hasArgument = false, .function = NULL},
#ifdef PHARO_VM_IN_WORKER_THREAD
{.name = "worker", .hasArgument = false, .function = NULL},
{.name = "worker", .hasArgument = false, .function = processWorkerOption},
#endif
{.name = "interactive", .hasArgument = false, .function = NULL}, // For pharo-ui scripts.
{.name = "vm-display-null", .hasArgument = false, .function = NULL}, // For Smalltalk CI.
Expand Down Expand Up @@ -349,7 +350,6 @@ VMErrorCode
vm_parameters_ensure_interactive_image_parameter(VMParameters* parameters)
{
const char* interactiveParameter = "--interactive";
const char* headlessParameter = "--headless";
VMErrorCode error;

if (parameters->isInteractiveSession)
Expand Down Expand Up @@ -519,6 +519,13 @@ processEdenSizeOption(const char* originalArgument, VMParameters * params)
return VM_SUCCESS;
}

static VMErrorCode
processWorkerOption(const char* argument, VMParameters * params)
{
params->isWorker = true;
return VM_SUCCESS;
}

static VMErrorCode
processHelpOption(const char* argument, VMParameters * params)
{
Expand Down Expand Up @@ -664,3 +671,25 @@ vm_parameters_parse(int argc, const char** argv, VMParameters* parameters)

return VM_SUCCESS;
}

EXPORT(VMErrorCode)
vm_parameters_init(VMParameters *parameters){

parameters->vmParameters.count = 0;
parameters->vmParameters.parameters = NULL;
parameters->imageParameters.count = 0;
parameters->imageParameters.parameters = NULL;

parameters->maxStackFramesToPrint = 0;
parameters->maxCodeSize = 0;
parameters->maxOldSpaceSize = 0;
parameters->edenSize = 0;
parameters->imageFileName = NULL;
parameters->isDefaultImage = FALSE;
parameters->defaultImageFound = FALSE;
parameters->isInteractiveSession = FALSE;

parameters->isWorker = FALSE;

return VM_SUCCESS;
}
83 changes: 79 additions & 4 deletions src/parameters/parameters.m
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,109 @@
#include "pharovm/debug.h"
#include "pharovm/pathUtilities.h"

#include <sys/stat.h>

static bool
fileExists(char *filename) {

struct stat buffer;
return (stat (filename, &buffer) == 0);
}

EXPORT(void) fillParametersFromPList(VMParameters* parameters){

char fileNameBuffer[FILENAME_MAX + 1];
char mainBundlePath[FILENAME_MAX + 1];
CFBundleRef mainBundle;

CFNumberRef logLevelRef;
int32_t logLevelValue;
CFStringRef imageFileName;
CFBooleanRef headlessRef;
CFBooleanRef workerRef;
CFNumberRef maxFramesToLogRef;
CFNumberRef maxOldSpaceSizeRef;
CFNumberRef edenSizeRef;
CFNumberRef codeSizeRef;



mainBundle = CFBundleGetMainBundle();

CFStringGetCString((CFStringRef)[[NSBundle mainBundle] bundlePath], mainBundlePath, FILENAME_MAX + 1, kCFStringEncodingUTF8);

logLevelRef = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoLogLevel"));
imageFileName = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoImageFile"));

if(logLevelRef != NULL){
CFNumberGetValue(logLevelRef, kCFNumberSInt32Type, &logLevelValue);
logLevel(logLevelValue);
}

imageFileName = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoImageFile"));

if(imageFileName != NULL){
CFStringGetCString(imageFileName, fileNameBuffer, FILENAME_MAX + 1, kCFStringEncodingUTF8);
parameters->imageFileName = strdup(fileNameBuffer);
parameters->isDefaultImage = false;
parameters->defaultImageFound = false;
parameters->isInteractiveSession = true;
parameters->defaultImageFound = true;

//Check if the path passed exists, if not exists try with a location inside the main bundle.

if(fileExists(parameters->imageFileName)){
parameters->defaultImageFound = true;
}else{
snprintf(fileNameBuffer, FILENAME_MAX + 1, "%s/Contents/Resources/%s", mainBundlePath, parameters->imageFileName);
if(fileExists(fileNameBuffer)){
free(parameters->imageFileName);
parameters->imageFileName = strdup(fileNameBuffer);
parameters->defaultImageFound = true;
}else{
snprintf(fileNameBuffer, FILENAME_MAX + 1, "%s/Contents/MacOS/Resources/%s", mainBundlePath, parameters->imageFileName);
if(fileExists(fileNameBuffer)){
free(parameters->imageFileName);
parameters->imageFileName = strdup(fileNameBuffer);
parameters->defaultImageFound = true;
}
}
}

logDebug("Using Image File from PList: %s", fileNameBuffer);
logDebug("Using Image File from PList: %s", parameters->imageFileName);
}

headlessRef = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoHeadless"));
if(headlessRef != NULL){
parameters->isInteractiveSession = !CFBooleanGetValue(headlessRef);
}

}
workerRef = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoWorker"));
if(workerRef != NULL){
parameters->isWorker = !CFBooleanGetValue(workerRef);
}


maxFramesToLogRef = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoMaxFramesToLog"));

if(maxFramesToLogRef != NULL){
CFNumberGetValue(maxFramesToLogRef, kCFNumberSInt32Type, &parameters->maxStackFramesToPrint);
}

maxOldSpaceSizeRef = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoMaxOldSpaceSize"));

if(maxOldSpaceSizeRef != NULL){
CFNumberGetValue(maxOldSpaceSizeRef, kCFNumberSInt64Type, &parameters->maxOldSpaceSize);
}

edenSizeRef = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoEdenSize"));

if(edenSizeRef != NULL){
CFNumberGetValue(edenSizeRef, kCFNumberSInt64Type, &parameters->edenSize);
}

codeSizeRef = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("PharoCodeSize"));

if(codeSizeRef != NULL){
CFNumberGetValue(codeSizeRef, kCFNumberSInt64Type, &parameters->maxCodeSize);
}

}

0 comments on commit 4c2e02e

Please sign in to comment.