Node *createSingleNode(int Num, int NumBlanks) { #if defined(_USE_MALLOC) Node *node = (Node *) malloc(sizeof(Node)); #else Node *node = (Node *) nvm_alloc(sizeof(Node), sll_rgn_id); #endif int num_digits = log10(Num)+1; int len = num_digits+NumBlanks; #if defined(_USE_MALLOC) char* d = (char*) malloc((len+1)*sizeof(char)); #else char* d = (char*) nvm_alloc((len+1)*sizeof(char), sll_rgn_id); #endif NVM_STR2(node->Data, d, sizeof(char*)*8); char *tmp_s = (char *) alloca( (num_digits > NumBlanks ? num_digits+1 : NumBlanks+1)*sizeof(char)); sprintf(tmp_s, "%d", Num); NVM_MEMCPY(node->Data, tmp_s, num_digits); for (int i = 0; i < NumBlanks; ++i) tmp_s[i] = ' '; NVM_MEMCPY(node->Data + num_digits, tmp_s, NumBlanks); NVM_STR2(node->Data[num_digits+NumBlanks], '\0', sizeof(char)*8); return node; }
void initialize() { void * rgn_root = NVM_GetRegionRoot(queue_rgn_id); if (rgn_root) { Q = (queue_t *)rgn_root; Q->head_lock = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(Q->head_lock, NULL); Q->tail_lock = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(Q->tail_lock, NULL); fprintf(stderr, "Found queue at %p\n", Q); traverse(); } else { node_t * node = #if defined(_USE_MALLOC) (node_t *) malloc(sizeof(node_t)); #else (node_t *) nvm_alloc(sizeof(node_t), queue_rgn_id); #endif assert(node); NVM_STR2(node->val, -1, sizeof(int)*8); // dummy value NVM_STR2(node->next, NULL, sizeof(node_t*)*8); #if defined(_USE_MALLOC) Q = (queue_t *) malloc(sizeof(queue_t)); #else Q = (queue_t *) nvm_alloc(sizeof(queue_t), queue_rgn_id); #endif assert(Q); fprintf(stderr, "Created Q at %p\n", Q); Q->head_lock = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(Q->head_lock, NULL); Q->tail_lock = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(Q->tail_lock, NULL); NVM_BEGIN_DURABLE(); NVM_STR2(Q->head, node, sizeof(node_t*)*8); NVM_STR2(Q->tail, node, sizeof(node_t*)*8); NVM_SetRegionRoot(queue_rgn_id, Q); NVM_END_DURABLE(); } }
Node *createSingleNode(int Num, int NumBlanks) { Node *node = (Node *) nvm_alloc(sizeof(Node), sll_rgn_id); int num_digits = log10(Num)+1; int len = num_digits+NumBlanks; char* d = (char*) nvm_alloc((len+1)*sizeof(char), sll_rgn_id); node->Data = d; char *tmp_s = (char *) alloca( (num_digits > NumBlanks ? num_digits+1 : NumBlanks+1)*sizeof(char)); sprintf(tmp_s, "%d", Num); memcpy(node->Data, tmp_s, num_digits); for (int i = 0; i < NumBlanks; ++i) tmp_s[i] = ' '; memcpy(node->Data+num_digits, tmp_s, NumBlanks); node->Data[num_digits+NumBlanks] = '\0'; return node; }
void enqueue(int val) { node_t *node = #if defined(_USE_MALLOC) (node_t *)malloc(sizeof(node_t)); #else (node_t *)nvm_alloc(sizeof(node_t), queue_rgn_id); #endif assert(node); NVM_STR2(node->val, val, sizeof(int) * 8); NVM_STR2(node->next, NULL, sizeof(node_t *) * 8); NVM_LOCK(*(Q->tail_lock)); NVM_STR2(Q->tail->next, node, sizeof(node_t *) * 8); #ifdef _FORCE_FAIL if (val == NUM_ITEMS / 2) exit(0); #endif NVM_STR2(Q->tail, node, sizeof(node_t *) * 8); NVM_UNLOCK(*(Q->tail_lock)); }