Corrected memory and printing errors
This commit is contained in:
parent
982db3a2ad
commit
6125043513
2
Makefile
2
Makefile
|
@ -122,7 +122,7 @@ run-gdb: all
|
|||
-ex "set args -C debian/etc -M debian/var/models -U debian/var/users"
|
||||
|
||||
run-valgrind: all
|
||||
@valgrind --leak-check=full -s \
|
||||
@valgrind --leak-check=full --show-leak-kinds=all -s \
|
||||
bin/gem-graph-server -C debian/etc -M debian/var/models \
|
||||
-U debian/var/users
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
#define LOGMSG "[%s]"
|
||||
#define printLog(FORMAT, ...) printf("\e[0m" LOGMSG " " FORMAT "\e[0m", \
|
||||
__func__, ##__VA_ARGS__)
|
||||
#define printErr(FORMAT,...) sprintf(stderr, "\e[0m" LOGMSG " " FORMAT "\e[0m",\
|
||||
#define printErr(FORMAT,...) fprintf(stderr, "\e[0m" LOGMSG " " FORMAT "\e[0m",\
|
||||
__func__, ##__VA_ARGS__)
|
||||
#define LEN(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ static inline int TermGetch(bool nonBlocking)
|
|||
fcntl(0, F_SETFL, O_NONBLOCK);
|
||||
|
||||
if(tcgetattr(0, &old) < 0) {
|
||||
printLog("%sError getting terminal settings! (%s)\n",
|
||||
printErr("%sError getting terminal settings! (%s)\n",
|
||||
C_COLOR_RED,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
|
@ -84,7 +84,7 @@ static inline int TermGetch(bool nonBlocking)
|
|||
old.c_lflag &= ~ECHO; // set no echo mode
|
||||
|
||||
if(tcsetattr(0, TCSANOW, &old) < 0) {
|
||||
printLog("%sError setting terminal settings! (%s)\n",
|
||||
printErr("%sError setting terminal settings! (%s)\n",
|
||||
C_COLOR_RED,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
|
@ -96,7 +96,7 @@ static inline int TermGetch(bool nonBlocking)
|
|||
if(errno == EAGAIN)
|
||||
return 0;
|
||||
|
||||
printLog("%sError reading character! (%s)\n",
|
||||
printErr("%sError reading character! (%s)\n",
|
||||
C_COLOR_RED,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
|
@ -106,7 +106,7 @@ static inline int TermGetch(bool nonBlocking)
|
|||
old.c_lflag |= ECHO; // set echo mode
|
||||
|
||||
if(tcsetattr(0, TCSADRAIN, &old) < 0) {
|
||||
printLog("%sError resetting terminal settings! (%s)\n",
|
||||
printErr("%sError resetting terminal settings! (%s)\n",
|
||||
C_COLOR_RED,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
|
|
|
@ -444,7 +444,7 @@ int main(void)
|
|||
// Socket creation
|
||||
sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (sockfd == -1) {
|
||||
printLog("%sSocket creation failed! (%s)\n",
|
||||
printErr("%sSocket creation failed! (%s)\n",
|
||||
C_COLOR_RED,
|
||||
strerror(errno));
|
||||
return 1;
|
||||
|
@ -459,7 +459,7 @@ int main(void)
|
|||
|
||||
// Connect to the server
|
||||
if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) != 0) {
|
||||
printLog("%sConnection failed! (%s)\n",
|
||||
printErr("%sConnection failed! (%s)\n",
|
||||
C_COLOR_RED,
|
||||
strerror(errno));
|
||||
return 2;
|
||||
|
|
28
src/cmds.c
28
src/cmds.c
|
@ -34,7 +34,8 @@ char *CmdModel(char *buf, char **argv, Server_t *args)
|
|||
|
||||
// invalid use
|
||||
if (!argv[1]) {
|
||||
strcat(buf, "{create | delete | load | run | stop | list | info}\n");
|
||||
strcat(buf, "{create | delete | load | unload | run | stop | list |"
|
||||
"info}\n");
|
||||
goto CmdModelEnd;
|
||||
}
|
||||
|
||||
|
@ -100,6 +101,28 @@ char *CmdModel(char *buf, char **argv, Server_t *args)
|
|||
goto CmdModelEnd;
|
||||
}
|
||||
|
||||
else if (strcmp(argv[1], "unload") == 0) {
|
||||
if (!argv[2]) {
|
||||
goto unloadEnd;
|
||||
}
|
||||
|
||||
id = (int) strtol(argv[2] + 3, NULL, 10);
|
||||
|
||||
if (id == 0 || ModelUnload(id) < 0) {
|
||||
printErr("Failed to unload model id %d\n", id);
|
||||
sprintf(buf + strlen(buf), "Failed to unload model id %d\n", id);
|
||||
goto CmdModelEnd;
|
||||
}
|
||||
|
||||
sprintf(buf + strlen(buf), "Model id %d unloaded\n", id);
|
||||
goto CmdModelEnd;
|
||||
unloadEnd:
|
||||
// invalid use
|
||||
strcat(buf, "Unloads a model structure\n");
|
||||
strcat(buf, "Usage: model unload id=ID\n");
|
||||
goto CmdModelEnd;
|
||||
}
|
||||
|
||||
else if (strcmp(argv[1], "delete") == 0) {
|
||||
if (!argv[2]) {
|
||||
goto deleteEnd;
|
||||
|
@ -172,7 +195,8 @@ char *CmdModel(char *buf, char **argv, Server_t *args)
|
|||
}
|
||||
|
||||
// invalid use
|
||||
else strcat(buf, "{create | delete | load | run | stop | list | info}\n");
|
||||
else strcat(buf, "{create | delete | load | unload | run | stop | list |"
|
||||
"info}\n");
|
||||
|
||||
CmdModelEnd:
|
||||
return buf;
|
||||
|
|
|
@ -59,12 +59,12 @@ int main(int argc, char **argv)
|
|||
strcpy(parameters.modelDir, optarg);
|
||||
break;
|
||||
case 'U':
|
||||
printLog("User : %s\n", optarg);
|
||||
printLog("Users : %s\n", optarg);
|
||||
parameters.userDir = (char*) calloc(1, strlen(optarg) + 1);
|
||||
strcpy(parameters.userDir, optarg);
|
||||
break;
|
||||
case ':':
|
||||
printLog("Option missing argument : %c\n", optopt);
|
||||
printErr("Option missing argument : %c\n", optopt);
|
||||
if (parameters.configDir)
|
||||
free(parameters.configDir);
|
||||
|
||||
|
@ -77,7 +77,7 @@ int main(int argc, char **argv)
|
|||
return ENOSYS;
|
||||
break;
|
||||
case '?':
|
||||
printLog("Unknown option : %c\n", optopt);
|
||||
printErr("Unknown option : %c\n", optopt);
|
||||
if (parameters.configDir)
|
||||
free(parameters.configDir);
|
||||
|
||||
|
@ -93,7 +93,7 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
if (!parameters.configDir | !parameters.modelDir | !parameters.userDir) {
|
||||
printLog("Missing arguments\n");
|
||||
printErr("Missing arguments\n");
|
||||
|
||||
if (parameters.configDir)
|
||||
free(parameters.configDir);
|
||||
|
|
15
src/model.c
15
src/model.c
|
@ -64,6 +64,7 @@ int ModelLoad(int id)
|
|||
|
||||
printLog("Loading model id %d (/%d models)...\n", id, knownModelSize);
|
||||
|
||||
|
||||
// Creating structure for the Scheduler
|
||||
knownModel[id-1]->scheduler = (Scheduler_t*) calloc(1, sizeof(Scheduler_t));
|
||||
|
||||
|
@ -79,12 +80,20 @@ int ModelLoad(int id)
|
|||
int ModelUnload(int id)
|
||||
{
|
||||
// Destroy scheduler
|
||||
if (id > loadedModelSize)
|
||||
return -1;
|
||||
|
||||
if (loadedModel[id-1]->scheduler) {
|
||||
SchedDestroy(loadedModel[id-1]->scheduler);
|
||||
loadedModel[id-1]->scheduler = NULL;
|
||||
}
|
||||
|
||||
// Prevent fragmentation by moving data in the newly freed slot
|
||||
if (id-1 < loadedModelSize) {
|
||||
memmove(&loadedModel[id-1],
|
||||
&loadedModel[id-1] + sizeof(Model_t*),
|
||||
loadedModelSize - (id-1));
|
||||
}
|
||||
|
||||
// Decrement loaded model index
|
||||
loadedModelSize--;
|
||||
|
@ -243,7 +252,7 @@ void ModelSystemInit(Parameters_t *parameters)
|
|||
|
||||
// Open model directory
|
||||
if ((modelDir = opendir(parameters->modelDir)) <= 0) {
|
||||
printLog("Could not open %s\n", parameters->modelDir);
|
||||
printErr("Could not open %s\n", parameters->modelDir);
|
||||
ModelSystemDestroy();
|
||||
kill(getpid(), SIGTERM);
|
||||
return;
|
||||
|
@ -275,7 +284,7 @@ void ModelSystemInit(Parameters_t *parameters)
|
|||
|
||||
// Ask to parse the new model
|
||||
if (ParseModelIdentityXML(newModel, parameters) != 0) {
|
||||
printLog("Deleting invalid model %s from known list\n",
|
||||
printErr("Deleting invalid model %s from known list\n",
|
||||
newModel->name);
|
||||
ModelDelete(newModel->id);
|
||||
continue;
|
||||
|
@ -283,7 +292,7 @@ void ModelSystemInit(Parameters_t *parameters)
|
|||
|
||||
// Check model is valid and/or parsed
|
||||
if (newModel->validated == false) {
|
||||
printLog("Deleting invalid model %s from known list\n",
|
||||
printErr("Deleting invalid model %s from known list\n",
|
||||
newModel->name);
|
||||
ModelDelete(newModel->id);
|
||||
continue;
|
||||
|
|
|
@ -336,7 +336,7 @@ int ParseModelIdentityXML(Model_t *model, Parameters_t *params)
|
|||
xmlDocument = xmlParseFile(model->filename);
|
||||
|
||||
if (xmlDocument == NULL) {
|
||||
printLog("Can't parse model file at '%s'.\n", model->filename);
|
||||
printErr("Can't parse model file at '%s'.\n", model->filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -344,7 +344,7 @@ int ParseModelIdentityXML(Model_t *model, Parameters_t *params)
|
|||
currentNode = xmlDocGetRootElement(xmlDocument);
|
||||
|
||||
if (currentNode == NULL) {
|
||||
printLog("Invalid model file at '%s', document empty !\n",
|
||||
printErr("Invalid model file at '%s', document empty !\n",
|
||||
model->filename);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
free(schemPath);
|
||||
|
@ -353,7 +353,7 @@ int ParseModelIdentityXML(Model_t *model, Parameters_t *params)
|
|||
|
||||
// Checking that XML file is actually a model
|
||||
if (xmlStrcmp(currentNode->name, (const xmlChar *) "gem-graph-model")) {
|
||||
printLog("Invalid model file at '%s', "
|
||||
printErr("Invalid model file at '%s', "
|
||||
"root node is not <gem-graph-model> !\n",
|
||||
model->filename);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
|
@ -365,12 +365,12 @@ int ParseModelIdentityXML(Model_t *model, Parameters_t *params)
|
|||
version = xmlGetProp(currentNode, (xmlChar*)"version");
|
||||
// Check version is present
|
||||
if (!version) {
|
||||
printLog("Missing version for model %s \n", model->name);
|
||||
printErr("Missing version for model %s \n", model->name);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
free(schemPath);
|
||||
return -4;
|
||||
} else if (strlen((char*)version) > MODEL_STRING_SIZE) {
|
||||
printLog("Invalid version number for model %s \n", model->name);
|
||||
printErr("Invalid version number for model %s \n", model->name);
|
||||
free(version);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
free(schemPath);
|
||||
|
@ -384,7 +384,7 @@ int ParseModelIdentityXML(Model_t *model, Parameters_t *params)
|
|||
// Loading schema file
|
||||
schemFile = xmlSchemaNewParserCtxt(schemPath);
|
||||
if (schemFile == NULL) {
|
||||
printLog("Invalid gem-graph version %s in model %s: no schema present",
|
||||
printErr("Invalid gem-graph version %s in model %s: no schema present",
|
||||
version, model->name);
|
||||
free(version);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
|
@ -394,9 +394,9 @@ int ParseModelIdentityXML(Model_t *model, Parameters_t *params)
|
|||
|
||||
// Loading schema file content
|
||||
schemPtr = xmlSchemaParse(schemFile);
|
||||
xmlSchemaFreeParserCtxt(schemFile);
|
||||
if (schemPtr == NULL) {
|
||||
printLog("Invalid schema file, version %s\n", version);
|
||||
printErr("Invalid schema file, version %s\n", version);
|
||||
xmlSchemaFreeParserCtxt(schemFile);
|
||||
free(version);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
free(schemPath);
|
||||
|
@ -406,11 +406,12 @@ int ParseModelIdentityXML(Model_t *model, Parameters_t *params)
|
|||
// Creating validating context
|
||||
schemValidator = xmlSchemaNewValidCtxt(schemPtr);
|
||||
if (schemValidator == NULL) {
|
||||
xmlSchemaFreeParserCtxt(schemFile);
|
||||
xmlSchemaFree(schemPtr);
|
||||
free(version);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
free(schemPath);
|
||||
printLog("An error occured preparing schema file, version %s\n", version);
|
||||
printErr("An error occured preparing schema file, version %s\n", version);
|
||||
return -7;
|
||||
}
|
||||
|
||||
|
@ -441,6 +442,7 @@ int ParseModelIdentityXML(Model_t *model, Parameters_t *params)
|
|||
currentNode = currentNode->next;
|
||||
}
|
||||
|
||||
xmlSchemaFreeParserCtxt(schemFile);
|
||||
xmlSchemaFreeValidCtxt(schemValidator);
|
||||
xmlSchemaFree(schemPtr);
|
||||
free(version);
|
||||
|
@ -514,21 +516,21 @@ int ParseModelXML(Model_t *model)
|
|||
xmlDocument = xmlParseFile(model->filename);
|
||||
|
||||
if (xmlDocument == NULL) {
|
||||
printLog("Can't parse model file at '%s'.\n", model->filename);
|
||||
printErr("Can't parse model file at '%s'.\n", model->filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
currentNode = xmlDocGetRootElement(xmlDocument);
|
||||
|
||||
if (currentNode == NULL) {
|
||||
printLog("Invalid model file at '%s', document empty !\n",
|
||||
printErr("Invalid model file at '%s', document empty !\n",
|
||||
model->filename);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (xmlStrcmp(currentNode->name, (const xmlChar *) "gem-graph-model")) {
|
||||
printLog("Invalid model file at '%s', "
|
||||
printErr("Invalid model file at '%s', "
|
||||
"root node is not <gem-graph-model> !\n",
|
||||
model->filename);
|
||||
xmlFreeDoc(xmlDocument);
|
||||
|
|
|
@ -105,8 +105,8 @@ static void *schedulerMain(void *scheduler)
|
|||
centersList = (Center_t*) calloc(1, sizeof(Center_t));
|
||||
|
||||
// Initiate the arrowArray lock
|
||||
if (err = ArrowsInitLock(args->arrowArray), err != 0) { // TODO destroy this
|
||||
printLog("Impossible to create the arrow array lock (error %d)\n", err);
|
||||
if (err = ArrowsInitLock(args->arrowArray), err != 0) {
|
||||
printErr("Impossible to create the arrow array lock (error %d)\n", err);
|
||||
return NULL;
|
||||
}
|
||||
//
|
||||
|
@ -215,6 +215,9 @@ static void *schedulerMain(void *scheduler)
|
|||
|
||||
printLog("Scheduler #%lu offline\n", args->id);
|
||||
|
||||
|
||||
ArrowsDestroyLock(args->arrowArray);
|
||||
|
||||
free(workerArray);
|
||||
workerArray = NULL;
|
||||
free(centersList);
|
||||
|
|
18
src/server.c
18
src/server.c
|
@ -75,7 +75,7 @@ void *serverCommunicationInstance(void *server)
|
|||
// Read the message from client and copy it in buffer
|
||||
bytesReceived = recv(args->sockfd, receiveBuff, RECEIVE_BUFFER_SIZE, 0);
|
||||
if (bytesReceived == -1) {
|
||||
printLog("Could not receive data! (%s)\n", strerror(errno));
|
||||
printErr("Could not receive data! (%s)\n", strerror(errno));
|
||||
break;
|
||||
};
|
||||
|
||||
|
@ -148,7 +148,7 @@ static void *serverMain(void *server)
|
|||
// Create socket
|
||||
args->sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (args->sockfd == -1) {
|
||||
printLog("Socket creation failed! (%s)\n", strerror(errno));
|
||||
printErr("Socket creation failed! (%s)\n", strerror(errno));
|
||||
args->returnValue = 1;
|
||||
goto serverExiting;
|
||||
}
|
||||
|
@ -156,14 +156,14 @@ static void *serverMain(void *server)
|
|||
// Get socket flags
|
||||
flags = fcntl(args->sockfd, F_GETFL);
|
||||
if (flags == -1) {
|
||||
printLog("Socket parameters getting failed! (%s)\n", strerror(errno));
|
||||
printErr("Socket parameters getting failed! (%s)\n", strerror(errno));
|
||||
args->returnValue = 1;
|
||||
goto serverExiting;
|
||||
}
|
||||
|
||||
// Change socket flags to non-blocking
|
||||
if (fcntl(args->sockfd, F_SETFL, flags | O_NONBLOCK) < 0) {
|
||||
printLog("Socket non-blocking setting failed! (%s)\n", strerror(errno));
|
||||
printErr("Socket non-blocking setting failed! (%s)\n", strerror(errno));
|
||||
args->returnValue = 1;
|
||||
goto serverExiting;
|
||||
}
|
||||
|
@ -179,14 +179,14 @@ static void *serverMain(void *server)
|
|||
// Binding newly created socket
|
||||
if ((bind(args->sockfd, (struct sockaddr*)&servaddr,
|
||||
sizeof(servaddr))) == -1) {
|
||||
printLog("Socket bind failed! (%s)\n", strerror(errno));
|
||||
printErr("Socket bind failed! (%s)\n", strerror(errno));
|
||||
args->returnValue = 1;
|
||||
goto serverExiting;
|
||||
}
|
||||
|
||||
// Now server is ready to listen and verification
|
||||
if (listen(args->sockfd, MAX_CONNECTION) == -1) {
|
||||
printLog("Socket listening failed! (%s)\n", strerror(errno));
|
||||
printErr("Socket listening failed! (%s)\n", strerror(errno));
|
||||
args->returnValue = 1;
|
||||
goto serverExiting;
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ static void *serverMain(void *server)
|
|||
// Get server socket address structure
|
||||
if (getsockname(args->sockfd, (struct sockaddr *)&servaddr, &socklen)
|
||||
== -1) {
|
||||
printLog("Could not get socket structure! (%s)\n", strerror(errno));
|
||||
printErr("Could not get socket structure! (%s)\n", strerror(errno));
|
||||
args->returnValue = 1;
|
||||
goto serverExiting;
|
||||
}
|
||||
|
@ -212,7 +212,7 @@ static void *serverMain(void *server)
|
|||
if (connfd < 0) {
|
||||
// If error is not due to lack of clients connecting, this is error
|
||||
if (errno != EWOULDBLOCK && errno != EAGAIN) {
|
||||
printLog("Server acccept failed! (%s)\n", strerror(errno));
|
||||
printErr("Server acccept failed! (%s)\n", strerror(errno));
|
||||
goto serverExiting;
|
||||
}
|
||||
sleep(1);
|
||||
|
@ -237,7 +237,7 @@ static void *serverMain(void *server)
|
|||
serverCommunicationInstance,
|
||||
(void*)&serverSlots[serverSlotIndex]);
|
||||
if(threadStatus != 0) {
|
||||
printLog("Error from pthread: %d (%s)\n",
|
||||
printErr("Error from pthread: %d (%s)\n",
|
||||
threadStatus, strerror(errno));
|
||||
args->returnValue = 1;
|
||||
goto serverExiting;
|
||||
|
|
Loading…
Reference in New Issue