Changeset: d594efacebf7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d594efacebf7
Modified Files:
gdk/gdk_system.c
gdk/gdk_system.h
monetdb5/mal/mal_interpreter.c
Branch: qcancel
Log Message:
start qcancel
diffs (146 lines):
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -183,6 +183,7 @@ static struct winthread {
ATOMIC_TYPE exited;
bool detached:1, waiting:1;
char threadname[MT_NAME_LEN];
+ QryCtx *qry_ctx;
} *winthreads = NULL;
static struct winthread mainthread = {
.threadname = "main thread",
@@ -264,6 +265,37 @@ MT_thread_setdata(void *data)
w->data = data;
}
+void *
+MT_thread_getdata(void)
+{
+ if (threadslot == TLS_OUT_OF_INDEXES)
+ return NULL;
+ struct winthread *w = TlsGetValue(threadslot);
+
+ return w ? w->data : NULL;
+}
+
+void
+MT_thread_set_qry_ctx(QryCtx *ctx)
+{
+ if (threadslot == TLS_OUT_OF_INDEXES)
+ return;
+ struct winthread *w = TlsGetValue(threadslot);
+
+ if (w)
+ w->qry_ctx = ctx;
+}
+
+QryCtx *
+MT_thread_get_qry_ctx(void)
+{
+ if (threadslot == TLS_OUT_OF_INDEXES)
+ return NULL;
+ struct winthread *w = TlsGetValue(threadslot);
+
+ return w ? w->qry_ctx : NULL;
+}
+
void
MT_thread_setlockwait(MT_Lock *lock)
{
@@ -338,16 +370,6 @@ MT_thread_override_limits(void)
return w && w->working && strcmp(w->working, "store locked") == 0;
}
-void *
-MT_thread_getdata(void)
-{
- if (threadslot == TLS_OUT_OF_INDEXES)
- return NULL;
- struct winthread *w = TlsGetValue(threadslot);
-
- return w ? w->data : NULL;
-}
-
static void
rm_winthread(struct winthread *w)
{
@@ -566,6 +588,7 @@ static struct posthread {
MT_Id mtid;
ATOMIC_TYPE exited;
bool detached:1, waiting:1;
+ QryCtx *qry_ctx;
} *posthreads = NULL;
static struct posthread mainthread = {
.threadname = "main thread",
@@ -660,6 +683,27 @@ MT_thread_getdata(void)
}
void
+MT_thread_set_qry_ctx(QryCtx *ctx)
+{
+ if (!thread_initialized)
+ return;
+ struct posthread *p = pthread_getspecific(threadkey);
+
+ if (p)
+ p->qry_ctx = ctx;
+}
+
+QryCtx *
+MT_thread_get_qry_ctx(void)
+{
+ if (!thread_initialized)
+ return NULL;
+ struct posthread *p = pthread_getspecific(threadkey);
+
+ return p ? p->qry_ctx : NULL;
+}
+
+void
MT_thread_setlockwait(MT_Lock *lock)
{
if (!thread_initialized)
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -141,6 +141,12 @@ enum MT_thr_detach { MT_THR_JOINABLE, MT
#define MT_NAME_LEN 32 /* length of thread/semaphore/etc. names */
#define UNKNOWN_THREAD "unknown thread"
+typedef int64_t lng;
+
+typedef struct QryCtx {
+ lng starttime;
+ lng querytimeout;
+} QryCtx;
gdk_export bool MT_thread_init(void);
gdk_export int MT_create_thread(MT_Id *t, void (*function) (void *),
@@ -152,6 +158,8 @@ gdk_export void MT_thread_setdata(void *
gdk_export void MT_exiting_thread(void);
gdk_export MT_Id MT_getpid(void);
gdk_export int MT_join_thread(MT_Id t);
+gdk_export QryCtx *MT_thread_get_qry_ctx(void);
+gdk_export void MT_thread_set_qry_ctx(QryCtx *ctx);
#if SIZEOF_VOID_P == 4
/* "limited" stack size on 32-bit systems */
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -463,6 +463,7 @@ str runMALsequence(Client cntxt, MalBlkP
int startedProfileQueue = 0;
#define CHECKINTERVAL 1000 /* how often do we check for client disconnect */
runtimeProfile.ticks = runtimeProfileFunction.ticks = 0;
+ QryCtx qry_ctx = {.starttime=mb->starttime,
.querytimeout=cntxt->querytimeout};
if (stk == NULL)
throw(MAL, "mal.interpreter", MAL_STACK_FAIL);
@@ -515,6 +516,7 @@ str runMALsequence(Client cntxt, MalBlkP
while (stkpc < mb->stop && stkpc != stoppc) {
// incomplete block being executed, requires at least signature
and end statement
MT_thread_setalgorithm(NULL);
+ MT_thread_set_qry_ctx(&qry_ctx);
pci = getInstrPtr(mb, stkpc);
if (cntxt->mode == FINISHCLIENT){
stkpc = stoppc;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list