X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b61e0df4e0f5d85fbc1df364660fc71d9461adc6..7ae0c491f4deae5db0941530a1d8342e2eb810c2:/src/surf/workstation_interface.cpp diff --git a/src/surf/workstation_interface.cpp b/src/surf/workstation_interface.cpp index 7149daf2ee..f37bff3ae6 100644 --- a/src/surf/workstation_interface.cpp +++ b/src/surf/workstation_interface.cpp @@ -22,8 +22,8 @@ WorkstationModelPtr surf_workstation_model = NULL; surf_callback(void, WorkstationPtr) workstationCreatedCallbacks; surf_callback(void, WorkstationPtr) workstationDestructedCallbacks; -surf_callback(void, WorkstationPtr) workstationStateChangedCallbacks; -surf_callback(void, WorkstationActionPtr) workstationActionStateChangedCallbacks; +surf_callback(void, WorkstationPtr, e_surf_resource_state_t, e_surf_resource_state_t) workstationStateChangedCallbacks; +surf_callback(void, WorkstationActionPtr, e_surf_action_state_t, e_surf_action_state_t) workstationActionStateChangedCallbacks; /********* * Model * @@ -112,8 +112,9 @@ Workstation::~Workstation(){ } void Workstation::setState(e_surf_resource_state_t state){ + e_surf_resource_state_t old = Resource::getState(); Resource::setState(state); - surf_callback_emit(workstationStateChangedCallbacks, this); + surf_callback_emit(workstationStateChangedCallbacks, this, old, state); } int Workstation::getCore(){ @@ -267,7 +268,7 @@ ActionPtr Workstation::write(surf_file_t fd, sg_size_t size) { int Workstation::unlink(surf_file_t fd) { if (!fd){ XBT_WARN("No such file descriptor. Impossible to unlink"); - return 0; + return MSG_TASK_CANCELED; } else { StoragePtr st = findStorageOnMountList(fd->mount); @@ -275,7 +276,7 @@ int Workstation::unlink(surf_file_t fd) { if (!xbt_dict_get_or_null(st->p_content, fd->name)){ XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name, st->getName()); - return 0; + return MSG_TASK_CANCELED; } else { XBT_DEBUG("UNLINK on disk '%s'",st->getName()); st->m_usedSize -= fd->size; @@ -283,20 +284,14 @@ int Workstation::unlink(surf_file_t fd) { // Remove the file from storage xbt_dict_remove(st->p_content, fd->name); - free(fd->name); - free(fd->mount); + xbt_free(fd->name); + xbt_free(fd->mount); xbt_free(fd); - return 1; + return MSG_OK; } } } -ActionPtr Workstation::ls(const char* mount, const char *path){ - XBT_DEBUG("LS on mount '%s' and file '%s'", mount, path); - StoragePtr st = findStorageOnMountList(mount); - return st->ls(path); -} - sg_size_t Workstation::getSize(surf_file_t fd){ return fd->size; } @@ -369,118 +364,6 @@ int Workstation::fileMove(surf_file_t fd, const char* fullpath){ } } -int Workstation::fileRcopy(surf_file_t fd, surf_resource_t host_dest, const char* fullpath){ - - XBT_DEBUG("Rcopy file %s on %s to %s",fd->name, host_dest->key, fullpath); - - /* Find the host src where the file is located */ - StoragePtr storage = findStorageOnMountList(fd->mount); - const char* host_name_src = (const char*)storage->p_attach; - - /* Find the real host dest where the file will be stored */ - s_mount_t mnt; - unsigned int cursor; - StoragePtr storage_dest = NULL; - const char* host_name_dest; - char *file_mount_name; - size_t longest_prefix_length = 0; - WorkstationPtr dest_ws, src_ws; - - dest_ws = static_cast(surf_workstation_resource_priv(host_dest)); - - xbt_dynar_foreach(dest_ws->p_storage,cursor,mnt) - { - file_mount_name = (char *) xbt_malloc ((strlen(mnt.name)+1)); - strncpy(file_mount_name,fullpath,strlen(mnt.name)+1); - file_mount_name[strlen(mnt.name)] = '\0'; - - if(!strcmp(file_mount_name,mnt.name) && strlen(mnt.name)>longest_prefix_length) - {/* The current mount name is found in the full path and is bigger than the previous*/ - longest_prefix_length = strlen(mnt.name); - storage_dest = static_cast(mnt.storage); - } - free(file_mount_name); - } - if(longest_prefix_length>0) - { /* Mount point found, retrieve the host the storage is attached to */ - host_name_dest = storage_dest->p_attach; - } - else - { - XBT_WARN("Can't find mount point for '%s' on destination host '%s'", fullpath, host_dest->key); - return MSG_TASK_CANCELED; - } - - /* Check that there is a route between src and dest workstations */ - xbt_dynar_t route = NULL; - dest_ws = static_cast(surf_workstation_resource_priv(xbt_lib_get_elm_or_null(host_lib, host_name_dest))); - src_ws = static_cast(surf_workstation_resource_priv(xbt_lib_get_elm_or_null(host_lib, host_name_src))); - - routing_get_route_and_latency(src_ws->p_netElm, dest_ws->p_netElm, &route, NULL); - if(!xbt_dynar_length (route)) - { - XBT_WARN("There is no route between %s and %s. Action has been canceled", src_ws->getName(), dest_ws->getName()); - return MSG_TASK_CANCELED; - } - else - {/* There is a route between src and dest, let's copy the file */ - - /* Read the file on the src side */ - src_ws->read(fd, fd->size); - - /* Send a message from src to dest to simulate data transfer */ - surf_network_model->communicate(src_ws->p_netElm, dest_ws->p_netElm, fd->size, -1.0); - - /* Create the file on the dest side and write data into it*/ - char *mount_name, *path; - path = (char *) xbt_malloc ((strlen(fullpath)-longest_prefix_length+1)); - mount_name = (char *) xbt_malloc ((longest_prefix_length+1)); - /* deduce mount_name and path from fullpath */ - strncpy(mount_name, fullpath, longest_prefix_length+1); - strncpy(path, fullpath+longest_prefix_length, strlen(fullpath)-longest_prefix_length+1); - path[strlen(fullpath)-longest_prefix_length] = '\0'; - mount_name[longest_prefix_length] = '\0'; - /* create the file */ - ActionPtr open_action = storage_dest->open((const char*)mount_name, (const char*)path); - /* write data */ - dest_ws->write(static_cast(open_action)->p_file, fd->size); - dest_ws->close(static_cast(open_action)->p_file); - free(path); - free(mount_name); - XBT_DEBUG("File %s has been copied on %s to %s",fd->name, host_dest->key, fullpath); - return MSG_OK; - } - - - XBT_INFO("SRC %s DEST %s", host_name_src, host_name_dest); - - - -// /* Check that file to copy is local to the src workstation (storage is attached to src workstation) */ -// StoragePtr storage = findStorageOnMountList(fd->mount); -// if(!strcmp((const char*)storage->p_attach, this->getName())) -// { -// /* Check that there is a route between src and dest workstations */ -// xbt_dynar_t route = NULL; -// routing_get_route_and_latency(this->p_netElm, ((WorkstationPtr)host_dest)->p_netElm, &route, NULL); -// if(route){ -// -// ATTENTION DISCUSSION AVEC FRED ! -// return MSG_OK; -// } -// else -// { -// XBT_WARN("There is no route between %s and %s. Action has been canceled", this->getName(), host_dest->key); -// return MSG_TASK_CANCELED; -// } -// } -// else -// { -// XBT_WARN("File %s is not local to %s but to %s. Action has been canceled", fd->name,this->getName(), storage->p_attach); -// return MSG_TASK_CANCELED; -// } -} - sg_size_t Workstation::getFreeSize(const char* name) { StoragePtr st = findStorageOnMountList(name); @@ -526,6 +409,7 @@ void Workstation::setParams(ws_params_t params) **********/ void WorkstationAction::setState(e_surf_action_state_t state){ + e_surf_action_state_t old = getState(); Action::setState(state); - surf_callback_emit(workstationActionStateChangedCallbacks, this); + surf_callback_emit(workstationActionStateChangedCallbacks, this, old, state); }