bug 6743
Allan CORNET [Wed, 10 Mar 2010 13:04:51 +0000 (14:04 +0100)]
scilab/modules/action_binding/action_binding.iss
scilab/modules/action_binding/src/c/dynamic_menus.c
scilab/modules/action_binding/tests/nonreg_tests/bug_6743.tst [new file with mode: 0644]

index 3dbae6d..3cda4aa 100644 (file)
@@ -48,5 +48,5 @@ Source: modules\{#ACTION_BINDING}\macros\cleanmacros.bat; DestDir: {app}\modules
 ;
 ;Source: modules\{#ACTION_BINDING}\demos\*.*; DestDir: {app}\modules\{#ACTION_BINDING}\demos; Flags: recursesubdirs; Components: {#COMPN_SCILAB}
 ;
-;Source: modules\{#ACTION_BINDING}\tests\*.*; DestDir: {app}\modules\{#ACTION_BINDING}\tests; Flags: recursesubdirs; Components: {#COMPN_SCILAB} and {#COMPN_TESTS}
+Source: modules\{#ACTION_BINDING}\tests\*.*; DestDir: {app}\modules\{#ACTION_BINDING}\tests; Flags: recursesubdirs; Components: {#COMPN_SCILAB} and {#COMPN_TESTS}
 ;--------------------------------------------------------------------------------------------------------------
index 59bde99..6fe5c89 100644 (file)
@@ -2,7 +2,6 @@
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2001-2008 - ENPC  - Jean-Philippe Chancelier <jpc@cermics.enpc.fr>
  * Copyright (C) 2004-2008 - INRIA - Serge STEER <serge.steer@inria.fr>
- * Copyright (C) 2008-2008 - INRIA - Bruno JOFRET
  * Copyright (C) 2008-2009 - DIGITEO - Bruno JOFRET
  *
  * This file must be used under the terms of the CeCILL.
@@ -11,8 +10,8 @@
  * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
- */
-
+*/
+/*--------------------------------------------------------------------------*/
 #include <string.h>
 #include "stack-c.h"
 #include "MALLOC.h"
@@ -21,7 +20,6 @@
 #include "sciprint_full.h"
 #include "localization.h"
 #include "Thread_Wrapper.h"
-
 /*--------------------------------------------------------------------------*/
 /*
  *  Command queue functions
  *  PUBLIC : int StoreCommand( char *command)
  *           int C2F(ismenu)()
  *           int C2F(getmen)(char * btn_cmd,int * lb, int * entry)
- */
+*/
 /*--------------------------------------------------------------------------*/
-
 #ifdef _MSC_VER
-       #define IMPORT_SIGNAL __declspec(dllimport)
+#define IMPORT_SIGNAL __declspec(dllimport)
 #else
-       #define IMPORT_SIGNAL extern
+#define IMPORT_SIGNAL extern
 #endif
-
+/*--------------------------------------------------------------------------*/
 typedef struct commandRec
 {
-  char              *command;          /* command info one string two integers */
-  int               flag; /* 1 if the command execution cannot be interrupted */
-  struct commandRec *next;
+       char              *command;             /* command info one string two integers */
+       int               flag; /* 1 if the command execution cannot be interrupted */
+       struct commandRec *next;
 } CommandRec;
 /*--------------------------------------------------------------------------*/
-
-/*
-** Extern Signal to say we git a StoreCommand.
-*/
+/* Extern Signal to say we git a StoreCommand. */
 IMPORT_SIGNAL __threadSignal LaunchScilab;
-
 /*--------------------------------------------------------------------------*/
 static CommandRec *commandQueue = NULL;
 static __threadLock commandQueueSingleAccess = __StaticInitLock;
 /*--------------------------------------------------------------------------*/
 int StoreCommand (char *command)
 {
-  return (StoreCommandWithFlag (command, 0));
+       return (StoreCommandWithFlag (command, 0));
 }
-
 /*--------------------------------------------------------------------------*/
 int StorePrioritaryCommand (char *command)
 {
-  return (StorePrioritaryCommandWithFlag (command, 0));
+       return (StorePrioritaryCommandWithFlag (command, 0));
 }
-
 /*--------------------------------------------------------------------------*/
 /*
- * try to execute a command or add it to the end of command queue
- * flag = 0 : the command is not shown in scilab window
- * flag = 1 : the command is shown in scilab window (if at prompt) and executed sequentially
- */
-/*--------------------------------------------------------------------------*/
+* try to execute a command or add it to the end of command queue
+* flag = 0 : the command is not shown in scilab window
+* flag = 1 : the command is shown in scilab window (if at prompt) and executed sequentially
+*/
 int StoreCommandWithFlag (char *command,int flag)
 {
-  CommandRec *p, *q, *r;
+       CommandRec *q = NULL, *r = NULL;
 
-       p = (CommandRec *) MALLOC (sizeof (CommandRec));
+       CommandRec *p = (CommandRec *) MALLOC (sizeof (CommandRec));
        if (p == (CommandRec *) 0)
-         {
-           sciprint(_("%s: No more memory.\n"),"send_command");
-           return (1);
-         }
+       {
+               sciprint(_("%s: No more memory.\n"),"send_command");
+               return (1);
+       }
        p->flag = flag;
        p->command = (char *) MALLOC ((strlen (command) + 1) * sizeof (char));
        if (p->command == (char *) 0)
-         {
-           FREE(p);
-           sciprint(_("%s: No more memory.\n"),"send_command");
-           return (1);
-         }
+       {
+               FREE(p);
+               sciprint(_("%s: No more memory.\n"),"send_command");
+               return (1);
+       }
        strcpy (p->command, command);
        p->next = NULL;
        __Lock(&commandQueueSingleAccess);
@@ -101,12 +91,12 @@ int StoreCommandWithFlag (char *command,int flag)
        }
        else
        {
-           q = commandQueue;
-           while ((r = q->next) != NULL)
-                       {
-                               q = r;
-                       }
-           q->next = p;
+               q = commandQueue;
+               while ((r = q->next) != NULL)
+               {
+                       q = r;
+               }
+               q->next = p;
        }
        __UnLock(&commandQueueSingleAccess);
        //**
@@ -115,32 +105,28 @@ int StoreCommandWithFlag (char *command,int flag)
        __Signal(&LaunchScilab);
        return (0);
 }
-
 /*--------------------------------------------------------------------------*/
 /*
- * try to execute a command or add it to the _BEGINNING_ of command queue
- * flag = 0 : the command is not shown in scilab window
- * flag = 1 : the command is shown in scilab window (if at prompt) and executed sequentially
- */
-/*--------------------------------------------------------------------------*/
+* try to execute a command or add it to the _BEGINNING_ of command queue
+* flag = 0 : the command is not shown in scilab window
+* flag = 1 : the command is shown in scilab window (if at prompt) and executed sequentially
+*/
 int StorePrioritaryCommandWithFlag (char *command,int flag)
 {
-  CommandRec *p = NULL;
-
-       p = (CommandRec *) MALLOC (sizeof (CommandRec));
+       CommandRec *p = (CommandRec *) MALLOC (sizeof (CommandRec));
        if (p == (CommandRec *) 0)
-         {
-           sciprint(_("%s: No more memory.\n"),"send_command");
-           return (1);
-         }
+       {
+               sciprint(_("%s: No more memory.\n"),"send_command");
+               return (1);
+       }
        p->flag = flag;
        p->command = (char *) MALLOC ((strlen (command) + 1) * sizeof (char));
        if (p->command == (char *) 0)
-         {
-           FREE(p);
-           sciprint(_("%s: No more memory.\n"),"send_command");
-           return (1);
-         }
+       {
+               FREE(p);
+               sciprint(_("%s: No more memory.\n"),"send_command");
+               return (1);
+       }
        strcpy (p->command, command);
        p->next = NULL;
        __Lock(&commandQueueSingleAccess);
@@ -150,8 +136,8 @@ int StorePrioritaryCommandWithFlag (char *command,int flag)
        }
        else
        {
-         p->next = commandQueue;
-           commandQueue = p;
+               p->next = commandQueue;
+               commandQueue = p;
        }
        __UnLock(&commandQueueSingleAccess);
        //**
@@ -165,89 +151,68 @@ int isEmptyCommandQueue(void)
 {
        int isEmpty = 0;
        __Lock(&commandQueueSingleAccess);
-       if (commandQueue != NULL)
-       {
-               isEmpty = 0;
-       }
-       else
-       {
-               isEmpty = 1;
-       }
+       isEmpty = (commandQueue == NULL);
        __UnLock(&commandQueueSingleAccess);
        return isEmpty;
 }
 /*--------------------------------------------------------------------------*/
 /*
- * Gets info on the first queue element
- * and remove it from the queue
- */
-/*--------------------------------------------------------------------------*/
-
+* Gets info on the first queue element
+* and remove it from the queue
+*/
 int GetCommand ( char *str)
 {
        int flag = 0;
        __Lock(&commandQueueSingleAccess);
        if (commandQueue != NULL)
        {
+               CommandRec *p = commandQueue;
 
-               CommandRec *p;
-
-
-               p = commandQueue;
                strcpy (str, p->command);
-               flag=p->flag;
+               flag = p->flag;
 
                commandQueue = p->next;
                FREE (p->command);
                FREE (p);
-               if (C2F(iop).ddt==-1) {
-                       if (flag==0) { sciprint_full(_("Unqueuing %s - No option.\n"),str); }
-                       else         { sciprint_full(_("Unqueuing %s - seq.\n"),str); }
+               if (C2F(iop).ddt == -1) 
+               {
+                       if (flag == 0) 
+                       { 
+                               sciprint_full(_("Unqueuing %s - No option.\n"),str); 
+                       }
+                       else
+                       { 
+                               sciprint_full(_("Unqueuing %s - seq.\n"),str); 
+                       }
                }
-
        }
        __UnLock(&commandQueueSingleAccess);
 
        return flag;
 }
-
+/*--------------------------------------------------------------------------*/
 int ismenu(void)
 {
-  /* Do not manage commands while compiling scilab function */
-       BOOL commandQueueEmpty;
-       __Lock(&commandQueueSingleAccess);
-       commandQueueEmpty = (commandQueue == NULL);
-       __UnLock(&commandQueueSingleAccess);
-  if ( commandQueueEmpty || (C2F(com).comp[0] != 0))
-       {
-    return(0) ;
-       }
-  else
-       {
-    return(1);
-       }
+       /* Do not manage commands while compiling scilab function */
+       return (commandQueue == NULL || (C2F(com).comp[0] != 0)) ? 0 : 1;
 }
-
-/*--------------------------------------------------------------------------*/
-/*
- * menu/button info for Scilab
- */
 /*--------------------------------------------------------------------------*/
+/* menu/button info for Scilab */
 int C2F(getmen)(char * btn_cmd,int * lb, int * entry)
 {
-  int flag;
-  if (ismenu()==1)
-    {
-      flag=GetCommand(btn_cmd);
-      *lb=(int) strlen(btn_cmd);
-      *entry=0;  /* This parameter entry seems to be unused. Probably a very old thing... */
-    }
-  else
-    {
-      flag=0;
-      *lb =0;
-      *entry=0;  /* This parameter entry seems to be unused. Probably a very old thing... */
-    }
-  return flag;
+       int flag = 0;
+       if (ismenu() == 1)
+       {
+               flag = GetCommand(btn_cmd);
+               *lb = (int) strlen(btn_cmd);
+               *entry = 0;  /* This parameter entry seems to be unused. Probably a very old thing... */
+       }
+       else
+       {
+               flag = 0;
+               *lb = 0;
+               *entry = 0;  /* This parameter entry seems to be unused. Probably a very old thing... */
+       }
+       return flag;
 }
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/action_binding/tests/nonreg_tests/bug_6743.tst b/scilab/modules/action_binding/tests/nonreg_tests/bug_6743.tst
new file mode 100644 (file)
index 0000000..6b7e7f6
--- /dev/null
@@ -0,0 +1,34 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// 
+// <-- INTERACTIVE TEST -->
+//
+// <-- Non-regression test for bug 6743 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=6743
+//
+// <-- Short Description -->
+// ismenu function is slow
+
+function r=inside(x,y); if((x*x+y*y)<1.) r=1.; else r=0.; end; endfunction
+
+function p=monte_carlo_pi(n)
+x=rand(1,n);
+y=rand(1,n);
+ p=0.;
+  for i=1:n
+      p=p+inside(x(i),y(i));
+    end
+p=p/n*4.;
+endfunction
+
+tic();monte_carlo_pi(1000000);t = toc();
+disp(t)
+if t > 20 then pause,end
+
+// on a Core 2 Quad 2.4 Ghz, it must be something as 9 s