Changeset babe786 in mainline


Ignore:
Timestamp:
2006-05-15T11:51:28Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
043dcc27
Parents:
52352ec
Message:

Simple registration of services at NS.

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • libadt/include/hash_table.h

    r52352ec rbabe786  
    3030#define __HASH_TABLE_H__
    3131
    32 #include <list.h>
     32#include <libadt/list.h>
    3333#include <unistd.h>
    3434
  • ns/Makefile

    r52352ec rbabe786  
    3131
    3232LIBC_PREFIX = ../libc
     33LIBADT_PREFIX = ../libadt
    3334LIBIPC_PREFIX = ../libipc
    3435SOFTINT_PREFIX = ../softint
     
    3738CFLAGS += -I../libipc/include
    3839
    39 LIBS = $(LIBIPC_PREFIX)/libipc.a $(LIBC_PREFIX)/libc.a
     40LIBS = $(LIBADT_PREFIX)/libadt.a $(LIBIPC_PREFIX)/libipc.a $(LIBC_PREFIX)/libc.a
    4041
    4142## Sources
  • ns/ns.c

    r52352ec rbabe786  
     1/*
     2 * Copyright (C) 2006 Ondrej Palkovsky
     3 * All rights reserved.
     4 *
     5 * Redistribution and use in source and binary forms, with or without
     6 * modification, are permitted provided that the following conditions
     7 * are met:
     8 *
     9 * - Redistributions of source code must retain the above copyright
     10 *   notice, this list of conditions and the following disclaimer.
     11 * - Redistributions in binary form must reproduce the above copyright
     12 *   notice, this list of conditions and the following disclaimer in the
     13 *   documentation and/or other materials provided with the distribution.
     14 * - The name of the author may not be used to endorse or promote products
     15 *   derived from this software without specific prior written permission.
     16 *
     17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 */
     28
     29/**
     30 * @file        ns.c
     31 * @brief       Naming service for HelenOS IPC.
     32 */
     33
    134#include <ipc.h>
    235#include <stdio.h>
     
    538#include <ns.h>
    639#include <errno.h>
     40#include <assert.h>
     41#include <libadt/list.h>
     42#include <libadt/hash_table.h>
     43
     44#define NAME    "NS"
     45
     46#define NS_HASH_TABLE_CHAINS    20
     47
     48/* Static functions implementing NS hash table operations. */
     49static hash_index_t ns_hash(unsigned long *key);
     50static int ns_compare(unsigned long *key, hash_count_t keys, link_t *item);
     51
     52/** Operations for NS hash table. */
     53static hash_table_operations_t ns_hash_table_ops = {
     54        .hash = ns_hash,
     55        .compare = ns_compare,
     56        .remove_callback = NULL
     57};
     58
     59/** NS hash table structure. */
     60static hash_table_t ns_hash_table;
     61
     62/** NS hash table item. */
     63typedef struct {
     64        link_t link;
     65        ipcarg_t service;               /**< Number of the service. */
     66        ipcarg_t phone;                 /**< Phone registered with the service. */
     67} hashed_service_t;
     68
    769/*
    870irq_cmd_t msim_cmds[1] = {
     
    2688*/
    2789
    28 static int service;
     90
     91int static ping_phone;
    2992
    3093int main(int argc, char **argv)
     
    3699        ipcarg_t retval, arg1, arg2;
    37100
    38         printf("NS:Name service started.\n");
     101        printf("%s: Name service started.\n", NAME);
     102       
     103        if (!hash_table_create(&ns_hash_table, NS_HASH_TABLE_CHAINS, 1, &ns_hash_table_ops)) {
     104                printf("%s: cannot create hash table\n", NAME);
     105                return ENOMEM;
     106        }
     107       
     108       
    39109//      ipc_register_irq(2, &msim_kbd);
    40110//      ipc_register_irq(1, &i8042_kbd);
    41111        while (1) {
    42112                callid = ipc_wait_for_call(&call, 0);
    43                 printf("NS:Call phone=%lX..", call.phoneid);
     113                printf("NS: Call phone=%lX...", call.phoneid);
    44114                switch (IPC_GET_METHOD(call)) {
    45115                case IPC_M_AS_SEND:
     
    61131                        retval = 0;
    62132                        break;
    63                 case IPC_M_CONNECT_TO_ME:
    64                         printf("Somebody connecting phid=%zd.\n", IPC_GET_ARG3(call));
    65                         service = IPC_GET_ARG3(call);
     133                case IPC_M_CONNECT_TO_ME:;
     134                        /*
     135                         * Request for registration of a service.
     136                         */
     137                        ipcarg_t service;
     138                        ipcarg_t phone;
     139                        hashed_service_t *hs;
     140                       
     141                        service = IPC_GET_ARG1(call);
     142                        phone = IPC_GET_ARG3(call);
     143                        printf("Registering service %d on phone %d...", service, phone);
     144                       
     145                        hs = (hashed_service_t *) malloc(sizeof(hashed_service_t));
     146                        if (!hs) {
     147                                printf("Failed to register service %d.\n", service);
     148                        }
     149                       
     150                        link_initialize(&hs->link);
     151                        hs->service = service;
     152                        hs->phone = phone;
     153                        hash_table_insert(&ns_hash_table, (unsigned long *) &service, &hs->link);
     154                       
     155                        ping_phone = phone;
    66156                        retval = 0;
    67157                        break;
     
    83173                        break;
    84174                case NS_PING_SVC:
    85                         printf("NS:Pinging service %d\n", service);
    86                         ipc_call_sync(service, NS_PING, 0xbeef, 0);
     175                        printf("NS:Pinging service %d\n", ping_phone);
     176                        ipc_call_sync(ping_phone, NS_PING, 0xbeef, 0);
    87177                        printf("NS:Got pong\n");
    88178                        break;
     
    93183                }
    94184                if (! (callid & IPC_CALLID_NOTIFICATION)) {
    95                         printf("Answerinh\n");
     185                        printf("Answering.\n");
    96186                        ipc_answer(callid, retval, arg1, arg2);
    97187                }
    98188        }
    99189}
     190
     191/** Compute hash index into NS hash table.
     192 *
     193 * @param key Pointer to single key (i.e. service number).
     194 * @return Hash index corresponding to *key.
     195 */
     196hash_index_t ns_hash(unsigned long *key)
     197{
     198        assert(key);
     199        return *key % NS_HASH_TABLE_CHAINS;
     200}
     201
     202/** Compare a key with hashed item.
     203 *
     204 * @param key Single key pointer.
     205 * @param keys Must be 1.
     206 * @param item Pointer to a hash table item.
     207 * @return Non-zero if the key matches the item, zero otherwise.
     208 */
     209int ns_compare(unsigned long *key, hash_count_t keys, link_t *item)
     210{
     211        hashed_service_t *hs;
     212
     213        assert(key);
     214        assert(keys == 1);
     215        assert(item);
     216       
     217        hs = hash_table_get_instance(item, hashed_service_t, link);
     218       
     219        return *key == hs->service;
     220}
  • pci/Makefile

    r52352ec rbabe786  
    3737CFLAGS += -I../libipc/include
    3838
    39 LIBS = libpci/libpci.a $(LIBC_PREFIX)/libc.a
     39LIBS = libpci/libpci.a $(LIBIPC_PREFIX)/libipc.a $(LIBC_PREFIX)/libc.a
    4040
    4141## Sources
  • pci/pci.c

    r52352ec rbabe786  
    1414#include <task.h>
    1515#include <stdlib.h>
     16#include <ipc.h>
     17#include <errno.h>
    1618
    1719#include "libpci/pci.h"
     
    1921#define PCI_CONF1       0xcf8
    2022#define PCI_CONF1_SIZE  8
     23
     24#define NAME            "PCI"
    2125
    2226int main(int argc, char *argv[])
     
    2731        char buf[80];
    2832
    29         printf("HelenOS PCI driver\n");
     33        int ipc_res;
     34        ipcarg_t ns_phone_addr;
     35
     36        printf("%s: HelenOS PCI driver\n", NAME);
    3037
    3138        /*
     
    4855        pci_cleanup(pacc);            /* Close everything */
    4956
     57        printf("%s: registering at naming service.\n", NAME);
     58        if (ipc_connect_to_me(PHONE_NS, 40, 70, &ns_phone_addr) != 0) {
     59                printf("Failed to register %s at naming service.\n", NAME);
     60                return -1;
     61        }
     62       
     63        printf("%s: accepting connections\n", NAME);
     64        while (1) {
     65                ipc_call_t call;
     66                ipc_callid_t callid;
     67               
     68                callid = ipc_wait_for_call(&call, 0);
     69                ipc_answer(callid, EHANGUP, 0, 0);
     70        }
    5071        return 0;
    5172}
Note: See TracChangeset for help on using the changeset viewer.