Home | History | Annotate | Download | only in io
      1 /*
      2 ******************************************************************************
      3 *                                                                            *
      4 * Copyright (C) 2001-2014, International Business Machines                   *
      5 *                Corporation and others. All Rights Reserved.                *
      6 *                                                                            *
      7 ******************************************************************************
      8 *   file name:  ucln_io.cpp
      9 *   encoding:   US-ASCII
     10 *   tab size:   8 (not used)
     11 *   indentation:4
     12 *
     13 *   created on: 2006August11
     14 *   created by: George Rhoten
     15 */
     16 
     17 #include "mutex.h"
     18 #include "ucln.h"
     19 #include "ucln_io.h"
     20 #include "uassert.h"
     21 
     22 #ifndef U_IO_IMPLEMENTATION
     23 #error U_IO_IMPLEMENTATION not set - must be set for all ICU source files in io/ - see http://userguide.icu-project.org/howtouseicu
     24 #endif
     25 
     26 
     27 /**  Auto-client */
     28 #define UCLN_TYPE UCLN_IO
     29 #include "ucln_imp.h"
     30 
     31 /* Leave this copyright notice here! It needs to go somewhere in this library. */
     32 static const char copyright[] = U_COPYRIGHT_STRING;
     33 
     34 static cleanupFunc *gCleanupFunctions[UCLN_IO_COUNT];
     35 
     36 static UBool io_cleanup(void)
     37 {
     38     int32_t libType = UCLN_IO_START;
     39 
     40     (void)copyright;  // Suppress unused variable warning.
     41     while (++libType<UCLN_IO_COUNT) {
     42         if (gCleanupFunctions[libType])
     43         {
     44             gCleanupFunctions[libType]();
     45             gCleanupFunctions[libType] = NULL;
     46         }
     47     }
     48 #if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
     49     ucln_unRegisterAutomaticCleanup();
     50 #endif
     51     return TRUE;
     52 }
     53 
     54 void ucln_io_registerCleanup(ECleanupIOType type,
     55                                cleanupFunc *func) {
     56     U_ASSERT(UCLN_IO_START < type && type < UCLN_IO_COUNT);
     57     {
     58         icu::Mutex m;       // See ticket 10295 for discussion.
     59         ucln_registerCleanup(UCLN_IO, io_cleanup);
     60         if (UCLN_IO_START < type && type < UCLN_IO_COUNT) {
     61             gCleanupFunctions[type] = func;
     62         }
     63     }
     64 
     65 #if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
     66     ucln_registerAutomaticCleanup();
     67 #endif
     68 }
     69 
     70