From a7729514e277aabe9422a2626541f889ad1af08b Mon Sep 17 00:00:00 2001 From: mquinson Date: Tue, 6 Apr 2004 22:07:00 +0000 Subject: [PATCH 1/1] Skeleton of virtualization functions git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@69 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/gras/Virtu/rl_process.c | 49 +++++++++++ src/gras/Virtu/rl_time.c | 29 +++++++ src/gras/Virtu/sg_process.c | 134 +++++++++++++++++++++++++++++++ src/gras/Virtu/sg_time.c | 19 +++++ src/gras/Virtu/virtu_interface.h | 40 +++++++++ src/gras/Virtu/virtu_rl.h | 16 ++++ src/gras/Virtu/virtu_sg.h | 31 +++++++ 7 files changed, 318 insertions(+) create mode 100644 src/gras/Virtu/rl_process.c create mode 100644 src/gras/Virtu/rl_time.c create mode 100644 src/gras/Virtu/sg_process.c create mode 100644 src/gras/Virtu/sg_time.c create mode 100644 src/gras/Virtu/virtu_interface.h create mode 100644 src/gras/Virtu/virtu_rl.h create mode 100644 src/gras/Virtu/virtu_sg.h diff --git a/src/gras/Virtu/rl_process.c b/src/gras/Virtu/rl_process.c new file mode 100644 index 0000000000..10066a6957 --- /dev/null +++ b/src/gras/Virtu/rl_process.c @@ -0,0 +1,49 @@ +/* $Id$ */ + +/* process_rl - GRAS process handling on real life */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2003,2004 da GRAS posse. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "Virtu/virtu_rl.h" + +GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(process,GRAS); + +/* globals */ +static gras_process_data_t *_gras_process_data; + +gras_error_t gras_process_init() { + // gras_error_t errcode; + + if (!(_gras_process_data=(gras_process_data_t *)malloc(sizeof(gras_process_data_t)))) + RAISE_MALLOC; + + WARNING0("Implement message queue"); + /* + TRY(gras_dynar_new( &(_gras_process_data->msg_queue) )); + TRY(gras_dynar_new( &(_gras_process_data->cbl_list) )); + */ + + _gras_process_data->userdata = NULL; + return no_error; +} +gras_error_t gras_process_exit() { + WARNING0("FIXME: not implemented (=> leaking on exit :)"); + return no_error; +} + +/* ************************************************************************** + * Process data + * **************************************************************************/ + +void *gras_userdata_get(void) { + return _gras_process_data->userdata; +} + +void *gras_userdata_set(void *ud) { + _gras_process_data->userdata = ud; + return ud; +} diff --git a/src/gras/Virtu/rl_time.c b/src/gras/Virtu/rl_time.c new file mode 100644 index 0000000000..c65d26157c --- /dev/null +++ b/src/gras/Virtu/rl_time.c @@ -0,0 +1,29 @@ +/* $Id$ */ + +/* time - time related syscal wrappers */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2003,2004 da GRAS posse. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "gras_private.h" +#include /* gettimeofday() */ + +double gras_time() { + struct timeval tv; + + gettimeofday(&tv, NULL); + + return (double)(tv.tv_sec * 1000000 + tv.tv_usec); +} + +void gras_sleep(unsigned long sec,unsigned long usec) { + sleep(sec); + if (usec/1000000) sleep(usec/1000000); + +#ifdef HAVE_USLEEP + (void)usleep(usec % 1000000); +#endif /* ! HAVE_USLEEP */ +} diff --git a/src/gras/Virtu/sg_process.c b/src/gras/Virtu/sg_process.c new file mode 100644 index 0000000000..243093bf3b --- /dev/null +++ b/src/gras/Virtu/sg_process.c @@ -0,0 +1,134 @@ +/* $Id$ */ + +/* process_sg - GRAS process handling on simulator */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2003,2004 da GRAS posse. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "Virtu/virtu_sg.h" + +GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(process,GRAS); + +gras_error_t +gras_process_init() { + gras_hostdata_t *hd=(gras_hostdata_t *)MSG_host_get_data(MSG_host_self()); + gras_process_data_t *pd; + int i; + + if (!(pd=(gras_process_data_t *)malloc(sizeof(gras_process_data_t)))) + RAISE_MALLOC; + + WARNING0("Implement msg queue"); + /* + pd->grasMsgQueueLen=0; + pd->grasMsgQueue = NULL; + + pd->grasCblListLen = 0; + pd->grasCblList = NULL; + */ + + if (MSG_process_set_data(MSG_process_self(),(void*)pd) != MSG_OK) { + return unknown_error; + } + + if (!hd) { + if (!(hd=(gras_hostdata_t *)malloc(sizeof(gras_hostdata_t)))) + RAISE_MALLOC; + + hd->portLen = 0; + hd->port=NULL; + hd->port2chan=NULL; + for (i=0; iproc[i]=0; + } + + if (MSG_host_set_data(MSG_host_self(),(void*)hd) != MSG_OK) { + return unknown_error; + } + } + + /* take a free channel for this process */ + for (i=0; iproc[i]; i++); + if (i == GRAS_MAX_CHANNEL) + RAISE2(system_error, + "GRAS: Can't add a new process on %s, because all channel are already in use. Please increase MAX CHANNEL (which is %d for now) and recompile GRAS\n.", + MSG_host_get_name(MSG_host_self()),GRAS_MAX_CHANNEL); + + pd->chan = i; + hd->proc[ i ] = MSG_process_self_PID(); + + /* take a free RAW channel for this process */ + for (i=0; iproc[i]; i++); + if (i == GRAS_MAX_CHANNEL) { + RAISE2(system_error, + "GRAS: Can't add a new process on %s, because all channel are already in use. Please increase MAX CHANNEL (which is %d for now) and recompile GRAS\n.", + MSG_host_get_name(MSG_host_self()),GRAS_MAX_CHANNEL); + } + pd->rawChan = i; + hd->proc[ i ] = MSG_process_self_PID(); + + VERB2("Creating process '%s' (%d)", + MSG_process_get_name(MSG_process_self()), + MSG_process_self_PID()); + return no_error; +} + +gras_error_t +gras_process_exit() { + gras_hostdata_t *hd=(gras_hostdata_t *)MSG_host_get_data(MSG_host_self()); + gras_process_data_t *pd=(gras_process_data_t *)MSG_process_get_data(MSG_process_self()); + int myPID=MSG_process_self_PID(); + int i; + + gras_assert0(hd && pd,"Run gras_process_init!!\n"); + + INFO2("GRAS: Finalizing process '%s' (%d)", + MSG_process_get_name(MSG_process_self()),MSG_process_self_PID()); + + WARNING0("Implement msg queue"); + /* + if (pd->grasMsgQueueLen) { + fprintf(stderr,"GRAS: Warning: process %d terminated, but some queued messages where not handled\n",MSG_process_self_PID()); + } + */ + + for (i=0; i< GRAS_MAX_CHANNEL; i++) + if (myPID == hd->proc[i]) + hd->proc[i] = 0; + + for (i=0; iportLen; i++) { + if (hd->port2chan[ i ] == pd->chan) { + memmove(&(hd->port[i]), &(hd->port[i+1]), (hd->portLen -i -1) * sizeof(int)); + memmove(&(hd->port2chan[i]), &(hd->port2chan[i+1]), (hd->portLen -i -1) * sizeof(int)); + hd->portLen--; + i--; /* counter the effect of the i++ at the end of the iteration */ + } + } + + return no_error; +} + +/* ************************************************************************** + * Process data + * **************************************************************************/ + +void *gras_userdata_get(void) { + gras_process_data_t *pd=(gras_process_data_t *)MSG_process_get_data(MSG_process_self()); + + gras_assert0(pd,"Run gras_process_init!"); + + return pd->userdata; +} + +void *gras_userdata_set(void *ud) { + gras_process_data_t *pd=(gras_process_data_t *)MSG_process_get_data(MSG_process_self()); + + gras_assert0(pd,"Run gras_process_init!"); + + pd->userdata = ud; + + return pd->userdata; +} diff --git a/src/gras/Virtu/sg_time.c b/src/gras/Virtu/sg_time.c new file mode 100644 index 0000000000..1f50a85d1c --- /dev/null +++ b/src/gras/Virtu/sg_time.c @@ -0,0 +1,19 @@ +/* $Id$ */ + +/* time - time related syscal wrappers */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2003,2004 da GRAS posse. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "Virtu/virtu_sg.h" + +double gras_time() { + return MSG_getClock(); +} + +void gras_sleep(unsigned long sec,unsigned long usec) { + MSG_process_sleep((double)sec + ((double)usec)/1000000); +} diff --git a/src/gras/Virtu/virtu_interface.h b/src/gras/Virtu/virtu_interface.h new file mode 100644 index 0000000000..f4fd3f9e61 --- /dev/null +++ b/src/gras/Virtu/virtu_interface.h @@ -0,0 +1,40 @@ +/* $Id$ */ + +/* virtu[alization] - speciafic parts for each OS and for SG */ + +/* module's public interface exported within GRAS, but not to end user. */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2004 Martin Quinson. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef GRAS_VIRTU_INTERFACE_H +#define GRAS_VIRTU_INTERFACE_H + +/** + * gras_process_data_t: + * + * Data for each process + */ +typedef struct { + /* queue of messages which where received but not wanted in msgWait, and therefore + temporarly queued until the next msgHandle */ + gras_dynar_t *msg_queue; /* elm type: gras_msg_t */ + + /* registered callbacks for each message */ + gras_dynar_t *cbl_list; /* elm type: gras_cblist_t */ + + + /* The channel we are listening to in SG for formated messages */ + int chan; + /* The channel we are listening to in SG for raw send/recv */ + int rawChan; + + /* globals of the process */ + void *userdata; +} gras_process_data_t; + + +#endif /* GRAS_VIRTU_INTERFACE_H */ diff --git a/src/gras/Virtu/virtu_rl.h b/src/gras/Virtu/virtu_rl.h new file mode 100644 index 0000000000..e2db0c2180 --- /dev/null +++ b/src/gras/Virtu/virtu_rl.h @@ -0,0 +1,16 @@ +/* $Id$ */ + +/* virtu_rl - specific GRAS implementation for real life */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2003,2004 da GRAS posse. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef VIRTU_RL_H +#define VIRTU_RL_H + +#include "gras_private.h" + +#endif /* VIRTU_RL_H */ diff --git a/src/gras/Virtu/virtu_sg.h b/src/gras/Virtu/virtu_sg.h new file mode 100644 index 0000000000..85303ca0ab --- /dev/null +++ b/src/gras/Virtu/virtu_sg.h @@ -0,0 +1,31 @@ +/* $Id$ */ + +/* virtu_sg - specific GRAS implementation for simulator */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2003,2004 da GRAS posse. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef VIRTU_SG_H +#define VIRTU_SG_H + +#include "gras_private.h" +#include /* SimGrid header */ + +#define GRAS_MAX_CHANNEL 10 + +/* Data for each host */ +typedef struct { + int proc[GRAS_MAX_CHANNEL]; /* who's connected to each channel (its PID). If =0, then free */ + + int portLen; + int *port; /* list of ports used by a server socket */ + int *port2chan; /* the channel it points to */ + int *raw; /* (boolean) the channel is in raw mode or for formatted messages */ + +} gras_hostdata_t; + + +#endif /* VIRTU_SG_H */ -- 2.20.1