If something like this were actually created, would it
look anything like the file I just attached. I have yet
to put the rest of the headers, etc on... but it
technically should be a working pthread_create()
function as far as I can tell, if I'm not as stupid
as I think I am ;)
-----------------------------
Brad House
Sr. Developer
Main Street Softworks, Inc.
[EMAIL PROTECTED]
(352) 378-8228
-----------------------------
int le_threadid;
int le_pthreadattr;
typedef struct function_params {
zval **function_name;
zval ***args_ptr;
} function_params;
void *call_user_function(void *params)
{
function_params *my_params=params;
zval *retval;
CLS_FETCH();
if (call_user_function_ex(CG(function_table), NULL, *(my_params->function_name),
&retval, 0, my_params->args_ptr, 0) != SUCCESS) {
zend_error(E_ERROR, "Function call failed");
}
return(retval);
}
/* {{{ proto int pthread_create(int pthread_attr, string function_name, args...)
RETURN:
Success: resource id of pthread_t (thread id)
Fail: -1
INPUT:
pthread_attr: resource id for pthread attributes. -1 for none
function_name: php function name to call
args...: all arguments to be passed to function
*/
PHP_FUNCTION(pthread_create)
{
zval **pthread_attr, ***args=NULL;
pthread_t *thread;
pthread_attr_t *attr=NULL;
function_params *my_params;
int argcount;
int ret;
argcount=ZEND_NUM_ARGS();
if (argcount < 2) {
WRONG_PARAM_COUNT;
}
args=(zval ***)emalloc(argcount*sizeof(zval **));
if (zend_get_parameters_array_ex(argcount, args) != SUCCESS) {
free(args);
WRONG_PARAM_COUNT;
}
if ((*args[1])->type != IS_STRING) {
efree(args);
zend_error(E_ERROR, "Function requires string argument");
}
my_params=(function_params *)emalloc(1*sizeof(function_params));
my_params->function_name=args[1];
my_params->args_ptr=args+2;
thread=(pthread_t *)emalloc(1*sizeof(pthread_t));
if (Z_LVAL_PP(args[0]) != -1) {
ZEND_FETCH_RESOURCE(attr, pthread_attr_t *, args[0], -1, "pthread_attribute",
le_pthreadattr);
}
ret=pthread_create(thread, attr, (void *)call_user_function, (void *)my_params);
if (ret != 0) {
efree(my_params);
efree(args);
efree(thread);
RETURN_LONG(-1);
}
ZEND_REGISTER_RESOURCE(return_value, thread, le_thread);
}
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]