AtmiBrokerMem.cxx
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:12k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2008, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <stdarg.h>
  22. #include <iostream>
  23. #include "xatmi.h"
  24. #include "AtmiBrokerMem.h"
  25. #include "AtmiBrokerClient.h"
  26. #include "log4cxx/logger.h"
  27. #include "ThreadLocalStorage.h"
  28. #include "AtmiBrokerEnvXml.h"
  29. log4cxx::LoggerPtr AtmiBrokerMem::logger(log4cxx::Logger::getLogger(
  30. "AtmiBrokerMem"));
  31. SynchronizableObject* AtmiBrokerMem::lock = new SynchronizableObject();
  32. AtmiBrokerMem * AtmiBrokerMem::ptrAtmiBrokerMem = NULL;
  33. AtmiBrokerMem *
  34. AtmiBrokerMem::get_instance() {
  35. LOG4CXX_TRACE(logger, (char*) "get_instance locking");
  36. lock->lock();
  37. LOG4CXX_TRACE(logger, (char*) "get_instance locked");
  38. if (ptrAtmiBrokerMem == NULL)
  39. ptrAtmiBrokerMem = new AtmiBrokerMem();
  40. lock->unlock();
  41. LOG4CXX_TRACE(logger, (char*) "get_instance unlocked");
  42. return ptrAtmiBrokerMem;
  43. }
  44. void AtmiBrokerMem::discard_instance() {
  45. LOG4CXX_TRACE(logger, (char*) "discard_instance locking");
  46. lock->lock();
  47. LOG4CXX_TRACE(logger, (char*) "discard_instance locked");
  48. if (ptrAtmiBrokerMem != NULL) {
  49. delete ptrAtmiBrokerMem;
  50. ptrAtmiBrokerMem = NULL;
  51. }
  52. lock->unlock();
  53. LOG4CXX_TRACE(logger, (char*) "discard_instance unlocked");
  54. }
  55. AtmiBrokerMem::AtmiBrokerMem() {
  56. LOG4CXX_DEBUG(logger, (char*) "constructor");
  57. }
  58. AtmiBrokerMem::~AtmiBrokerMem() {
  59. LOG4CXX_DEBUG(logger, (char*) "destructor assumes you have the lock....");
  60. LOG4CXX_DEBUG(logger, (char*) "memoryInfoVector.size "
  61. << memoryInfoVector.size());
  62. std::vector<MemoryInfo>::iterator it = memoryInfoVector.begin();
  63. while (it != memoryInfoVector.end()) {
  64. MemoryInfo memoryInfo = (*it);
  65. LOG4CXX_DEBUG(logger, (char*) "freeing memoryPtr");
  66. if (memoryInfo.memoryPtr != NULL) {
  67. LOG4CXX_DEBUG(logger, (char*) "freeing memoryPtr");
  68. free(memoryInfo.memoryPtr);
  69. }
  70. if (memoryInfo.type != NULL) {
  71. LOG4CXX_DEBUG(logger, (char*) "freeing type");
  72. free(memoryInfo.type);
  73. }
  74. if (memoryInfo.subtype != NULL) {
  75. LOG4CXX_DEBUG(logger, (char*) "freeing subtype");
  76. free(memoryInfo.subtype);
  77. }
  78. LOG4CXX_DEBUG(logger, (char*) "freed memory");
  79. LOG4CXX_DEBUG(logger, (char*) "removing  from vector");
  80. it = memoryInfoVector.erase(it);
  81. LOG4CXX_DEBUG(logger, (char*) "removed from vector ");
  82. }
  83. memoryInfoVector.clear();
  84. LOG4CXX_TRACE(logger, (char*) "freeAllMemory unlocked");
  85. }
  86. char*
  87. AtmiBrokerMem::tpalloc(char* type, char* subtype, long size,
  88. bool serviceAllocated) {
  89. char* toReturn = NULL;
  90. LOG4CXX_TRACE(logger, (char*) "tpalloc locking");
  91. lock->lock();
  92. LOG4CXX_TRACE(logger, (char*) "tpalloc locked");
  93. if (!type) {
  94. LOG4CXX_ERROR(logger, (char*) "tpalloc - no type");
  95. setSpecific(TPE_KEY, TSS_TPEINVAL);
  96. } else if ((strncmp(type, "X_COMMON", MAX_TYPE_SIZE) == 0 || strncmp(type,
  97. "X_C_TYPE", MAX_TYPE_SIZE) == 0) && !subtype) {
  98. LOG4CXX_ERROR(logger, (char*) "tpalloc - no subtype");
  99. setSpecific(TPE_KEY, TSS_TPEINVAL);
  100. } else if ((strncmp(type, "X_COMMON", MAX_TYPE_SIZE) == 0 || strncmp(type,
  101. "X_C_TYPE", MAX_TYPE_SIZE) == 0) && buffers[subtype] == NULL) {
  102. LOG4CXX_ERROR(logger, (char*) "tpalloc - unknown buffer type: "
  103. << subtype);
  104. setSpecific(TPE_KEY, TSS_TPEINVAL);
  105. } else if (size < 0) {
  106. LOG4CXX_ERROR(logger, (char*) "tpalloc - negative size");
  107. setSpecific(TPE_KEY, TSS_TPEINVAL);
  108. } else if (strncmp(type, "X_OCTET", 8) == 0 && size == 0) {
  109. LOG4CXX_ERROR(logger, (char*) "tpalloc - buffer type requires size");
  110. setSpecific(TPE_KEY, TSS_TPEINVAL);
  111. } else if (strncmp(type, "X_OCTET", MAX_TYPE_SIZE) != 0 && strncmp(type,
  112. "X_COMMON", MAX_TYPE_SIZE) != 0 && strncmp(type, "X_C_TYPE",
  113. MAX_TYPE_SIZE) != 0) {
  114. LOG4CXX_ERROR(logger, (char*) "tpalloc DONT YET know type: " << type);
  115. setSpecific(TPE_KEY, TSS_TPENOENT);
  116. } else {
  117. if (strcmp(type, "X_OCTET") == 0) {
  118. LOG4CXX_DEBUG(logger, (char*) "tpalloc character array ");
  119. subtype = (char*) "";
  120. } else if (strcmp(type, "X_COMMON") == 0 || strcmp(type, "X_C_TYPE")
  121. == 0) {
  122. if (!serviceAllocated && size != 0) {
  123. LOG4CXX_WARN(logger,
  124. (char*) "tpalloc - X_C_TYPE/X_COMMON size should be 0");
  125. }
  126. LOG4CXX_DEBUG(logger, (char*) "tpalloc X_C_TYPE/X_COMMON");
  127. size = buffers[subtype]->memSize;
  128. }
  129. LOG4CXX_DEBUG(logger, (char*) "tpalloc - type: subtype: size:" << type
  130. << ":" << subtype << ":" << size);
  131. MemoryInfo memoryInfo;
  132. LOG4CXX_TRACE(logger, (char*) "tpalloc - created memoryInfo");
  133. memoryInfo.memoryPtr = (char*) malloc(size);
  134. memoryInfo.size = size;
  135. memset(memoryInfo.memoryPtr, '', memoryInfo.size);
  136. LOG4CXX_TRACE(logger, (char*) "tpalloc - sized: " << size);
  137. memoryInfo.type = (char*) malloc(MAX_TYPE_SIZE + 1);
  138. memset(memoryInfo.type, '', MAX_TYPE_SIZE + 1);
  139. LOG4CXX_TRACE(logger, (char*) "type prep");
  140. strncpy(memoryInfo.type, type, MAX_TYPE_SIZE);
  141. LOG4CXX_TRACE(logger, (char*) "tpalloc - copied type/"
  142. << memoryInfo.type << "/");
  143. memoryInfo.subtype = (char*) malloc(MAX_SUBTYPE_SIZE + 1);
  144. memset(memoryInfo.subtype, '', MAX_SUBTYPE_SIZE + 1);
  145. strncpy(memoryInfo.subtype, subtype, MAX_SUBTYPE_SIZE);
  146. LOG4CXX_TRACE(logger, (char*) "tpalloc - copied subtype/"
  147. << memoryInfo.subtype << "/");
  148. memoryInfo.forcedDelete = serviceAllocated;
  149. LOG4CXX_DEBUG(
  150. logger,
  151. (char*) "adding MemoryInfo: with type: with subtype: with size: to vector"
  152. << memoryInfo.type << ":" << memoryInfo.subtype << ":"
  153. << memoryInfo.size);
  154. memoryInfoVector.push_back(memoryInfo);
  155. LOG4CXX_DEBUG(logger, (char*) "added MemoryInfo to vector: "
  156. << memoryInfoVector.size());
  157. toReturn = (char*) memoryInfo.memoryPtr;
  158. }
  159. lock->unlock();
  160. LOG4CXX_TRACE(logger, (char*) "tpalloc unlocked");
  161. return toReturn;
  162. }
  163. char* AtmiBrokerMem::tprealloc(char * addr, long size, char* type,
  164. char* subtype, bool force) {
  165. char* toReturn = NULL;
  166. LOG4CXX_TRACE(logger, (char*) "tprealloc locking");
  167. lock->lock();
  168. LOG4CXX_TRACE(logger, (char*) "tprealloc locked");
  169. if (!addr) {
  170. LOG4CXX_ERROR(logger, (char*) "tprealloc - no buffer");
  171. setSpecific(TPE_KEY, TSS_TPEINVAL);
  172. } else if (size < 0) {
  173. LOG4CXX_ERROR(logger, (char*) "tprealloc - negative size");
  174. setSpecific(TPE_KEY, TSS_TPEINVAL);
  175. } else if (size == 0) {
  176. LOG4CXX_ERROR(logger, (char*) "tprealloc - requires positive size");
  177. setSpecific(TPE_KEY, TSS_TPEINVAL);
  178. } else {
  179. LOG4CXX_DEBUG(logger, (char*) "tprealloc hunting " << size);
  180. for (std::vector<MemoryInfo>::iterator it = memoryInfoVector.begin(); it
  181. != memoryInfoVector.end(); it++) {
  182. LOG4CXX_TRACE(logger, (char*) "next memoryInfo id is with size: "
  183. << (*it).size);
  184. if ((force == false) && (strncmp((*it).type, "X_COMMON",
  185. MAX_TYPE_SIZE) == 0 || strncmp((*it).type, "X_C_TYPE",
  186. MAX_TYPE_SIZE) == 0)) {
  187. LOG4CXX_WARN(
  188. logger,
  189. (char*) "tprealloc - cannot resize a X_C_TYPE/X_COMMON buffer");
  190. break;
  191. } else if ((*it).memoryPtr == addr) {
  192. LOG4CXX_DEBUG(logger, (char*) "found matching memory with size"
  193. << (*it).size);
  194. char* memPtr = (char*) realloc((void*) addr, size);
  195. (*it).memoryPtr = memPtr;
  196. (*it).size = size;
  197. memset((*it).memoryPtr, '', (*it).size);
  198. toReturn = memPtr;
  199. if (type != NULL) {
  200. free((*it).type);
  201. (*it).type = (char*) malloc(MAX_TYPE_SIZE + 1);
  202. memset((*it).type, '', MAX_TYPE_SIZE + 1);
  203. LOG4CXX_TRACE(logger, (char*) "type prep");
  204. strncpy((*it).type, type, MAX_TYPE_SIZE);
  205. LOG4CXX_TRACE(logger, (char*) "tpalloc - copied type/"
  206. << (*it).type << "/");
  207. }
  208. if (subtype != NULL) {
  209. free((*it).subtype);
  210. (*it).subtype = (char*) malloc(MAX_SUBTYPE_SIZE + 1);
  211. memset((*it).subtype, '', MAX_SUBTYPE_SIZE + 1);
  212. strncpy((*it).subtype, subtype, MAX_SUBTYPE_SIZE);
  213. LOG4CXX_TRACE(logger, (char*) "tpalloc - copied subtype/"
  214. << (*it).subtype << "/");
  215. }
  216. LOG4CXX_DEBUG(logger, (char*) "updated - size: " << size);
  217. break;
  218. }
  219. }
  220. if (toReturn == NULL) {
  221. LOG4CXX_TRACE(logger, (char*) "tprealloc - not found addr");
  222. setSpecific(TPE_KEY, TSS_TPEINVAL);
  223. LOG4CXX_TRACE(logger, (char*) "tprealloc - failure advised");
  224. }
  225. }
  226. lock->unlock();
  227. LOG4CXX_TRACE(logger, (char*) "tprealloc unlocked");
  228. return toReturn;
  229. }
  230. void AtmiBrokerMem::tpfree(char* ptr, bool force) {
  231. bool found = false;
  232. LOG4CXX_TRACE(logger, (char*) "tpfree locking");
  233. lock->lock();
  234. LOG4CXX_TRACE(logger, (char*) "tpfree locked");
  235. if (ptr && ptr != NULL) {
  236. LOG4CXX_DEBUG(logger, (char*) "tpfree: " << memoryInfoVector.size());
  237. for (std::vector<MemoryInfo>::iterator it = memoryInfoVector.begin(); it
  238. != memoryInfoVector.end(); it++) {
  239. // LOG4CXX_TRACE(logger, (char*) "next memoryInfo id is: "
  240. // << (char*) (*it).memoryPtr);
  241. if ((*it).memoryPtr == NULL) {
  242. LOG4CXX_ERROR(logger, (char*) "found a null in the vector");
  243. break;
  244. }
  245. MemoryInfo memoryInfo = (*it);
  246. if (memoryInfo.memoryPtr == ptr) {
  247. if (!memoryInfo.forcedDelete || (memoryInfo.forcedDelete
  248. && force)) {
  249. LOG4CXX_DEBUG(logger,
  250. (char*) "freeing memoryPtr to reclaim: "
  251. << memoryInfo.size);
  252. free(memoryInfo.memoryPtr);
  253. if (memoryInfo.type != NULL) {
  254. LOG4CXX_DEBUG(logger, (char*) "freeing type");
  255. free(memoryInfo.type);
  256. }
  257. if (memoryInfo.subtype != NULL) {
  258. LOG4CXX_DEBUG(logger, (char*) "freeing subtype");
  259. free(memoryInfo.subtype);
  260. }
  261. LOG4CXX_DEBUG(logger, (char*) "freed memory");
  262. LOG4CXX_DEBUG(logger, (char*) "removing  from vector");
  263. memoryInfoVector.erase(it);
  264. LOG4CXX_DEBUG(logger, (char*) "removed from vector ");
  265. found = true;
  266. break;
  267. } else {
  268. LOG4CXX_DEBUG(logger,
  269. (char*) "tpfree without force ignored");
  270. }
  271. }
  272. }
  273. LOG4CXX_DEBUG(logger, (char*) "tpfreed: " << memoryInfoVector.size());
  274. }
  275. LOG4CXX_TRACE(logger, (char*) "tpfree unlocking");
  276. lock->unlock();
  277. LOG4CXX_TRACE(logger, (char*) "tpfree unlocked");
  278. return;
  279. }
  280. long AtmiBrokerMem::tptypes(char* ptr, char* type, char* subtype) {
  281. LOG4CXX_TRACE(logger, (char*) "tptypes locking");
  282. lock->lock();
  283. LOG4CXX_TRACE(logger, (char*) "tptypes locked");
  284. long toReturn = -1;
  285. if (ptr && ptr != NULL) {
  286. LOG4CXX_DEBUG(logger, (char*) "ptr appeared valid");
  287. for (std::vector<MemoryInfo>::iterator it = memoryInfoVector.begin(); it
  288. != memoryInfoVector.end(); it++) {
  289. LOG4CXX_TRACE(logger, (char*) "next memoryInfo is with size: "
  290. << (*it).size);
  291. if ((*it).memoryPtr == ptr) {
  292. MemoryInfo memoryInfo = (*it);
  293. LOG4CXX_DEBUG(logger, (char*) "found matching memory");
  294. if (type && type != NULL) {
  295. strncpy(type, memoryInfo.type, MAX_TYPE_SIZE);
  296. }
  297. if (subtype && subtype != NULL) {
  298. strncpy(subtype, memoryInfo.subtype, MAX_SUBTYPE_SIZE);
  299. }
  300. toReturn = memoryInfo.size;
  301. break;
  302. }
  303. }
  304. }
  305. if (toReturn == -1) {
  306. // WAS NOT FOUND
  307. LOG4CXX_TRACE(logger, (char*) "notifying could not found");
  308. setSpecific(TPE_KEY, TSS_TPEINVAL);
  309. }
  310. LOG4CXX_TRACE(logger, (char*) "tptypes unlocking");
  311. lock->unlock();
  312. LOG4CXX_TRACE(logger, (char*) "tptypes unlocked");
  313. return toReturn;
  314. }