Posts

Showing posts with the label C

Notification Chains in Linux Kernel

Notification chains in Linux kernel is a mechanism for the subsystems being informed by the events generated by the other subsystems. In other words, if you are developing a new driver in Linux and you want to listen some events from other driver and handle these events in your own driver, you need to use the Linux's notification chains mechanism. As an example, if you develop a driver and this driver needs to be informed about the net device events such as net device UP, DOWN events, the driver needs to register itself to the net device notifications with the  register_netdevice_notifier function. Similarly, it unregisters itself with the unregister_netdevice_notifier function. These functions are provided by the net device subsystem. The APIs and the data structures of notification chains are defined in the include/linux/notifier.h and  kernel/notifier.c files under linux source code. In this post, I am going to explain how this notification chains mechanism wo...

Intersection of Linked Lists

Image
In some cases 2 linked list can intersect each other. In the following diagram, you see that 2 NULL terminated singly linked lists are intersected at the node 5. In this implementation, we will find in which node the 2 lists are intersecting each other. The function will return the node address. We will use the helper functions form the previous post which add nodes to the lists, print the lists etc... Function which finds the intersection: /* * link_list_intersect() * Finds the intersection node of 2 lists. */ struct node * link_list_intersect ( struct node *list1, struct node *list2) { struct node *long_list; struct node *short_list; int diff = 0 ; /* * Get the lengths of the lists. */ int len1 = list_lenght_get(list1); int len2 = list_lenght_get(list2); /* * Find which list is long and which list is short * and find the absolute lenght difference. */ if (len1 >= len2) { diff = l...

Singly Linked List Implementation

In this post, you will see the implementation of a singly linked list. It is one of the main data structures in computer programming. A singly linked list consists of nodes which are bound to each other with their "next" pointers. A simple node is represented at least 2 fields. A "next" node pointer and a "data" field. /*   * node structure.   */ struct node { struct node *next; int data; }; Some of the basic methods of a linked list and node data structures are implemented below. Create a Node Method: /*   * node_create()   * Creates a node.   */ struct node *node_create( int data) {     struct node *n = malloc( sizeof ( struct node));     if (!n) {         printf( "Unable to allocate memory for node\n" );         return NULL ;     }     n->data = data;     n->next = NULL ; ...