Changeset: 09bf17ab6c98 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=09bf17ab6c98
Modified Files:
        monetdb5/modules/kernel/alarm.c
        monetdb5/modules/kernel/alarm.mal
        sql/backends/monet5/sql_upgrades.c
        sql/scripts/25_debug.sql
Branch: default
Log Message:

Added sleep as a procedure and function at the SQL layer. The ALARMsleep 
functions sleeps for milliseconds instead of seconds for greater precision. 
This fixes bug 6808


diffs (177 lines):

diff --git a/monetdb5/modules/kernel/alarm.c b/monetdb5/modules/kernel/alarm.c
--- a/monetdb5/modules/kernel/alarm.c
+++ b/monetdb5/modules/kernel/alarm.c
@@ -22,19 +22,16 @@
  */
 #include "monetdb_config.h"
 #include "mal.h"
-#include <signal.h>
+#include "mal_client.h"
+#include "mal_interpreter.h"
 #include <time.h>
 
 mal_export str ALARMusec(lng *ret);
-mal_export str ALARMsleep(void *res, int *secs);
+mal_export str ALARMsleep(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 mal_export str ALARMctime(str *res);
 mal_export str ALARMepoch(int *res);
 mal_export str ALARMtime(int *res);
 
-#include "mal.h"
-#include "mal_exception.h"
-
-
 str
 ALARMusec(lng *ret)
 {
@@ -43,13 +40,57 @@ ALARMusec(lng *ret)
 }
 
 str
-ALARMsleep(void *res, int *secs)
+ALARMsleep(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       (void) res;             /* fool compilers */
-       if (*secs < 0)
-               throw(MAL, "alarm.sleep", "negative delay");
+       BAT *r, *b;
+       int *restrict rb, *restrict bb;
+       BUN i, j;
+
+       (void) cntxt;
+       if (getArgType(mb, pci, 0) != TYPE_void && isaBatType(getArgType(mb, 
pci, 1))) {
+               bat *res = getArgReference_bat(stk, pci, 0);
+               bat *bid = getArgReference_bat(stk, pci, 1);
+               
+               if (!(b = BATdescriptor(*bid)))
+                       throw(MAL, "alarm.sleepr", SQLSTATE(HY005) "Cannot 
access column descriptor");
+
+               j = BATcount(b);
+               bb = Tloc(b, 0);
+               for (i = 0; i < j ; i++) {
+                       if (is_int_nil(bb[i])) {
+                               BBPunfix(b->batCacheid);
+                               throw(MAL, "alarm.sleepr", "NULL values not 
allowed for the sleeping time");
+                       } else if (bb[i]) {
+                               BBPunfix(b->batCacheid);
+                               throw(MAL, "alarm.sleepr", "Cannot sleep for a 
negative time");
+                       }
+               }
 
-       MT_sleep_ms(*secs * 1000);
+               r = COLnew(0, TYPE_int, j, TRANSIENT);
+               if (r == NULL) {
+                       BBPunfix(b->batCacheid);
+                       throw(MAL, "alarm.sleepr", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               }
+
+               rb = Tloc(r, 0);
+               for (i = 0; i < j ; i++) {
+                       MT_sleep_ms(bb[i]);
+                       rb[i] = bb[i];
+               }
+
+               BBPunfix(b->batCacheid);
+               BBPkeepref(*res = r->batCacheid);
+       } else {
+               int *res = (int*) getArgReference(stk, pci, 0), *msecs = (int*) 
getArgReference(stk,pci,1);
+
+               if (is_int_nil(*msecs))
+                       throw(MAL, "alarm.sleepr", "NULL values not allowed for 
the sleeping time");
+               else if (*msecs < 0)
+                       throw(MAL, "alarm.sleepr", "Cannot sleep for a negative 
time");
+
+               MT_sleep_ms(*msecs);
+               *res = *msecs;
+       }
        return MAL_SUCCEED;
 }
 
diff --git a/monetdb5/modules/kernel/alarm.mal 
b/monetdb5/modules/kernel/alarm.mal
--- a/monetdb5/modules/kernel/alarm.mal
+++ b/monetdb5/modules/kernel/alarm.mal
@@ -6,9 +6,17 @@
 
 module alarm;
 
-unsafe command alarm.sleep(secs:int):void
+unsafe command alarm.sleep(msecs:int) :void
+address ALARMsleep
+comment "Sleep a few milliseconds";
+
+unsafe pattern alarm.sleep(msecs:int) :int
 address ALARMsleep
-comment "Sleep a few seconds";
+comment "Sleep a few milliseconds and return the slept value";
+
+unsafe pattern alarm.sleep(msecs:bat[:int]) :bat[:int]
+address ALARMsleep
+comment "Sleep a few milliseconds and return the slept value";
 
 unsafe command alarm.usec() :lng
 address ALARMusec
diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -2497,10 +2497,14 @@ sql_update_default(Client c, mvc *sql, c
                        " external name mdb.\"setDebug\";\n"
                        "create function sys.debugflags()\n"
                        " returns table(flag string, val bool)\n"
-                       " external name mdb.\"getDebugFlags\";\n");
+                       " external name mdb.\"getDebugFlags\";\n"
+                       "create procedure sys.\"sleep\"(msecs int)\n"
+                       " external name \"alarm\".\"sleep\";\n"
+                       "create function sys.\"sleep\"(msecs int) returns 
integer\n"
+                       " external name \"alarm\".\"sleep\";\n");
        pos += snprintf(buf + pos, bufsize - pos,
                        "update sys.functions set system = true where schema_id 
= (select id from sys.schemas where name = 'sys')"
-                       " and name in ('debug', 'debugflags');\n");
+                       " and name in ('debug', 'debugflags', 'sleep');\n");
 
        /* 26_sysmon */
        t = mvc_bind_table(sql, sys, "queue");
diff --git a/sql/scripts/25_debug.sql b/sql/scripts/25_debug.sql
--- a/sql/scripts/25_debug.sql
+++ b/sql/scripts/25_debug.sql
@@ -54,11 +54,11 @@ create procedure sys.flush_log ()
 
 -- Helper function to disable the log merger
 create procedure suspend_log_flushing()
-        external name sql.suspend_log_flushing;
+       external name sql.suspend_log_flushing;
 
 -- Helper function to enable the log merger
 create procedure resume_log_flushing()
-        external name sql.resume_log_flushing;
+       external name sql.resume_log_flushing;
 
 create function sys.debug(debug int) returns integer
        external name mdb."setDebug";
@@ -71,13 +71,21 @@ create function sys.debugflags()
        external name mdb."getDebugFlags";
 
 create function sys.deltas ("schema" string)
-    returns table ("id" int, "cleared" boolean, "immutable" bigint, "inserted" 
bigint, "updates" bigint, "deletes" bigint, "level" int)
-    external name "sql"."deltas";
+       returns table ("id" int, "cleared" boolean, "immutable" bigint, 
"inserted" bigint, "updates" bigint, "deletes" bigint, "level" int)
+       external name "sql"."deltas";
 
 create function sys.deltas ("schema" string, "table" string)
-    returns table ("id" int, "cleared" boolean, "immutable" bigint, "inserted" 
bigint, "updates" bigint, "deletes" bigint, "level" int)
-    external name "sql"."deltas";
+       returns table ("id" int, "cleared" boolean, "immutable" bigint, 
"inserted" bigint, "updates" bigint, "deletes" bigint, "level" int)
+       external name "sql"."deltas";
 
 create function sys.deltas ("schema" string, "table" string, "column" string)
-    returns table ("id" int, "cleared" boolean, "immutable" bigint, "inserted" 
bigint, "updates" bigint, "deletes" bigint, "level" int)
-    external name "sql"."deltas";
+       returns table ("id" int, "cleared" boolean, "immutable" bigint, 
"inserted" bigint, "updates" bigint, "deletes" bigint, "level" int)
+       external name "sql"."deltas";
+
+-- Sleep procedure
+create procedure sys."sleep"(msecs int)
+       external name "alarm"."sleep";
+
+-- Sleep function
+create function sys."sleep"(msecs int) returns integer
+       external name "alarm"."sleep";
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to