]> granicus.if.org Git - php/commitdiff
- Improve the file handle closing code
authorZeev Suraski <zeev@php.net>
Fri, 26 Nov 1999 23:45:22 +0000 (23:45 +0000)
committerZeev Suraski <zeev@php.net>
Fri, 26 Nov 1999 23:45:22 +0000 (23:45 +0000)
Zend/zend-scanner.l
Zend/zend_compile.c
Zend/zend_compile.h

index 9cbe91ecaeeb60e4b71a4bc222c43f934ad954ec..b8ed223936ed1d257151799c8f9d02193174f5be 100644 (file)
@@ -183,23 +183,47 @@ inline void restore_lexical_state(zend_lex_state *lex_state CLS_DC)
 BEGIN_EXTERN_C()
 
 
-ZEND_API void zend_open_file_dtor(void *f)
+ZEND_API void zend_open_file_dtor(zend_file_handle *fh)
 {
+       switch (fh->type) {
+               case ZEND_HANDLE_FP:
+                       fclose(fh->handle.fp);
+                       break;
 #ifdef ZTS
-       delete *((ifstream **) f);
-#else
-       fclose(*((FILE **) f));
+               case ZEND_HANDLE_FSTREAM:
+                       delete ((ifstream *) fh->handle.is);
+                       break;
+               case ZEND_HANDLE_STDIOSTREAM:
+                       delete ((istdiostream *) fh->handle.is);
+                       break;
 #endif
+       }
 }
 
 
-ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC)
+int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2)
 {
+       if (fh1->type != fh2->type) {
+               return 0;
+       }
+       switch (fh1->type) {
+               case ZEND_HANDLE_FP:
+                       return fh1->handle.fp==fh2->handle.fp;
+                       break;
 #ifdef ZTS
-       zend_llist_del_element(&CG(open_files), &file_handle->handle.is);
-#else
-       zend_llist_del_element(&CG(open_files), &file_handle->handle.fp);
+               case ZEND_HANDLE_FSTREAM:
+               case ZEND_HANDLE_STDIOSTREAM:
+                       return fh1->handle.is==fh2->handle.is;
+                       break;
+       }
 #endif
+       return 0;
+}
+
+
+ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC)
+{
+       zend_llist_del_element(&CG(open_files), file_handle, (int (*)(void *, void *)) zend_compare_file_handles);
 }
 
 
@@ -221,7 +245,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC)
                return FAILURE;
        }
        if (file_handle->handle.fp != stdin) {
-               zend_llist_add_element(&CG(open_files), &file_handle->handle.fp);
+               zend_llist_add_element(&CG(open_files), file_handle);
        }
        file_handle->type = ZEND_HANDLE_FP;     
        /* Reset the scanner for scanning the new file */
@@ -232,6 +256,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC)
        switch (file_handle->type) {
                case ZEND_HANDLE_FD:
                        file_handle->handle.is = new ifstream(file_handle->handle.fd);
+                       file_handle->type = ZEND_HANDLE_FSTREAM;
                        break;
                case ZEND_HANDLE_FILENAME:
                        {
@@ -240,6 +265,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC)
                                        return FAILURE;
                                }
                                file_handle->handle.is = new istdiostream(file_handle->handle.fp);
+                               file_handle->type = ZEND_HANDLE_STDIOSTREAM;
                                break;
                        }
                case ZEND_HANDLE_FP:
@@ -250,6 +276,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC)
                                        return FAILURE;
                                }
                                file_handle->handle.is = new istdiostream(file_handle->handle.fp);
+                               file_handle->type = ZEND_HANDLE_STDIOSTREAM;
                        }       
                        break;
        }
@@ -258,9 +285,8 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC)
                return FAILURE;
        }
        if (file_handle->handle.is != &cin) {
-               zend_llist_add_element(&CG(open_files), &file_handle->handle.is);
+               zend_llist_add_element(&CG(open_files), file_handle);
        }
-       file_handle->type = ZEND_HANDLE_ISTREAM;
 
        CG(ZFL) = new ZendFlexLexer;
        CG(ZFL)->switch_streams(file_handle->handle.is, &cout);
index f33593619e5889ef66d6c921b26dde4004c92698..59cc8d402bcaef35b4cf4c0cb1e0d8d82ab170ac 100644 (file)
@@ -94,7 +94,7 @@ void init_compiler(CLS_D ELS_DC)
        zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_request_startup);
        init_resource_list(ELS_C);
        CG(unclean_shutdown) = 0;
-       zend_llist_init(&CG(open_files), sizeof(void *), zend_open_file_dtor, 0);
+       zend_llist_init(&CG(open_files), sizeof(zend_file_handle), zend_open_file_dtor, 0);
 }
 
 
index f9b11e5525c37b198326551141b0a64540bdd5dd..1d96cf9559e37513aa8c3aaa290bcd7700f4264f 100644 (file)
@@ -354,7 +354,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC);
 ZEND_API void init_op_array(zend_op_array *op_array, int initial_ops_size);
 ZEND_API void destroy_op_array(zend_op_array *op_array);
 ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC);
-ZEND_API void zend_open_file_dtor(void *f);
+ZEND_API void zend_open_file_dtor(zend_file_handle *fh);
 END_EXTERN_C()
 
 ZEND_API int destroy_zend_function(zend_function *function);
@@ -543,10 +543,11 @@ int zendlex(znode *zendlval CLS_DC);
 #define ZEND_RT (1<<1)
 
 
-#define ZEND_HANDLE_FILENAME   0
-#define ZEND_HANDLE_FD                 1
-#define ZEND_HANDLE_FP                 2
-#define ZEND_HANDLE_ISTREAM            3
+#define ZEND_HANDLE_FILENAME           0
+#define ZEND_HANDLE_FD                         1
+#define ZEND_HANDLE_FP                         2
+#define ZEND_HANDLE_STDIOSTREAM                3
+#define ZEND_HANDLE_FSTREAM                    4
 
 #define ZEND_DECLARE_CLASS                             1
 #define ZEND_DECLARE_FUNCTION                  2