# ParadisEO-PEOMovingObjects: worker.cpp Source File

# worker.cpp

    00001 /*
    00002 * <worker.cpp>
    00003 * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
    00004 * (C) OPAC Team, LIFL, 2002-2007
    00005 *
    00006 * Sebastien Cahon, Alexandru-Adrian Tantar
    00007 *
    00008 * This software is governed by the CeCILL license under French law and
    00009 * abiding by the rules of distribution of free software.  You can  use,
    00010 * modify and/ or redistribute the software under the terms of the CeCILL
    00011 * license as circulated by CEA, CNRS and INRIA at the following URL
    00012 * "http://www.cecill.info".
    00013 *
    00014 * As a counterpart to the access to the source code and  rights to copy,
    00015 * modify and redistribute granted by the license, users are provided only
    00016 * with a limited warranty  and the software's author,  the holder of the
    00017 * economic rights,  and the successive licensors  have only  limited liability.
    00018 *
    00019 * In this respect, the user's attention is drawn to the risks associated
    00020 * with loading,  using,  modifying and/or developing or reproducing the
    00021 * software by the user in light of its specific status of free software,
    00022 * that may mean  that it is complicated to manipulate,  and  that  also
    00023 * therefore means  that it is reserved for developers  and  experienced
    00024 * professionals having in-depth computer knowledge. Users are therefore
    00025 * encouraged to load and test the software's suitability as regards their
    00026 * requirements in conditions enabling the security of their systems and/or
    00027 * data to be ensured and,  more generally, to use and operate it in the
    00028 * same conditions as regards security.
    00029 * The fact that you are presently reading this means that you have had
    00030 * knowledge of the CeCILL license and that you accept its terms.
    00031 *
    00032 * ParadisEO WebSite : http://paradiseo.gforge.inria.fr
    00033 * Contact: paradiseo-help@lists.gforge.inria.fr
    00034 *
    00035 */
    00036
    00037 #include <vector>
    00038
    00039 #include "tags.h"
    00040 #include "send.h"
    00041 #include "node.h"
    00042 #include "schema.h"
    00043 #include "worker.h"
    00044 #include "mess.h"
    00045 #include "../../core/peo_debug.h"
    00046
    00047 static std :: vector <Worker *> key_to_worker (1); /* Vector of registered workers */
    00048
    00049 Worker * getWorker (WORKER_ID __key) {
    00050
    00051   return key_to_worker [__key];
    00052 }
    00053
    00054 Worker :: Worker () {
    00055
    00056   toto = false;
    00057   id = key_to_worker.size ();
    00058   key_to_worker.push_back (this);
    00059 }
    00060
    00061 void Worker :: packResult () {
    00062
    00063   pack (serv_id);
    00064   serv -> packResult ();
    00065 }
    00066
    00067 void Worker :: unpackData () {
    00068
    00069   printDebugMessage ("unpacking the ID. of the service.");
    00070   unpack (serv_id);
    00071   serv = getService (serv_id);
    00072   printDebugMessage ("found the service.");
    00073   serv -> unpackData ();
    00074   printDebugMessage ("unpacking the data.");
    00075   setActive ();
    00076 }
    00077
    00078 void Worker :: packTaskDone () {
    00079
    00080   pack (getNodeRank ());
    00081   pack (id);
    00082 }
    00083
    00084 void Worker :: notifySendingResult () {
    00085
    00086   /* Notifying the scheduler of the termination */
    00087   toto = true;
    00088   wakeUp ();
    00089 }
    00090
    00091 void Worker :: notifySendingTaskDone () {
    00092
    00093   setPassive ();
    00094 }
    00095
    00096 void Worker :: setSource (int __rank) {
    00097
    00098   src = __rank;
    00099 }
    00100
    00101 void Worker :: start () {
    00102
    00103   while (true) {
    00104
    00105     sleep ();
    00106
    00107     if (! atLeastOneActiveRunner ())
    00108       break;
    00109
    00110     if (toto) {
    00111       send (this, my_node -> rk_sched, TASK_DONE_TAG);
    00112       toto = false;
    00113     }
    00114     else {
    00115
    00116       printDebugMessage ("executing the task.");
    00117       serv -> execute ();
    00118       send (this, src, TASK_RESULT_TAG);
    00119     }
    00120   }
    00121 }