Multiplayer platform
Revision | 21a7c5eaab85472fcc877aa09a0487096266eb13 (tree) |
---|---|
Time | 2008-12-06 05:44:18 |
Author | at0fk |
Commiter | at0fk |
Faking FreeLibrary().
@@ -606,6 +606,7 @@ | ||
606 | 606 | char vesselID; |
607 | 607 | |
608 | 608 | bool loaderLock; |
609 | + bool shutdown; | |
609 | 610 | } |
610 | 611 | dinfo; |
611 | 612 |
@@ -698,6 +699,7 @@ | ||
698 | 699 | } |
699 | 700 | } |
700 | 701 | } |
702 | + FreeLibrary(g_hInst); //Decrements reference counter in order to allow release of native DLL | |
701 | 703 | } |
702 | 704 | |
703 | 705 | void Launcher::Start() |
@@ -2095,12 +2097,16 @@ | ||
2095 | 2097 | switch(fdwReason) |
2096 | 2098 | { |
2097 | 2099 | case DLL_PROCESS_ATTACH: |
2100 | + dinfo.shutdown=false; | |
2098 | 2101 | dinfo.loaderLock=true; |
2099 | 2102 | InitModule(hinstDLL); |
2100 | - dinfo.loaderLock=false; | |
2103 | + dinfo.loaderLock=false; | |
2101 | 2104 | break; |
2102 | 2105 | case DLL_PROCESS_DETACH: |
2103 | - ExitModule(hinstDLL); | |
2106 | + dinfo.shutdown=true; | |
2107 | + dinfo.loaderLock=true; | |
2108 | + ExitModule(hinstDLL); | |
2109 | + dinfo.loaderLock=false; | |
2104 | 2110 | break; |
2105 | 2111 | } |
2106 | 2112 | return TRUE; |
@@ -89,42 +89,56 @@ | ||
89 | 89 | private void sntpLogger(object sender, EventThrowAppenderEventArgs e) |
90 | 90 | { |
91 | 91 | IntPtr text = Marshal.StringToHGlobalAnsi(e.Message); |
92 | - logger(4, text); | |
92 | + try | |
93 | + { | |
94 | + logger(4, text); | |
95 | + } | |
96 | + catch (AccessViolationException ex) | |
97 | + { | |
98 | + Stop(); | |
99 | + } | |
93 | 100 | Marshal.FreeHGlobal(text); |
94 | 101 | } |
95 | 102 | |
96 | 103 | private void ntpClient_Progress(object sender, NTPClientProgressEventArgs e) |
97 | 104 | { |
98 | - switch (e.Kind) | |
105 | + try | |
99 | 106 | { |
100 | - case NTPClientProgressKind.Pinging: | |
101 | - if (Marshal.ReadInt32(clockVisibility)!=0) Marshal.WriteByte(clockPulseVisibility, 1); | |
102 | - blocked = false; | |
103 | - break; | |
104 | - case NTPClientProgressKind.Blocked: | |
105 | - if (Marshal.ReadInt32(clockVisibility) != 0) Marshal.WriteInt32(clockVisibility, 2); | |
106 | - blocked = true; | |
107 | - break; | |
108 | - case NTPClientProgressKind.Pinged: | |
109 | - if (blocked) Marshal.WriteInt32(clockVisibility, 1); | |
110 | - break; | |
111 | - case NTPClientProgressKind.Failed: | |
112 | - Marshal.WriteInt32(clockVisibility, 0); | |
113 | - break; | |
114 | - case NTPClientProgressKind.Idle: | |
115 | - if (Marshal.ReadInt32(clockVisibility) == 2) Marshal.WriteInt32(clockVisibility, 1); | |
116 | - if (Marshal.ReadInt32(clockVisibility) == 0) Marshal.WriteInt32(clockVisibility, 2); | |
117 | - Marshal.WriteByte(clockPulseVisibility, 0); | |
118 | - break; | |
119 | - case NTPClientProgressKind.Offline: | |
120 | - Marshal.WriteInt32(clockVisibility, 0); | |
121 | - Marshal.WriteByte(clockPulseVisibility, 0); | |
122 | - break; | |
123 | - case NTPClientProgressKind.Synced: | |
124 | - Marshal.WriteInt32(synchronizationMinimum, (int)(ntpClient.SkewMinimum * 1E6)); | |
125 | - Marshal.WriteInt32(synchronizationMaximum, (int)(ntpClient.SkewMaximum * 1E6)); | |
126 | - Marshal.WriteInt32(synchronizationAverage, (int)(ntpClient.Skew * 1E6)); | |
127 | - break; | |
107 | + switch (e.Kind) | |
108 | + { | |
109 | + case NTPClientProgressKind.Pinging: | |
110 | + if (Marshal.ReadInt32(clockVisibility) != 0) Marshal.WriteByte(clockPulseVisibility, 1); | |
111 | + blocked = false; | |
112 | + break; | |
113 | + case NTPClientProgressKind.Blocked: | |
114 | + if (Marshal.ReadInt32(clockVisibility) != 0) Marshal.WriteInt32(clockVisibility, 2); | |
115 | + blocked = true; | |
116 | + break; | |
117 | + case NTPClientProgressKind.Pinged: | |
118 | + if (blocked) Marshal.WriteInt32(clockVisibility, 1); | |
119 | + break; | |
120 | + case NTPClientProgressKind.Failed: | |
121 | + Marshal.WriteInt32(clockVisibility, 0); | |
122 | + break; | |
123 | + case NTPClientProgressKind.Idle: | |
124 | + if (Marshal.ReadInt32(clockVisibility) == 2) Marshal.WriteInt32(clockVisibility, 1); | |
125 | + if (Marshal.ReadInt32(clockVisibility) == 0) Marshal.WriteInt32(clockVisibility, 2); | |
126 | + Marshal.WriteByte(clockPulseVisibility, 0); | |
127 | + break; | |
128 | + case NTPClientProgressKind.Offline: | |
129 | + Marshal.WriteInt32(clockVisibility, 0); | |
130 | + Marshal.WriteByte(clockPulseVisibility, 0); | |
131 | + break; | |
132 | + case NTPClientProgressKind.Synced: | |
133 | + Marshal.WriteInt32(synchronizationMinimum, (int) (ntpClient.SkewMinimum*1E6)); | |
134 | + Marshal.WriteInt32(synchronizationMaximum, (int) (ntpClient.SkewMaximum*1E6)); | |
135 | + Marshal.WriteInt32(synchronizationAverage, (int) (ntpClient.Skew*1E6)); | |
136 | + break; | |
137 | + } | |
138 | + } | |
139 | + catch (AccessViolationException ex) | |
140 | + { | |
141 | + Stop(); | |
128 | 142 | } |
129 | 143 | } |
130 | 144 | /// <summary> |
@@ -313,6 +313,7 @@ | ||
313 | 313 | } |
314 | 314 | } |
315 | 315 | } |
316 | + else synchronizing = false; | |
316 | 317 | } |
317 | 318 | |
318 | 319 | /// <summary> |