blob: 3fe08e189c9d008255eb90b291ecc0e279765a11 [file] [log] [blame]
/*
* Copyright 2010
* Princeton University. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY PRINCETON UNIVERSITY ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PRINCETON UNIVERSITY OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of Princeton University.
*
*/
/*
* @(#)host_serv.h (Princeton) 11/11/2010
*
*/
#ifndef _HOST_SERV_H_
#define _HOST_SERV_H_
#include <pthread.h>
#include <sys/time.h>
/* host pthread service*/
#define THREAD_TYPE_APP 0
#define THREAD_TYPE_SOCKET 1
#define THREAD_TYPE_RX_TCPIP 2
#define THREAD_TYPE_TX_LINK 3
#define THREAD_TYPE_RX_LINK 4
#define THREAD_TYPE_TIMER 5
typedef struct {
pthread_t ptr;
int id;
int type;
struct timeval last_active_time;
struct timeval last_tcpip_time;
unsigned long long intcpip_time;
unsigned long long active_time;
} thread_wrapper;
/*
* | thread_index | ----> | thread_list |
*/
#define THREAD_LIST_SIZE 256
#define THREAD_INDEX_SIZE 4093 //prime number
extern thread_wrapper thread_list[THREAD_LIST_SIZE];
extern unsigned char thread_index[THREAD_INDEX_SIZE];
extern int uptcpip_thread_count;
extern pthread_mutex_t uptcpip_thread_count_mutex;
extern int host_thread_create(void* (*routine)(void*), void* t_args, int type);
extern int pthread_create_wrapper(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg, int type);
extern int host_thread_get_uptcp_tid();
extern int host_thread_change_type(int type);
extern int host_thread_enter_tcpip_region(int type);
extern int host_thread_exit_tcpip_region(int thread_id);
extern void enter_tcpip_roi();
extern void exit_tcpip_roi();
extern void host_thread_enter_wait_region();
extern void host_thread_exit_wait_region();
/* host time service */
extern int host_usleep(int num);
/* host raw socket service */
#define RAWSOCK_SEND 0
#define RAWSOCK_RECV 1
extern int host_setup_link(int port);
extern int host_connect_link(int port);
int host_link_send(int link_fd, const void * buf, size_t len);
int host_link_recv(int link_fd,void *buf, size_t len);
void* host_malloc(size_t size, int align);
void host_free(void *ptr);
/* lock */
void host_pthread_mutexattr_init();
void* host_pthread_mutex_init(int flag);
void host_pthread_mutex_destory(void* lock);
void host_pthread_mutex_lock(void* lock);
int host_pthread_mutex_trylock(void* lock);
void host_pthread_mutex_unlock(void* lock);
void* host_pthread_rwlock_init();
int host_pthread_rwlock_destory(void* lock);
void host_pthread_rwlock_wlock(void* lock);
void host_pthread_rwlock_wunlock(void* lock);
void host_pthread_rwlock_rlock(void* lock);
void host_pthread_rwlock_runlock(void* lock);
int host_pthread_rwlock_tryrlock(void* lock);
int host_pthread_rwlock_trywlock(void* lock);
void host_pthread_rwlock_unlock(void* lock);
void* host_pthread_cond_init();
void host_pthread_cond_destroy(void* cond);
int host_pthread_cond_wait(void* cond, void* lock);
void host_pthread_cond_signal(void* cond);
void dump_stackframe(int depth);
unsigned short host_shadow_socket_open(unsigned short port);
void host_shadow_socket_close(unsigned short sockfd, unsigned short port);
#endif /* _HOST_SERV_H_ */