4806c85a47239313a6000e3c0417b8fe22d0215a
[scilab.git] / scilab / modules / core / src / cpp / storeCommand.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 /*--------------------------------------------------------------------------*/
13 extern "C"
14 {
15 #include "storeCommand.h"
16 }
17
18 #include "parser.hxx"
19 #include "tasks.hxx"
20 #include "scilabWrite.hxx"
21 #include "scilabexception.hxx"
22 #include "localization.hxx"
23 #include "runner.hxx"
24 #include "threadmanagement.hxx"
25
26 /*--------------------------------------------------------------------------*/
27 /*
28  *  Command queue functions
29  *  This function is used to store Scilab command in a queue
30  *
31  *  PUBLIC : int StoreCommand( char *command)
32  *           int StoreConsoleCommand(char *command)
33  *           int StorePrioritaryCommand(char *command)
34  *           int C2F(ismenu)()
35  *           int C2F(getmen)(char * btn_cmd,int * lb, int * entry)
36  */
37 /*--------------------------------------------------------------------------*/
38 struct CommandRec
39 {
40     char*   m_command;              /* command info one string two integers */
41     int     m_isInterruptible;      /* 1 if the command execution can be interrupted */
42     int     m_isPrioritary;         /* 1 if the command is prioritary */
43     int     m_isConsole;            /* 1 if the command come from console */
44     CommandRec(char* command, int isInterruptible, int isPrioritary, int isConsole) : m_command(command), m_isInterruptible(isInterruptible), m_isPrioritary(isPrioritary), m_isConsole(isConsole) {}
45 };
46 /*--------------------------------------------------------------------------*/
47 static std::list<CommandRec> commandQueue;
48 static std::list<CommandRec> commandQueuePrioritary;
49 /*--------------------------------------------------------------------------*/
50 int StoreCommand(char *command)
51 {
52     ThreadManagement::LockStoreCommand();
53     commandQueue.emplace_back(os_strdup(command),
54                               /*is prioritary*/ 0,
55                               /* is interruptible*/ 1,
56                               /* from console */ 0);
57
58     ThreadManagement::UnlockStoreCommand();
59     // Awake Scilab to execute a new command
60     ThreadManagement::SendCommandStoredSignal();
61
62     return 0;
63 }
64
65 int StoreConsoleCommand(char *command, int iWaitFor)
66 {
67     ThreadManagement::LockStoreCommand();
68     commandQueuePrioritary.emplace_back(os_strdup(command),
69                                         /*is prioritary*/ 1,
70                                         /* is interruptible*/ 1,
71                                         /* from console */ 1);
72
73     // Awake Scilab to execute a new command
74     ThreadManagement::SendCommandStoredSignal();
75     // Awake Runner to execute this prioritary command
76     ThreadManagement::SendAwakeRunnerSignal();
77
78     if (iWaitFor)
79     {
80         // make this wait before unlock the Store Command will prevent
81         // dead lock in case where an other thread get this command
82         // and execute it before this thread is waiting for.
83         ThreadManagement::WaitForConsoleExecDoneSignal();
84     }
85     else
86     {
87         ThreadManagement::UnlockStoreCommand();
88     }
89
90     return 0;
91 }
92
93 int StorePrioritaryCommand(char *command)
94 {
95     ThreadManagement::LockStoreCommand();
96     commandQueuePrioritary.emplace_back(os_strdup(command),
97                                         /*is prioritary*/ 1,
98                                         /* is interruptible*/ 0,
99                                         /* from console */ 0);
100
101     // Awake Scilab to execute a new command
102     ThreadManagement::SendCommandStoredSignal();
103     // Awake Runner to execute this prioritary command
104     ThreadManagement::SendAwakeRunnerSignal();
105
106     ThreadManagement::UnlockStoreCommand();
107
108     return 0;
109 }
110
111 int isEmptyCommandQueue(void)
112 {
113     return (commandQueuePrioritary.empty() && commandQueue.empty());
114 }
115
116 /*
117  * Gets the next command to execute
118  * and remove it from the queue
119  */
120 int GetCommand (char** cmd, int* piInterruptible, int* piPrioritary, int* piConsole)
121 {
122     int iCommandReturned = 0;
123
124     ThreadManagement::LockStoreCommand();
125     if (commandQueuePrioritary.empty() == false)
126     {
127         *cmd = os_strdup(commandQueuePrioritary.front().m_command);
128         *piInterruptible = commandQueuePrioritary.front().m_isInterruptible;
129         *piPrioritary = commandQueuePrioritary.front().m_isPrioritary;
130         *piConsole = commandQueuePrioritary.front().m_isConsole;
131
132         FREE (commandQueuePrioritary.front().m_command);
133         commandQueuePrioritary.pop_front();
134
135         iCommandReturned = 1;
136     }
137     else if (commandQueue.empty() == false)
138     {
139         *cmd = os_strdup(commandQueue.front().m_command);
140         *piInterruptible = commandQueue.front().m_isInterruptible;
141         *piPrioritary = commandQueue.front().m_isPrioritary;
142         *piConsole = commandQueue.front().m_isConsole;
143
144         FREE (commandQueue.front().m_command);
145         commandQueue.pop_front();
146
147         iCommandReturned = 1;
148     }
149     ThreadManagement::UnlockStoreCommand();
150
151     return iCommandReturned;
152 }
153 /*--------------------------------------------------------------------------*/
154 int ismenu(void)
155 {
156     //#pragma message("WARNING : ismenu is deprecated. It will be removed _BEFORE_ Scilab 6.0.")
157     // FIXME : Do not forget to remove me.
158     return 0;
159 }
160 /*--------------------------------------------------------------------------*/
161 /* menu/button info for Scilab */
162 int C2F(getmen)(char * btn_cmd, int * lb, int * entry)
163 {
164     //#pragma message("WARNING : C2F(getmen) is deprecated. It will be removed _BEFORE_ Scilab 6.0.")
165     // FIXME : Do not forget to remove me.
166     return 0;
167 }
168 /*--------------------------------------------------------------------------*/