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