blob: 566a6045d4e40a00f57f4463bbf2718b3e1f726c [file]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* etchpool.h -- threads and thread pool
*/
#ifndef ETCHPOOL_H
#define ETCHPOOL_H
#include "apr_thread_proc.h"
#include "apr_atomic.h"
#include "etchobj.h"
#include "etchmutex.h"
#include "etch_arraylist.h"
#define ETCH_THREADSTATE_INITIAL 0
#define ETCH_THREADSTATE_STARTED 4
#define ETCH_THREADSTATE_STOPPING 7
#define ETCH_THREADSTATE_STOPPED 8
#define ETCH_THREADSTATE_DEFUNCT 9
#define ETCH_DEFAULT_POOLTHREADS 4
#define ETCH_THREADPARAMS_SIGNATURE 0xcafef00d
unsigned thread_id_farm;
unsigned next_etch_threadid();
int etch_apr_init();
apr_pool_t* etch_apr_mempool;
apr_pool_t* get_etch_aprpool();
etchmutex* loglock;
struct etch_threadpool;
struct etch_thread;
int etch_init_static_mutex(etchmutex*, const int is_nestable);
typedef struct etch_thread etch_thread;
typedef struct etch_threadpool etch_threadpool;
/** signature of a thread procedure */
typedef void (*etch_threadproc) (void*);
/** signature of a thread procedure callback */
typedef int (*etch_thread_callback) (void*);
/** interface to run a pool thread */
typedef void* (*etch_run) (struct etch_threadpool*, etch_threadproc, void*);
/*
for reference, here are the APR thread structs. the content is ordinarily
not addressable, getters and setters are defined instead. however not all
content has a getter.
struct apr_thread_t
{
apr_pool_t *pool;
HANDLE td;
apr_int32_t cancel;
apr_int32_t cancel_how;
void *data;
apr_thread_start_t func;
apr_status_t exitval;
};
struct apr_threadattr_t
{
apr_pool_t *pool;
apr_int32_t detach;
apr_size_t stacksize;
};
*/
/**
* etch_apr_threaddata
* thread parameters specific to the apache portable runtime.
* this object memory is always managed by the caller, regardless of
* thread params is_xxxx configuration.
*/
typedef struct etch_apr_threaddata
{
apr_pool_t* mempool;
apr_thread_t* thread;
apr_threadattr_t* threadattr;
unsigned char threadstate;
unsigned char is_dedicated_mempool;
} etch_apr_threaddata;
/**
* etch_threadparams
* parameters to any thread start.
* an internal threadproc invokes the user threadproc,
* so we supply this object to the internal threadproc as data.
*/
typedef struct etch_threadparams
{
unsigned int signature; /* thread params sig */
int etch_thread_id; /* our sequential ID */
etch_threadproc threadproc; /* user thread proc */
etch_thread_callback on_start; /* thread start hook */
etch_thread_callback on_exit; /* thread exit hook */
etch_apr_threaddata* libdata; /* thread library data*/
etch_threadpool* etchpool; /* thread pool if any */
etch_thread* etchobj; /* etch_thread object */
etchwait* waitobj; /* post-start waiter */
void* data; /* actual thread data */
unsigned char is_own_data; /* does thread own data */
unsigned char is_data_etchobject; /* is destroy() in play */
unsigned char threadstate; /* current start state */
unsigned char unused;
} etch_threadparams;
/**
* etch_thread: thread object
*/
typedef struct etch_thread
{
unsigned int hashkey;
unsigned short obj_type;
unsigned short class_id;
struct objmask* vtab;
int (*destroy)(void*);
void*(*clone) (void*);
obj_gethashkey get_hashkey;
struct objmask* parent;
etchresult* result;
unsigned int refcount;
unsigned int length;
unsigned char is_null;
unsigned char is_copy;
unsigned char is_static;
unsigned char is_joined;
int (*start) (void*);
int (*stop) (void*);
etch_threadparams params;
etch_apr_threaddata aprdata;
etchwait* waiter;
etchmutex* objlock;
} etch_thread;
/**
* etch_threadpool: thread pool object
*/
typedef struct etch_threadpool
{
unsigned int hashkey;
unsigned short obj_type;
unsigned short class_id;
struct objmask* vtab;
int (*destroy)(void*);
void*(*clone) (void*);
obj_gethashkey get_hashkey;
struct objmask* parent;
etchresult* result;
unsigned int refcount;
unsigned int length;
unsigned char is_null;
unsigned char is_copy;
unsigned char is_static;
unsigned char reserved;
etch_run run;
etchmutex* pool_lock;
/* to do: embed underlying queued threadpool here, such as APR pool */
etch_arraylist* threadlist;
etchmutex* threadlist_lock;
unsigned int threadpool_id;
int (*count) (); /* implementation should return threadlist.count */
unsigned char pooltype; /* queued or free */
unsigned char is_defunct; /* is pool forcibly destroying threads */
unsigned char is_iterating; /* is pool currently being iterated */
unsigned char is_free_data; /* will thread free its data memory */
unsigned char is_free_threads; /* is poolthread memory freed */
unsigned char is_data_etchobject; /* can thread call destroy() on data */
unsigned char is_manual_start; /* is explicit thread.start() required */
unsigned char unused;
} etch_threadpool;
/*
* global free thread pool
*/
etch_threadpool* global_free_threadpool;
etch_threadpool* etch_glopool();
int etch_glopool_exit();
unsigned short etch_threadpool_id_farm;
#define ETCH_HAS_QUEUED_THREADPOOL (0)
etch_threadpool* new_threadpool(const unsigned pooltype, const int initsize);
etch_thread* new_thread (etch_threadproc, void*);
etch_thread* threadpool_remove_entry (etch_threadpool*, const int thread_id);
etch_thread* threadpool_thread (etch_threadpool*, const int i);
int threadpool_waitfor_all(etch_threadpool*, const int is_cancel);
int threadpool_remove (etch_threadpool*, const int id);
int destroy_threadpool(etch_threadpool*);
void etch_init_threadparams (etch_threadparams*);
int etch_createthread (etch_threadparams*);
int etch_thread_join (etch_threadparams*);
int etch_thread_cancel(etch_thread*);
int etch_thread_stop (etch_thread*);
int etch_join(etch_thread*);
void etch_thread_yield ();
int etch_on_threadstart(void*);
int etch_on_threadexit (void*);
size_t etch_get_threadid (void* threadstruct);
void etch_sleep(const int ms);
#endif /* #ifndef ETCHPOOL_H */