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 
io_cleanup(void)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 
ucln_io_registerCleanup(ECleanupIOType type,cleanupFunc * func)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