[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pthreads-devel
Subject:    [pthreads-devel] lost patch: errno shield ?
From:       Arend-jan Wytzes <ajwytzes () wise-guys ! nl>
Date:       2002-06-07 10:51:30
[Download RAW message or body]

Dear developers,

Back in December, I posted a patch to this mailinglist concerning the handeling
of errno. This patch consisted of two changes: the introduction of an errno 
per nativive and a replacement for the macro 'errno_shield'.

The errno per native was accepted and applied, but the errno_shield was not.
However, I still believe that the current (1.2.2) errno_shield macro is faulty,
because it uses a global variable for temporary storage. 
I tested the current stable (1.2.2) with the test program that was supplied 
with the patches in December, and it seems to confirm this on an SMP machine.

I hereby resent the errno_shield patch that should apply cleanly to 1.2.2-5.
If I'm wrong about this macro, please explain why =)

Regards,
aj

["patch-errno-shield.diff" (text/plain)]

diff -r -u ngpt-1.2.2/pth_debug.c ngpt-1.2.2-6/pth_debug.c
--- ngpt-1.2.2/pth_debug.c	Mon Dec 17 15:29:24 2001
+++ ngpt-1.2.2-6/pth_debug.c	Wed Jun  5 13:12:48 2002
@@ -63,7 +63,7 @@
     char *debug_file_path = NULL;
     size_t n;
 
-    errno_shield {
+    errno_shield (
 	pid_t tid = gettid();
 	_pth_acquire_lock(&debug_lock, tid);
         va_start(ap, fmt);
@@ -92,7 +92,7 @@
 	/* now do the write... */
 	pth_sc(write)(debug_fd, str, n);
 	_pth_release_lock(&debug_lock, tid);
-    }
+    )
     return;
 }
 
diff -r -u ngpt-1.2.2/pth_errno.c ngpt-1.2.2-6/pth_errno.c
--- ngpt-1.2.2/pth_errno.c	Sat Jan 19 15:17:20 2002
+++ ngpt-1.2.2-6/pth_errno.c	Wed Jun  5 13:11:50 2002
@@ -31,12 +31,12 @@
 #if cpp
 
 /* enclose errno in a block */
-#define errno_shield \
-        for ( pth_errno_storage = errno, \
-              pth_errno_flag = TRUE; \
-              pth_errno_flag; \
-              errno = pth_errno_storage, \
-              pth_errno_flag = FALSE )
+#define errno_shield(___x) \
+    { \
+        int __saved_errno = errno; \
+        ___x \
+        errno = __saved_errno; \
+    }
 
 /* return plus setting an errno value */
 #if defined(PTH_DEBUG)
@@ -58,5 +58,5 @@
 #endif /* cpp */
 
 intern int pth_errno_storage = 0;
-intern int pth_errno_flag    = 0;
+/* intern int pth_errno_flag    = 0; */
 
diff -r -u ngpt-1.2.2/pth_high.c ngpt-1.2.2-6/pth_high.c
--- ngpt-1.2.2/pth_high.c	Wed Jun  5 13:17:09 2002
+++ ngpt-1.2.2-6/pth_high.c	Wed Jun  5 13:13:50 2002
@@ -481,7 +481,7 @@
         ;
 
     /* restore filedescriptor mode */
-    errno_shield { pth_fdmode(s, fdmode); }
+    errno_shield ( pth_fdmode(s, fdmode); )
 
     /* when it is still on progress wait until socket is really writeable */
     if (rv == -1 && errno == EINPROGRESS) {
@@ -550,11 +550,11 @@
     }
 
     /* restore filedescriptor mode */
-    errno_shield {
+    errno_shield (
         pth_fdmode(s, fdmode);
         if (rv != -1)
             pth_fdmode(rv, fdmode);
-    }
+    )
 
     pth_debug2("pth_accept_ev: leave to thread \"%s\"", CURRENT_NAME());
     return rv;
@@ -662,7 +662,7 @@
     if (fdmode != PTH_FDMODE_NONBLOCK && rv == -1 && errno == EAGAIN) {
 
 	/* restore filedescriptor mode */
-	errno_shield { pth_fdmode(fd, fdmode); }
+	errno_shield ( pth_fdmode(fd, fdmode); )
 
         /* now directly poll filedescriptor for writeability
            to avoid unneccessary (and resource consuming because of context
@@ -717,7 +717,7 @@
         }
     } else
 	/* restore filedescriptor mode */
-	errno_shield { pth_fdmode(fd, fdmode); }
+	errno_shield ( pth_fdmode(fd, fdmode); )
 
     pth_debug3("pth_write_ev: leave to thread \"%s\" returns %d", CURRENT_NAME(), rv);
     return rv;
@@ -909,7 +909,7 @@
     if (fdmode != PTH_FDMODE_NONBLOCK && rv == -1 && errno == EAGAIN) {
 
 	/* restore filedescriptor mode */
-	errno_shield { pth_fdmode(fd, fdmode); }
+	errno_shield ( pth_fdmode(fd, fdmode); )
 
         /* init return value and number of bytes to write */
         rv      = 0;
@@ -977,7 +977,7 @@
         }
     } else
 	/* restore filedescriptor mode */
-	errno_shield { pth_fdmode(fd, fdmode); }
+	errno_shield ( pth_fdmode(fd, fdmode); )
 
     pth_debug2("pth_writev_ev: leave to thread \"%s\"", CURRENT_NAME());
     return rv;
@@ -1103,7 +1103,7 @@
     rc = pth_read(fd, buf, nbytes);
 
     /* restore the old offset situation */
-    errno_shield { lseek(fd, old_offset, SEEK_SET); }
+    errno_shield ( lseek(fd, old_offset, SEEK_SET); )
 
     /* unprotect and return result of read */
     pth_mutex_release(&mutex);
@@ -1136,7 +1136,7 @@
     rc = pth_write(fd, buf, nbytes);
 
     /* restore the old offset situation */
-    errno_shield { lseek(fd, old_offset, SEEK_SET); }
+    errno_shield ( lseek(fd, old_offset, SEEK_SET); )
 
     /* unprotect and return result of write */
     pth_mutex_release(&mutex);
@@ -1169,7 +1169,7 @@
     rc = pth_read(fd, buf, nbytes);
 
     /* restore the old offset situation */
-    errno_shield { lseek64(fd, old_offset, SEEK_SET); }
+    errno_shield ( lseek64(fd, old_offset, SEEK_SET); )
 
     /* unprotect and return result of read */
     pth_mutex_release(&mutex);
@@ -1202,7 +1202,7 @@
     rc = pth_write(fd, buf, nbytes);
 
     /* restore the old offset situation */
-    errno_shield { lseek64(fd, old_offset, SEEK_SET); }
+    errno_shield ( lseek64(fd, old_offset, SEEK_SET); )
 
     /* unprotect and return result of write */
     pth_mutex_release(&mutex);
diff -r -u ngpt-1.2.2/pth_lib.c ngpt-1.2.2-6/pth_lib.c
--- ngpt-1.2.2/pth_lib.c	Wed Jun  5 13:17:09 2002
+++ ngpt-1.2.2-6/pth_lib.c	Wed Jun  5 13:14:09 2002
@@ -54,12 +54,12 @@
 intern void *pth_malloc(size_t sz)
 {
     void *memptr = NULL;
-    errno_shield {
+    errno_shield (
 	memptr = mmap(NULL, sz,
 		  PROT_READ | PROT_WRITE | PROT_EXEC,
 		  MAP_PRIVATE | MAP_ANONYMOUS,
 		  -1, 0);
-    }
+    )
     if (memptr == MAP_FAILED) 
 	return NULL;
 
@@ -77,7 +77,7 @@
 /* special version of free that do munmap instead... */
 intern void pth_free_mem(void *memptr, size_t sz)
 {
-    errno_shield { munmap(memptr, sz); }
+    errno_shield ( munmap(memptr, sz); )
 }
 
 
diff -r -u ngpt-1.2.2/pth_tcb.c ngpt-1.2.2-6/pth_tcb.c
--- ngpt-1.2.2/pth_tcb.c	Wed Jun  5 13:17:06 2002
+++ ngpt-1.2.2-6/pth_tcb.c	Wed Jun  5 13:14:41 2002
@@ -165,12 +165,12 @@
      * that doesn't require it, we waste 8 bytes.
      */
     
-    errno_shield {
+    errno_shield (
 	t = mmap(NULL, sizeof(struct pth_st)+8,
 	     PROT_READ | PROT_WRITE | PROT_EXEC,
 	     MAP_PRIVATE | MAP_ANONYMOUS,
 	     -1, 0);
-    }
+    )
     if (t == MAP_FAILED)
 	return(NULL);
 
@@ -205,14 +205,14 @@
 			 ? npages * pagesize				/*ibm*/
 			 : (++npages) * pagesize;			/*ibm*/
 #endif
-	    errno_shield {
+	    errno_shield (
 		stack = mmap(NULL, (t->stacksize+8),
 			    PROT_READ | PROT_WRITE | PROT_EXEC,
 			    MAP_PRIVATE | MAP_ANONYMOUS,
 			    -1, 0);
-	    }
+	    )
 	    if (stack == MAP_FAILED) {
-		errno_shield { munmap(t, sizeof(struct pth_st)+8); }
+		errno_shield ( munmap(t, sizeof(struct pth_st)+8); )
 		return(NULL);
 	    }
 
@@ -270,7 +270,7 @@
 
     /* Cleanup the stack. (can't unmap the stack for current running thread) */
     if (t->true_stack != NULL && !t->stackloan && t != descr->current)
-        errno_shield { munmap(t->true_stack, t->stacksize+8); }
+        errno_shield ( munmap(t->true_stack, t->stacksize+8); )
 
     /* Run the specific data destructors */
     if (t->data_value != NULL)
@@ -323,7 +323,7 @@
 	t = (pth_t)((char *)((char *)t - 8));
     /*ibm end*/
 
-    errno_shield { munmap(t, sizeof(struct pth_st)+8); }
+    errno_shield ( munmap(t, sizeof(struct pth_st)+8); )
     return;
 }
 

_______________________________________________
pthreads-devel mailing list
pthreads-devel@www-124.ibm.com
http://www-124.ibm.com/developerworks/oss/mailman/listinfo/pthreads-devel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic