|
Странность
|
|||
---|---|---|---|
#18+
к базе fb3 то подключается, то выдаёт: ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 09:13 |
|
Странность
|
|||
---|---|---|---|
#18+
win7 x64, установлен FB 2.5.3 32-bit, IBExpert сегодняшний (просто распакован ibe_sfx, без настройки UDB, чтобы не влияло), в "D:\Firebird\3.0.0.31349" распакован 32-битный снапшот тройки (с "gsec -user sysdba -pass 1 -add sysdba -pw masterkey"). Дальше регистрирую две базы: ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 09:25 |
|
Странность
|
|||
---|---|---|---|
#18+
Дальше выхожу из эксперта, запускаю заново. Вхожу в Test25, вхожу в Test30, получаю сабж. Дальше выхожу из эксперта, запускаю заново. Вхожу в Test30, вхожу в Test25, все Ok. Ну и бонусом, после отключения от Test30 эксперт через минуту падает. Это я уже описывал не один раз. Нужно позвать fb_shutdown перед последней FreeLibrary для конкретной либы тройки (и для 2.5.3). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 09:33 |
|
Странность
|
|||
---|---|---|---|
#18+
IBExpert, fb_shutdown вызывать нужно. Остальное это уже не к Expert. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 15:51 |
|
Странность
|
|||
---|---|---|---|
#18+
Симонов Денисfb_shutdown вызывать нужно Что-то я пока никак не пойму, почему ее приложение должно вызывать, а не сама клиентская dll перед выгрузкой из адресного пространства процесса приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 18:19 |
|
Странность
|
|||
---|---|---|---|
#18+
IBExpertСимонов Денисfb_shutdown вызывать нужно Что-то я пока никак не пойму, почему ее приложение должно вызывать, а не сама клиентская dll перед выгрузкой из адресного пространства процесса приложения. http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary) during process termination, because this can result in a DLL being used after the system has executed its termination code. Because Kernel32.dll is guaranteed to be loaded in the process address space when the entry-point function is called, calling functions in Kernel32.dll does not result in the DLL being used before its initialization code has been executed. Therefore, the entry-point function can call functions in Kernel32.dll that do not load other DLLs. For example, DllMain can create synchronization objects such as critical sections and mutexes, and use TLS. Unfortunately, there is not a comprehensive list of safe functions in Kernel32.dll. Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components. Conversely, calling functions such as these during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized. Because DLL notifications are serialized, entry-point functions should not attempt to communicate with other threads or processes. Deadlocks may occur as a result. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 18:34 |
|
Странность
|
|||
---|---|---|---|
#18+
Это все зашибись, но мне от этого не легче. Если юзер использует одну и ту же клиентскую либу одновременно для коннекта к удаленному серверу и как embedded - когда вызывать fb_shutdown? Допустим, первым закрывается embedded коннект... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 19:39 |
|
Странность
|
|||
---|---|---|---|
#18+
Я вот такую штуку для работы с библиотеками написал, потокобезопасную, и с вызовом fb_shutdown когда нужно: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 19:46 |
|
Странность
|
|||
---|---|---|---|
#18+
IBExpertЭто все зашибись, но мне от этого не легче. Если юзер использует одну и ту же клиентскую либу одновременно для коннекта к удаленному серверу и как embedded - когда вызывать fb_shutdown? Как положено, перед последним FreeLibrary для этой библиотеки :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 19:48 |
|
Странность
|
|||
---|---|---|---|
#18+
NickDeeКак положено, перед последним FreeLibrary для этой библиотеки :) Положено вот так: it should never be called by a client in the context of a remote attachment. Короче, где-нибудь в документации описано, когда надо, а когда не надо (нельзя) ее вызывать? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 20:13 |
|
Странность
|
|||
---|---|---|---|
#18+
IBExpertКороче, где-нибудь в документации описано, когда надо, а когда не надо (нельзя) ее вызывать? Это подойдёт? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 20:20 |
|
Странность
|
|||
---|---|---|---|
#18+
NickDeeЭто подойдёт? Те же яйца, вид сбоку... В общем случае приложение не может знать, что вот этот конкретный вызов FreeLibrary - он последний и надо сначала дергать fb_shutdown. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2014, 21:06 |
|
Странность
|
|||
---|---|---|---|
#18+
IBExpertВ общем случае приложение не может знать, что вот этот конкретный вызов FreeLibrary - он последний и надо сначала дергать fb_shutdown. Если не умеет считать ссылки, то не может. По-хорошему нужно чтобы подсчётом сама dll занималась, тогда можно свободно вызывать fb_shutdown перед каждым FreeLibrary. А dll пусть сама решает на каком fb_shutdown сделать shutdown. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2014, 08:23 |
|
Странность
|
|||
---|---|---|---|
#18+
NickDeeЕсли не умеет считать ссылки, то не может. Если ту же самую либу самостоятельно грузит сторонний плагин, то и самопальный подсчет ссылок в хост-приложении не спасет от возможных сюрпризов. NickDeeПо-хорошему нужно чтобы подсчётом сама dll занималась, тогда можно свободно вызывать fb_shutdown перед каждым FreeLibrary. А dll пусть сама решает на каком fb_shutdown сделать shutdown. Вот именно. Уж счетчик-то дергать в DllMain ничто не мешает. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2014, 10:07 |
|
Странность
|
|||
---|---|---|---|
#18+
NickDeeЯ вот такую штуку для работы с библиотеками написал, потокобезопасную, и с вызовом fb_shutdown когда нужно: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154.
Таки нужно раскомментировать Код: pascal 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2014, 16:34 |
|
Странность
|
|||
---|---|---|---|
#18+
В DllMain уже поздно делать шатдаун ибо ОСь уже убила все потоки, кроме текущего и никакая синхронизация просто не работает. Т.е. движок понятия не имеет, что его вспомагательные потоки уже прибиты, и пытается честно подождать их завершения, поэтому всё вешается навсегда. Если при этом есть незакрытые коннекты, то их кеш не будет сброшен, со всеми вытекающими последствиями. Даже если движок обнаружит факт убиения своих потоков и не будет ждать их завершения (чтобы не вешаться), он всё равно не сможет корректно завершить свою работу, ибо объекты синхронизации, занятые убитыми потоками, не могут быть освобождены. Т.е. всё, что можно корректно сделать в DllMain при завершении процесса - это не делать ничего... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2014, 10:36 |
|
Странность
|
|||
---|---|---|---|
#18+
hvladВ DllMain уже поздно делать шатдаун Речь уже не о шатдауне в DllMain. Речь о том, чтобы в DllMain увеличивать некий внутренний счетчик на DLL_PROCESS_ATTACH и, соответственно, уменьшать его на DLL_PROCESS_DETACH. Тогда при вызове fb_shutdown и значении счетчика = 1 можно спокойно освобождать все, что там нужно освобождать, а пользователю надо будет вызывать fb_shutdown всегда перед FreeLibrary, не занимаясь самодеятельностью в виде подсчета вызовов LoadLibrary/FreeLibrary. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2014, 11:10 |
|
Странность
|
|||
---|---|---|---|
#18+
IBExpertРечь уже не о шатдауне в DllMainЯ должен был объяснить, почему мы сами не можем сделать шатдаун из DllMain. IBExpertРечь о том, чтобы в DllMain увеличивать некий внутренний счетчик на DLL_PROCESS_ATTACH и, соответственно, уменьшать его на DLL_PROCESS_DETACH. Тогда при вызове fb_shutdown и значении счетчика = 1 можно спокойно освобождать все, что там нужно освобождатьИдея не плохая. На первый взгляд. А вот на второй... это тоже не будет работать: а) ты сам приводил пример с плагином, который тоже загружает dll. А где гарантия того, что этот плагин её потом честно выгружает ? Т.е. такому счётчику доверять на 100% нельзя. б) а если пользователю надо сделать fb_shutdown и пофигу сколько раз загружали\выгружали dll ? Уж скорее я буду думать о симметричном вызове fb_initialize и вот он, в паре с fb_shutdown, уже пусть поддерживает счётчик. Хотя, от кривого плагина это тоже не защитит :( ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2014, 12:50 |
|
Странность
|
|||
---|---|---|---|
#18+
hvladИдея не плохая. На первый взгляд. А вот на второй... это тоже не будет работать: а) ты сам приводил пример с плагином, который тоже загружает dll. А где гарантия того, что этот плагин её потом честно выгружает ? Т.е. такому счётчику доверять на 100% нельзя. Счетчик честно считает то, что он и должен считать: количество загрузок и выгрузок. Если плагин не выгружает dll, то, стало быть, ему это не надо, и останется она невыгруженной, только и всего. Сейчас-то даже если и плагин, и хост-приложение честно сделают fb_shutdown и выгрузят dll - это не гарантирует отсутствие проблем. hvladб) а если пользователю надо сделать fb_shutdown и пофигу сколько раз загружали\выгружали dll ? Соответствующий параметр или отдельная функция. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2014, 13:50 |
|
Странность
|
|||
---|---|---|---|
#18+
В случае ошибки Process Monotor выдаёт строчку: Код: plaintext
только он там пытается грузить D:\Firebird\3.0.0.31378\plugins/Engine12, именно с обратным слэшем. А в случае когда проходит успешный коннект, упоминания о Engine12 нет, а есть толко о engine12.dll: Код: plaintext
И ещё почему-то в firebird.log ошибка загрузки не прописалась, хотя она существенная. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2014, 19:04 |
|
Странность
|
|||
---|---|---|---|
#18+
Хм,тоже налетел на: Код: plaintext 1. 2.
Это как то лечится? Через isql пользовать не хочется... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2014, 11:05 |
|
Странность
|
|||
---|---|---|---|
#18+
Gallemarразобрался :) Что было? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2014, 11:40 |
|
|
start [/forum/topic.php?fid=42&fpage=28&tid=1599501]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 332ms |
total: | 485ms |
0 / 0 |