Changeset: 209b437d2f90 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=209b437d2f90
Modified Files:
        monetdb5/mal/mal_dataflow.c
Branch: Jun2020
Log Message:

Allocate error buffer before creating thread.
It's easier then to recover from malloc failures.


diffs (64 lines):

diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c
--- a/monetdb5/mal/mal_dataflow.c
+++ b/monetdb5/mal/mal_dataflow.c
@@ -81,6 +81,7 @@ static struct worker {
        MT_Id id;
        enum {IDLE, RUNNING, JOINING, EXITED} flag;
        ATOMIC_PTR_TYPE cntxt; /* client we do work for (NULL -> any) */
+       char *errbuf;              /* GDKerrbuf so that we can allocate before 
fork */
        MT_Sema s;
 } workers[THREADS];
 
@@ -333,10 +334,10 @@ DFLOWworker(void *T)
 #ifdef _MSC_VER
        srand((unsigned int) GDKusec());
 #endif
-       GDKsetbuf(GDKmalloc(GDKMAXERRLEN)); /* where to leave errors */
-       if( GDKerrbuf ) {
-               GDKclrerr();
-       }
+       assert(t->errbuf != NULL);
+       GDKsetbuf(t->errbuf);           /* where to leave errors */
+       t->errbuf = NULL;
+       GDKclrerr();
                
        cntxt = ATOMIC_PTR_GET(&t->cntxt);
        if (cntxt) {
@@ -506,13 +507,20 @@ DFLOWinitialize(void)
                limit = THREADS;
        MT_lock_set(&dataflowLock);
        for (i = 0; i < limit; i++) {
+               workers[i].errbuf = GDKmalloc(GDKMAXERRLEN);
+               if (workers[i].errbuf == NULL) {
+                       TRC_CRITICAL(MAL_SERVER, "cannot allocate error buffer 
for worker");
+                       continue;
+               }
                workers[i].flag = RUNNING;
                ATOMIC_PTR_SET(&workers[i].cntxt, NULL);
                char name[16];
                snprintf(name, sizeof(name), "DFLOWworker%d", i);
-               if ((workers[i].id = THRcreate(DFLOWworker, (void *) 
&workers[i], MT_THR_JOINABLE, name)) == 0)
+               if ((workers[i].id = THRcreate(DFLOWworker, (void *) 
&workers[i], MT_THR_JOINABLE, name)) == 0) {
+                       GDKfree(workers[i].errbuf);
+                       workers[i].errbuf = NULL;
                        workers[i].flag = IDLE;
-               else
+               } else
                        created++;
        }
        MT_lock_unset(&dataflowLock);
@@ -831,9 +839,13 @@ runMALdataflow(Client cntxt, MalBlkPtr m
                        workers[i].flag = RUNNING;
                        char name[16];
                        snprintf(name, sizeof(name), "DFLOWworker%d", i);
-                       if ((workers[i].id = THRcreate(DFLOWworker, (void *) 
&workers[i], MT_THR_JOINABLE, name)) == 0) {
+                       if ((workers[i].errbuf = GDKmalloc(GDKMAXERRLEN)) == 
NULL ||
+                               (workers[i].id = THRcreate(DFLOWworker, (void 
*) &workers[i],
+                                                                               
   MT_THR_JOINABLE, name)) == 0) {
                                /* cannot start new thread, run serially */
                                *ret = TRUE;
+                               GDKfree(workers[i].errbuf);
+                               workers[i].errbuf = NULL;
                                workers[i].flag = IDLE;
                                MT_lock_unset(&dataflowLock);
                                return MAL_SUCCEED;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to