精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
调用路线
UDT::startup()->CUDT::startup()->CUDTUnited::startup()
1 int startup()
2 {
3 return CUDT::startup();
4 }
1 int CUDT::startup()
2 {
3 return s_UDTUnited.startup();
4 }
1 int CUDTUnited::startup()
2 {
3 // 开启一个临时锁,CGuard的运行机制就是在构造函数中启动等待锁信号,在析构中释放锁信号
4 // 因此在本函数过程中会受到锁的保护,函数运行结束,CGuard对象被释放,锁也就被释放
5 // 保证了当前函数的线程安全
6 CGuard gcinit(m_InitLock);
7
8 // 保证只被启动一次,注意使用后++是在判断后才+1,基础知识
9 if (m_iInstanceCount++ > 0)
10 return 0;
11
12 // Global initialization code
13 // win32的全局初始化
14 // 这里两个变量都是提供给WSAStartup的参数
15 // 第一个wVersionRequested是Windows Sockets API提供的调用方可使用的最高版本号。
16 // 低位字节(MAKEWORD第1个参数)指明主版本号,高位字节(MAKEWORD第2个参数)指出副版本(修正)号。
17 // 第二个wsaData是指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。这里没有做什么特殊处理。
18 // WSAStartup是winsock的初始化函数,对应的释放函数是WSACleanup
19 #ifdef WIN32
20 WORD wVersionRequested;
21 WSADATA wsaData;
22 wVersionRequested = MAKEWORD(2, 2);
23
24 if (0 != WSAStartup(wVersionRequested, &wsaData))
25 throw CUDTException(1, 0, WSAGetLastError());
26 #endif
27
28 //init CTimer::EventLock
29
30 // 如果垃圾收集已经启动,那么运行到这里就可以返回了
31 if (m_bGCStatus)
32 return true;
33
34 // 启动垃圾收集garbageCollect线程
35 m_bClosing = false;
36 #ifndef WIN32
37 pthread_mutex_init(&m_GCStopLock, NULL);
38 pthread_cond_init(&m_GCStopCond, NULL);
39 pthread_create(&m_GCThread, NULL, garbageCollect, this);
40 #else
41 m_GCStopLock = CreateMutex(NULL, false, NULL);
42 m_GCStopCond = CreateEvent(NULL, false, false, NULL);
43 DWORD ThreadID;
44 m_GCThread = CreateThread(NULL, 0, garbageCollect, this, 0, &ThreadID);
45 #endif
46
47 m_bGCStatus = true;
48
49 return 0;
50 }
调用路线
UDT::cleanup()->CUDT::cleanup()->CUDTUnited::cleanup()
1 int CUDTUnited::cleanup()
2 {
3 // 锁保护
4 CGuard gcinit(m_InitLock);
5
6 // 如果还有实例运行,则到此为止了
7 if (--m_iInstanceCount > 0)
8 return 0;
9
10 //destroy CTimer::EventLock
11 // 如果垃圾收集没有启动,则到此为止了
12 if (!m_bGCStatus)
13 return 0;
14
15 // 标注状态为关闭中
16 m_bClosing = true;
17
18 // pthread_cond_signal及SetEvent,立即释放一个解锁信号
19 // pthread_join及WaitForSingleObject,等待GC线程结束
20 // 清除相应的锁变量
21 #ifndef WIN32
22 pthread_cond_signal(&m_GCStopCond);
23 pthread_join(m_GCThread, NULL);
24 pthread_mutex_destroy(&m_GCStopLock);
25 pthread_cond_destroy(&m_GCStopCond);
26 #else
27 SetEvent(m_GCStopCond);
28 WaitForSingleObject(m_GCThread, INFINITE);
29 CloseHandle(m_GCThread);
30 CloseHandle(m_GCStopLock);
31 CloseHandle(m_GCStopCond);
32 #endif
33
34 // 标识垃圾收集未运行
35 m_bGCStatus = false;
36
37 // Global destruction code
38 // winsock的释放函数,与WSAStartup配对
39 #ifdef WIN32
40 WSACleanup();
41 #endif
42
43 return 0;
44 }