Better CLI

This commit is contained in:
Adrien Bourmault 2021-06-23 17:07:43 +02:00
parent 29e43c2f18
commit 4440075d7f
No known key found for this signature in database
GPG Key ID: 6EB408FE0ACEC664
10 changed files with 105 additions and 16 deletions

View File

@ -127,7 +127,7 @@ struct {
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
// //
// Server // Supervisor
// //
struct { struct {
pthread_t *id; pthread_t *id;

View File

@ -23,15 +23,19 @@
#include "../include/base.h" #include "../include/base.h"
#endif #endif
void *launchScheduler(void*); char *CmdHelp(char**, Server_t*);
char *CmdModel(char**, Server_t*);
char *CmdShutdown(char**, Server_t*);
struct { struct {
const char *name; const char *name;
void* (*execute)(void*); char* (*execute)(char**, Server_t*);
const char *help; const char *help;
} typedef Command_t; } typedef Command_t;
Command_t cmdList[] = Command_t cmdList[] =
{ {
{"launch scheduler", launchScheduler, "Launches a scheduler instance"}, {"help", CmdHelp, "Help command"},
{"model", CmdModel, "Model command"},
{"shutdown", CmdShutdown, "Shutdown command"},
}; };

View File

@ -32,3 +32,9 @@ int ModelLoad(int id);
void ModelCreate(Model_t **newModel); void ModelCreate(Model_t **newModel);
int ModelLoad(int id); int ModelLoad(int id);
void ModelRun(int id);
void ModelStop(int id);
void ModelShutdown(void);

View File

@ -33,7 +33,7 @@ void ServerInit(Server_t *server);
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
static inline void ServerDestroy(Server_t *server) static inline void ServerDestroy(Server_t *server)
{ {
; free(server->id);
} }
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //

View File

@ -102,8 +102,7 @@ static inline int receiveSocket(int effectiveSocket, char *serverAnswer,
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int socketDescriptor, nextSocketDescriptor, readSize; int socketDescriptor;
struct sockaddr_in server;
char clientMessage[255] = {0}; char clientMessage[255] = {0};
char serverReply[255] = {0}; char serverReply[255] = {0};
@ -142,7 +141,7 @@ int main(int argc, char **argv)
sendSocket(socketDescriptor, clientMessage, strlen(clientMessage)); sendSocket(socketDescriptor, clientMessage, strlen(clientMessage));
//Received the data from the server //Received the data from the server
readSize = receiveSocket(socketDescriptor, serverReply, 200); receiveSocket(socketDescriptor, serverReply, 200);
printf("%s\n", serverReply); printf("%s\n", serverReply);
memset(serverReply, 0, 255); memset(serverReply, 0, 255);

View File

@ -23,9 +23,58 @@
#include "../include/scheduler.h" #include "../include/scheduler.h"
#include "../include/model.h" #include "../include/model.h"
#define LINE_LENGTH 80
#define LINE_NUMBER 15
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
void *CmdModel(void *args) char *CmdHelp(char **argv, Server_t *args)
{ {
return "OK\n";
}
char *CmdModel(char **argv, Server_t *args)
{
char *buf;
buf = (char *) calloc(LINE_NUMBER, LINE_LENGTH * sizeof(char));
if (!argv[1]) {
strcat(buf, "{create | delete | load | run}\n");
goto CmdModelEnd;
}
if (strcmp(argv[1], "create") == 0) {
strcat(buf, "You asked for us to create a model\n");
}
if (strcmp(argv[1], "delete") == 0) {
strcat(buf, "You asked for us to delete a model\n");
}
if (strcmp(argv[1], "load") == 0) {
strcat(buf, "You asked for us to load a model\n");
}
if (strcmp(argv[1], "run") == 0) {
strcat(buf, "You asked for us to run a model\n");
}
CmdModelEnd:
return buf;
}
char *CmdShutdown(char **argv, Server_t *args)
{
char *buf;
buf = (char *) calloc(LINE_NUMBER, LINE_LENGTH * sizeof(char));
ModelShutdown();
strcat(buf, "All model shutted down\n");
args->pleaseStop = true;
strcat(buf, "Server stopping\n");
CmdShutdownEnd:
return buf;
} }

View File

@ -21,6 +21,7 @@
#include "../include/base.h" #include "../include/base.h"
#include "../include/server.h" #include "../include/server.h"
#include "../include/model.h"
int main(int argc, char **argv) int main(int argc, char **argv)
@ -31,19 +32,25 @@ int main(int argc, char **argv)
// Go! // Go!
printLog("Starting gem-graph-server...\n"); printLog("Starting gem-graph-server...\n");
// random generator // Initializing random generator
t = time(&t); t = time(&t);
srand((unsigned) t); srand((unsigned) t);
server0 = (Server_t*) calloc(1, sizeof(Server_t)); server0 = (Server_t*) calloc(1, sizeof(Server_t));
// Initializing model system
ModelSystemInit();
// Launching server // Launching server
ServerInit(server0); ServerInit(server0);
// Waiting for termination
ServerWait(server0); ServerWait(server0);
// Exiting // Exiting
ServerDestroy(server0); ServerDestroy(server0);
ModelSystemDestroy();
free(server0);
return 0; return 0;
} }

View File

@ -110,6 +110,7 @@ void ModelStop(int id)
{ {
// Creating structure for the Scheduler // Creating structure for the Scheduler
knownModel[id]->scheduler->pleaseStop = true; knownModel[id]->scheduler->pleaseStop = true;
printLog("Model %d stopped!\n", id);
} }
void ModelDelete(Model_t *newModel) void ModelDelete(Model_t *newModel)
@ -117,6 +118,13 @@ void ModelDelete(Model_t *newModel)
return; return;
} }
void ModelShutdown(void)
{
for (int i = 0; i < loadedModelIndex; i++) {
ModelStop(i);
}
}
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
static void ModelPrepareSpace(Space_t *globalDrawingSpace, Model_t *model) static void ModelPrepareSpace(Space_t *globalDrawingSpace, Model_t *model)

View File

@ -90,7 +90,7 @@ static void *schedulerMain(void *scheduler)
args = (Scheduler_t*) scheduler; args = (Scheduler_t*) scheduler;
printLog("Scheduler #%lu online\n", *args->id); printLog("Scheduler #%lu online\n", *args->id);
if (!args->nmaxThread) { // nmaxthread = 0 => no minimum if (!args->nMaxThread) { // nmaxthread = 0 => no minimum
ncpu = get_nprocs(); // allocating all the cpus available ncpu = get_nprocs(); // allocating all the cpus available
} else { // n thread = min(cpu, nmaxthread) } else { // n thread = min(cpu, nmaxthread)
ncpu = MIN(get_nprocs(), args->nMaxThread); ncpu = MIN(get_nprocs(), args->nMaxThread);

View File

@ -79,6 +79,9 @@ static void *serverMain(void *server)
struct sockaddr_in client; struct sockaddr_in client;
char clientRequest[255]= {0}; char clientRequest[255]= {0};
char serverAnswer[255] = {0}; char serverAnswer[255] = {0};
char **argv = NULL;
char *commandReturn;
int tokenIndex;
// Get args // Get args
args = (Server_t*) server; args = (Server_t*) server;
@ -131,10 +134,22 @@ static void *serverMain(void *server)
printLog("Client request : %s\n",clientRequest); printLog("Client request : %s\n",clientRequest);
for (int i = 0; i < LEN(cmdList); i++) { // TODO extract first command name // get args in an array
if (strcmp(cmdList[i].name, clientRequest) == 0) { tokenIndex = 0;
cmdList[i].execute(NULL); argv = (char**) realloc(argv, 1 * sizeof(char*));
strcpy(serverAnswer,"OK\0"); argv[0] = strtok(clientRequest, " ");
while (argv[tokenIndex]) {
tokenIndex++;
argv = (char**) realloc(argv, (tokenIndex+1) * sizeof(char*));
argv[tokenIndex] = strtok(NULL, " ");
}
// test first arg to find command in cmdList
for (int i = 0; i < LEN(cmdList); i++) {
if (strcmp(cmdList[i].name, argv[0]) == 0) {
commandReturn = cmdList[i].execute(argv, args);
strcpy(serverAnswer, commandReturn);
free(commandReturn);
} }
} }
@ -147,6 +162,7 @@ static void *serverMain(void *server)
close(effectiveSocket); close(effectiveSocket);
} }
free(argv);
printLog("Server #%lu offline\n", *args->id); printLog("Server #%lu offline\n", *args->id);
return NULL; return NULL;