PatchSet 6776 
Date: 2005/08/02 09:52:11
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
Implemented thread safe wrappers for some target system calls

2005-08-02 Dalibor Topic  <[EMAIL PROTECTED]>

        * include/jsyscall.h:
        (KOPEN, KLSEEK, KCLOSE, KFSTAT) Documented.

        * libraries/clib/target/Linux/target_native_file.h
        (TARGET_NATIVE_FILE_OPEN, TARGET_NATIVE_FILE_CLOSE,
        TARGET_NATIVE_FILE_AVAILABLE, TARGET_NATIVE_FILE_SIZE,
        TARGET_NATIVE_FILE_TELL): New macros used to delegate
        system calls to thread-safe wrappers for system calls.

        Reported by:  Guilhem Lavaux <[EMAIL PROTECTED]>

Members: 
        ChangeLog:1.4301->1.4302 
        include/jsyscall.h:1.21->1.22 
        libraries/clib/target/Linux/target_native_file.h:1.1->1.2 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4301 kaffe/ChangeLog:1.4302
--- kaffe/ChangeLog:1.4301      Mon Aug  1 20:53:36 2005
+++ kaffe/ChangeLog     Tue Aug  2 09:52:11 2005
@@ -1,3 +1,16 @@
+2005-08-02 Dalibor Topic  <[EMAIL PROTECTED]>
+
+       * include/jsyscall.h:
+       (KOPEN, KLSEEK, KCLOSE, KFSTAT) Documented.
+
+       * libraries/clib/target/Linux/target_native_file.h
+       (TARGET_NATIVE_FILE_OPEN, TARGET_NATIVE_FILE_CLOSE,
+       TARGET_NATIVE_FILE_AVAILABLE, TARGET_NATIVE_FILE_SIZE,
+       TARGET_NATIVE_FILE_TELL): New macros used to delegate
+       system calls to thread-safe wrappers for system calls.
+
+       Reported by:  Guilhem Lavaux <[EMAIL PROTECTED]>
+
 2005-08-01  Guilhem Lavaux <[EMAIL PROTECTED]>
 
        * test/jni/Makefile.am: Fixed typo.
@@ -32,7 +45,7 @@
 
        * test/regression/Makefile.in: regenerated.
 
-2005-07-26 Dalibor Topic  <[EMAIL PROTECTED]>
+2005-07-30 Dalibor Topic  <[EMAIL PROTECTED]>
 
        Resynced with GNU Classpath.
 
Index: kaffe/include/jsyscall.h
diff -u kaffe/include/jsyscall.h:1.21 kaffe/include/jsyscall.h:1.22
--- kaffe/include/jsyscall.h:1.21       Tue May 31 17:55:49 2005
+++ kaffe/include/jsyscall.h    Tue Aug  2 09:52:14 2005
@@ -108,12 +108,56 @@
  * Define some convenience macros
  */
 
-#define        KOPEN(A,B,C,D)  (*Kaffe_SystemCallInterface._open)(A,B,C,D)
+/**
+ * Open a file in a platform-independant, thread-safe way, and
+ * set the filedescriptor to the opened file's descriptor.
+ *
+ * @param filename name of file to open.
+ * @param flags flags to pass to open
+ * @param permissions permissions with which the file is to be opened
+ * @param filedescriptor pointer to the filedescriptor to store the result in
+ * 
+ * @return 0 on success, or errno on failure.
+ */
+#define        KOPEN(filename, flags, permissions, filedescriptor)     \
+  (*Kaffe_SystemCallInterface._open)(filename, flags, permissions, 
filedescriptor)
+
 #define        KREAD(A,B,C,D)  (*Kaffe_SystemCallInterface._read)(A,B,C,D)
 #define        KWRITE(A,B,C,D) (*Kaffe_SystemCallInterface._write)(A,B,C,D)
-#define        KLSEEK(A,B,C,D) (*Kaffe_SystemCallInterface._lseek)(A,B,C,D)
-#define        KCLOSE(A)       (*Kaffe_SystemCallInterface._close)(A)
-#define        KFSTAT(A,B)     (*Kaffe_SystemCallInterface._fstat)(A,B)
+
+/**
+ * Reposition read/write offset in a file in a 
+ * platform-independant, thread-safe way.
+ *
+ * @param filedescriptor filedescriptor to stat
+ * @param offset offset to set
+ * @param whence how to set the offset
+ * @param new_offset new value of read/write offset
+ * 
+ * @return 0 on success, or errno on failure.
+ */
+#define        KLSEEK(filedescriptor, offset, whence, new_offset) \
+  (*Kaffe_SystemCallInterface._lseek)(filedescriptor, offset, whence, 
new_offset)
+
+/**
+ * Close a file in a platform-independant, thread-safe way.
+ *
+ * @param filedescriptor filedescriptor to close
+ * 
+ * @return 0 on success, or errno on failure.
+ */
+#define        KCLOSE(filedescriptor)  \
+  (*Kaffe_SystemCallInterface._close)(filedescriptor)
+
+/**
+ * FStat a file in a platform-independant, thread-safe way.
+ *
+ * @param filedescriptor filedescriptor to stat
+ * @param stats return buffer
+ * 
+ * @return 0 on success, or errno on failure.
+ */
+#define        KFSTAT(filedescriptor, stats)   
(*Kaffe_SystemCallInterface._fstat)(filedescriptor, stats)
 #define        KSTAT(A,B)      (*Kaffe_SystemCallInterface._stat)(A,B)
 #define KFTRUNCATE(A,B) (*Kaffe_SystemCallInterface._ftruncate)(A,B)
 #define KFSYNC(A)       (*Kaffe_SystemCallInterface._fsync)(A)
Index: kaffe/libraries/clib/target/Linux/target_native_file.h
diff -u kaffe/libraries/clib/target/Linux/target_native_file.h:1.1 
kaffe/libraries/clib/target/Linux/target_native_file.h:1.2
--- kaffe/libraries/clib/target/Linux/target_native_file.h:1.1  Tue Jul 19 
01:16:37 2005
+++ kaffe/libraries/clib/target/Linux/target_native_file.h      Tue Aug  2 
09:52:14 2005
@@ -49,6 +49,8 @@
 
 #include <stdlib.h>
 
+#include "jsyscall.h"
+
 /****************** Conditional compilation switches *******************/
 
 /***************************** Constants *******************************/
@@ -67,6 +69,175 @@
 
 #ifdef __cplusplus
 }
+#endif
+
+/***********************************************************************\
+* Name       : TARGET_NATIVE_FILE_OPEN
+* Purpose    : open a file
+* Input      : -
+* Output     : -
+* Return     : -
+* Side-effect: unknown
+* Notes      : file is created if it does not exist
+\***********************************************************************/
+
+#ifndef TARGET_NATIVE_FILE_OPEN
+  #include <sys/types.h>
+  #include <sys/stat.h>
+  #include <fcntl.h>
+  #define 
TARGET_NATIVE_FILE_OPEN(filename,filedescriptor,flags,permissions,result) \
+    do { \
+      int kopen_result; \
+      kopen_result=KOPEN(filename, \
+                        flags, \
+                        permissions, \
+                        &filedescriptor); \
+      if (kopen_result == 0) \
+        fcntl (filedescriptor,F_SETFD,FD_CLOEXEC); \
+      result=(kopen_result == 0)?TARGET_NATIVE_OK:TARGET_NATIVE_ERROR; \
+   } while (0)
+#endif
+
+/***********************************************************************\
+* Name       : TARGET_NATIVE_FILE_CLOSE
+* Purpose    : close a file
+* Input      : -
+* Output     : -
+* Return     : -
+* Side-effect: unknown
+* Notes      : -
+\***********************************************************************/
+
+#ifndef TARGET_NATIVE_FILE_CLOSE
+  #include <unistd.h>
+  #define TARGET_NATIVE_FILE_CLOSE(filedescriptor,result) \
+    do  { \
+      result=(KCLOSE(filedescriptor)==0)?TARGET_NATIVE_OK:TARGET_NATIVE_ERROR; 
\
+   } while (0)
+#endif
+
+/***********************************************************************\
+* Name       : TARGET_NATIVE_FILE_AVAILABLE
+* Purpose    : get available bytes for read
+* Input      : -
+* Output     : -
+* Return     : -
+* Side-effect: unknown
+* Notes      : -
+\***********************************************************************/
+
+#ifndef TARGET_NATIVE_FILE_AVAILABLE
+  #if defined(HAVE_FSTAT)
+    #include <sys/types.h>
+    #include <sys/stat.h>
+    #include <unistd.h>
+    #define TARGET_NATIVE_FILE_AVAILABLE(filedescriptor,length,result) \
+      do { \
+        struct stat __statBuffer; \
+        off_t       __n; \
+        \
+        length=0; \
+        \
+        if ((KFSTAT(filedescriptor,&__statBuffer)==0) && 
S_ISREG(__statBuffer.st_mode)) \
+        { \
+         int klseek_result; \
+          klseek_result=(KLSEEK(filedescriptor,0,SEEK_CUR, &__n));     \
+          if (klseek_result == 0) \
+          { \
+            
length=TARGET_NATIVE_MATH_INT_INT32_TO_INT64(__statBuffer.st_size-__n); \
+            result=TARGET_NATIVE_OK; \
+          } \
+          else \
+          { \
+            result=TARGET_NATIVE_ERROR; \
+          } \
+        } \
+        else \
+        { \
+          result=TARGET_NATIVE_ERROR; \
+        } \
+      } while (0)
+  #elif defined(HAVE_SELECT)
+    #include <string.h>
+    #include <sys/select.h>
+    #define TARGET_NATIVE_FILE_AVAILABLE(filedescriptor,length,result) \
+      do { \
+        fd_set         __filedescriptset; \
+        struct timeval __timeval; \
+       int kselect_result; \
+       int num_available; \
+        \
+        length=0; \
+        \
+        FD_ZERO(&__filedescriptset); \
+        FD_SET(filedescriptor,&__filedescriptset); \
+        memset(&__timeval,0,sizeof(__timeval)); \
+       kselect_result = 
KSELECT(filedescriptor+1,&__filedescriptset,NULL,NULL,&__timeval, 
&num_available); \
+       if (kselect_result == 0) \
+       { \
+         switch (num_available) \
+         { \
+            case  0: length=TARGET_NATIVE_MATH_INT_INT64_CONST_0; 
result=TARGET_NATIVE_OK; break; \
+            default: length=TARGET_NATIVE_MATH_INT_INT64_CONST_1; 
result=TARGET_NATIVE_OK; break; \
+          } \
+       } \
+       else \
+       { \
+         result=TARGET_NATIVE_ERROR; break; \
+       } \
+      } while (0)
+  #else
+    #define TARGET_NATIVE_FILE_AVAILABLE(filedescriptor,length,result) \
+      do { \
+        errno=TARGET_NATIVE_ERROR_OPERATION_NOT_PERMITTED; \
+        length=0; \
+        result=TARGET_NATIVE_ERROR; \
+      } while (0)
+  #endif
+#endif
+
+/***********************************************************************\
+* Name       : TARGET_NATIVE_FILE_SIZE
+* Purpose    : get size of file (in bytes)
+* Input      : -
+* Output     : -
+* Return     : -
+* Side-effect: unknown
+* Notes      : -
+\***********************************************************************/
+
+#ifndef TARGET_NATIVE_FILE_SIZE
+  #include <sys/types.h>
+  #include <sys/stat.h>
+  #include <unistd.h>
+  #define TARGET_NATIVE_FILE_SIZE(filedescriptor,length,result) \
+    do { \
+      struct stat __statBuffer; \
+      \
+      
result=(KFSTAT(filedescriptor,&__statBuffer)==0)?TARGET_NATIVE_OK:TARGET_NATIVE_ERROR;
 \
+      length=TARGET_NATIVE_MATH_INT_INT32_TO_INT64(__statBuffer.st_size); \
+    } while (0)
+#endif
+
+/***********************************************************************\
+* Name       : TARGET_NATIVE_FILE_TELL
+* Purpose    : get current file position
+* Input      : -
+* Output     : -
+* Return     : -
+* Side-effect: unknown
+* Notes      : -
+\***********************************************************************/
+
+#ifndef TARGET_NATIVE_FILE_TELL
+  #include <sys/types.h>
+  #include <unistd.h>
+  #define TARGET_NATIVE_FILE_TELL(filedescriptor,offset,result) \
+    do { \
+      int klseek_result; \
+      
klseek_result=KLSEEK(filedescriptor,TARGET_NATIVE_MATH_INT_INT64_CONST_0,SEEK_CUR,
 &offset); \
+      result=(klseek_result==0)?TARGET_NATIVE_OK:TARGET_NATIVE_ERROR; \
+    } while (0)
 #endif
 
 /* include rest of definitions from generic file (do not move it to 

_______________________________________________
kaffe mailing list
[email protected]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to