2. Calsoft Hyderabad
Role |
Senior Software Engineer |
Profile |
DPDK, C & Python |
2.1. Round 1
Date |
2024-01-18T11:18:51+0530 |
/**
* Calsoft Hyderabad
* =================
*
* Senior Software Engineer
* DPDK: C & Python
* Round 1
* 2024-01-18T11:18:51+0530
*/
#include <stdio.h>
int main(int argc, char *argv[])
{
char *p = "abc";
p[0] = 'c';
printf("%c\n", *p);
return 0;
}
typedef struct Node {
int data;
struct Node *next;
} List;
List *reverse_list(List *head)
{
List *curr = head, *prev = NULL, *next = NULL;
while (curr->next) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return curr;
}
char mem[1024];
typedef struct memblock {
size_t size;
bool is_free;
void *ptr;
} MemBlocks;
void *my_malloc(size_t size)
{
if (!size) return NULL;
MemBlocks blocks[10];
for (int i = 0; i < 10; i++) {
if (blocks[i].is_free) {
blocks.size = size;
// handle mem overflow
blocks.ptr = mem + i * size;
return blocks.ptr;
}
}
return NULL;
}
2.2. Round 2-4 (3 hours)
Date |
2024-02-16T03:00:51+0530 |
// calsoft round 2
struct A {
int a;
int b;
int c;
}
static inline size_t
get_offset_of(int mem)
{
return ((struct A *)-((struct A *)->mem));
}
// custom malloc to return 128 byte aligned pointer to memory
static const int sys_mem_align = 128;
static const int sys_mem_buf[10000 * sys_mem_align];
typedef struct memblock {
size_t size;
bool is_free;
void *ptr;
} MemBlocks;
void *my_malloc(size_t size)
{
if (!size) return NULL;
MemBlocks 8blocks [1000];
MemBlocks 16blocks [1000];
for (int i = 0; i < 1000; i++) {
if (blocks[i].is_free) {
blocks.size = size;
// allocate a block from memory
void *tmp = sys_mem_buf + i * size;
// align the block to system memory alignment requirements
size_t pdiff = tmp / sys_mem_align;
if (!pdiff)
blocks.ptr = tmp;
else
blocks.ptr = tmp + pdiff;
blocks[i].is_free = FALSE;
return blocks.ptr;
}
}
return NULL;
}
/*
z = 0x1122 3344 5566 7788
x = 0x7788 5566 3344 1122
*/
void swap(uchar16_t *p1, uchar16_t *p2)
{
uchar16_t t = *p1;
*p1 = *p2;
*p2 = t;
}
size_t swap_2b(size_t z)
{
int end = sizeof(z);
int begin = 0;
while (begin < end) {
swap(&z + begin, &z + end);
begin += 2;
end -= 2;
}
return z;
}
void swap(uchar8_t *p1, uchar8_t *p2)
{
uchar8_t t = *p1;
*p1 = *p2;
*p2 = t;
}
size_t swap_2b(size_t z)
{
char *begin = &z;
char *end = begin + sizeof(z);
while (begin < end) {
for (int i = 0; i < 2; i++)
swap((begin + i + 1, end - i - 1);
begin += 2;
end -= 2;
}
return z;
}
size_t *ptr = 16;
ptr = ptr + 4;
// ptr + (4 * sizeof(size_t))